PHP-библиотека для создания и проверки vouchers . Мы не делаем никаких предположений о хранении и вместо этого предлагаем концепцию Bags
, в которые можно вместить любое количество vouchers
. Эти пакеты могут проверять 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 );
Вы можете заполнить модель существующими vouchers , используя add()
Функция 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";
}
Здесь показано, как получить vouchers из API подписок, взять запрошенный ваучер, проверить его и запросить его через 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 ();
}