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のコレクションとして機能し、セット全体の検証を強制できるようになります。バッグは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 ();
選択内容を検証したい場合は、 true
返すか、 vouchers ExceptionsNoValid vouchers
例外をスローするまで実行されるコールバックを pick に渡すことができます。
$ 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 ();
}