用於產生和驗證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 ();
}