用于生成和验证vouchers PHP 库。我们不对存储做任何假设,而是提供可以容纳任意数量vouchers
的Bags
的概念。这些包可以验证vouchers 、生成新vouchers并在整个集合中应用验证规则。
composer require alancole/ vouchers
$ model = new vouchers Voucher Model ([
' owner ' => [
' required ' => true ,
' immutable ' => true ,
],
' claimed_by ' => [
' required ' => true ,
]
]);
$ collection = new vouchers Bag ( $ model );
$ collection -> fill ( 1000 );
$ voucher = $ collection -> pick ();
print $ voucher ; // FHUW-JSUJ-KSIQ-JDUI
vouchers几乎可以采用任何形式,但是您可以使用vouchers VoucherModel
来强制验证和结构。唯一必需的属性是默认情况下不可变的code
。
$ voucher = new vouchers Voucher ();
print $ voucher ; // ABCD-EFGH-IJKL
您还可以将数组传递给凭证以将预先存在的值设置为凭证。将验证匹配字段(包括code
)。
$ voucher = new Voucher ([ ' code ' => ' ALAN-COLE-CODE ' , ' claimed_by ' => '' , ' claimed_on ' => '' ]);
print $ voucher ; // "ALAN-COLE-CODE"
可以使用凭证上的get()
和set()
来获取和设置凭证创建时传递的任何值。
$ voucher -> set ( ' owner ' , ' Alan ' );
echo $ voucher -> get ( ' owner ' ); // Alan
通过创建模型,您可以对创建或加载的vouchers设置默认值和验证。模型作为数组传递到vouchers VoucherModel
$ model = new vouchers Voucher Model ([
' owner ' => [
' required ' => true ,
' immutable ' => true ,
],
' claimed_by ' => [
' required ' => true ,
]
]);
如果将凭证属性设置为immutable
,则Voucher
将引发ImmutableData
异常。
您可以更改模型上的设置生成器生成代码的方式。生成器必须实现vouchers VoucherCodeGeneratorInterface
namespace My Voucher Generator ;
use vouchers Voucher Code Interface as Generator ;
class MyCode implements Generator
{
public function part ()
{
return bin2hex ( openssl_random_pseudo_bytes ( 2 ));
}
public function generate ()
{
return strtoupper ( sprintf ( " %s-%s-%s " , $ this -> part (), $ this -> part (), $ this -> part ()));
}
public function validate ()
{
return true ;
}
}
然后告诉模型使用这个生成器。
$ model = new vouchers Voucher Model ([
' code ' => [
' generator ' => My Voucher Generator MyCode::class
]
]);
袋子充当vouchers的集合,并允许您对整套凭证进行验证。 Bags 还可以充当vouchers的选择器,允许您随机选择优惠券并对该选择执行规则。包也是Iterable
,因此可以在循环中使用。
$ collection = new vouchers Bag ();
$ collection -> fill ( 1000 );
foreach ( $ collection as $ voucher ) {
print $ voucher ;
}
您可以使用vouchers VoucherModel
通过将模型作为构造时的第一个属性传递来对包中的所有项目强制使用模型。
$ collection = new vouchers Bag ( $ model );
您可以使用add()
用现有vouchers填充模型 add 将仅接受vouchers Voucher
的实例
$ vouchers = [ $ voucher1 . . . $ voucher100 ];
foreach ( $ vouchers as $ voucher ) {
$ collection -> add ( new vouchers Voucher ( $ voucher ));
}
您还可以在任何阵列上运行映射,将退货映射为包中的新vouchers 。如果您需要转换数据以适应模型,这会很方便。
$ collection -> map ( $ vouchers , function ( $ voucher ) {
return new vouchers Voucher ( $ voucher );
});
您可以通过代码获取优惠券,可用于查看优惠券是否存在。
$ collection = new vouchers Bag ();
$ voucher = new vouchers Voucher ([ ' code ' => ' special-voucher ' ]);
$ collection -> add ( $ voucher );
$ v = $ collection -> find ( " special-voucher " );
if ( $ v ) {
print ( string ) $ v ;
} else {
print " Voucher does not exist. " ;
}
您可以通过在任何包上使用pick()
来让包随机为您挑选一张代金券。
$ collection = new vouchers Bag ();
$ collection -> fill ( 1000 );
$ collection -> pick ();
如果您希望验证选择,您可以传递一个回调来 pick ,该回调将运行直到返回true
或抛出vouchers ExceptionsNoValid vouchers
异常。
$ collection -> pick ( function ( $ voucher ) {
return ( bool ) $ voucher -> owner == " Alan " ;
});
try {
$ collection -> pick ( function ( $ voucher ) {
return 2 == 1 ;
});
} catch ( Exception $ e ) {
print $ e -> getMessage ();
}
您还可以要求pick()
检查此包可能具有的所有验证器(请参阅验证)并仅返回有效的凭证。如果没有找到凭证,这将再次抛出vouchers ExceptionsNoValid vouchers
。
$ collection -> pickValid ();
您可以将验证器添加到包中,这些验证器可用于在包上使用validate()
并将优惠券代码作为参数传递来验证优惠券的要求。
$ collection -> validate ( " ALAN-COLE-CODE " );
验证器可以作为验证器函数的回调添加,或者作为实现vouchers VoucherValidator
这里是一个示例,假设凭证具有expire_date
并检查它是否已过期。
$ collection -> validator ( function ( $ voucher ) {
return $ voucher -> expire_date > new DateTime ();
}, " Sorry, this voucher is expired " );
try {
$ collection -> validate ( " ALAN-COLE-CODE " );
} catch ( vouchers Exceptions VoucherNotValid $ e ) {
return $ e -> getMessage (); // "Sorry, this voucher is expired";
}
这展示了如何从订阅 API 获取vouchers 、获取请求的优惠券、验证它并在 API 上声明它。
$ api = new Discovery Subscriptions Api ();
$ api -> setApiKey ( getenv ( " SUBS_API_KEY " ));
$ api -> setAppId ( getenv ( " SUBS_APP_ID " ));
$ vouchers = $ api -> getAll vouchers ();
$ bag = new vouchers Bag ();
$ bag -> map ( $ vouchers , function ( $ voucher ) {
return new vouchers Voucher ( $ voucher );
});
# Add some validators
$ bag -> validator ( function ( $ voucher ) {
return $ voucher -> owner == " Eurosport " ;
}, " Sorry, this voucher was not valid. " );
$ bag -> validator ( function ( $ voucher ) {
return ! $ voucher -> used ;
}, " Sorry, this voucher has been used. " );
$ bag -> validator ( function ( $ voucher ) {
return new DateTime ( $ voucher -> valid_till ) < new DateTime ();
}, " Sorry, this voucher is expired. " );
try {
$ voucher = $ collection -> validate ( filter_val ( INPUT_POST , " voucher_code " , FILTER_SANITIZE_STRING ));
$ voucher -> set ( " used " , true // not really needed.
$ api -> putVoucherClaim ( $ voucher ); // because this takes care of it.
} catch ( vouchers Exceptions VoucherNotValid $ e ) {
echo $ e -> getMessage ();
}