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
예외를 발생시킬 때까지 실행할 콜백을 전달할 수 있습니다.
$ 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 ();
}