Uma biblioteca PHP para geração e validação vouchers . Não fazemos suposições sobre armazenamento e, em vez disso, oferecemos o conceito de Bags
que podem acomodar qualquer número de vouchers
. Estas malas podem validar vouchers , gerar novos vouchers e aplicar regras de validação em todo o conjunto.
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 podem assumir praticamente qualquer formato, mas você pode usar vouchers VoucherModel
para impor validação e estrutura. O único atributo obrigatório é code
que por padrão é imutável.
$ voucher = new vouchers Voucher ();
print $ voucher ; // ABCD-EFGH-IJKL
Você também pode passar uma matriz ao voucher para definir valores pré-existentes no voucher. Os campos correspondentes (incluindo code
) serão validados.
$ voucher = new Voucher ([ ' code ' => ' ALAN-COLE-CODE ' , ' claimed_by ' => '' , ' claimed_on ' => '' ]);
print $ voucher ; // "ALAN-COLE-CODE"
Qualquer valor passado na criação do voucher pode ser obtido e definido usando get()
e set()
no voucher.
$ voucher -> set ( ' owner ' , ' Alan ' );
echo $ voucher -> get ( ' owner ' ); // Alan
Ao criar um modelo você pode definir valores padrão e validação nos vouchers criados ou carregados. Os modelos são passados como um array para vouchers VoucherModel
$ model = new vouchers Voucher Model ([
' owner ' => [
' required ' => true ,
' immutable ' => true ,
],
' claimed_by ' => [
' required ' => true ,
]
]);
Se você definir um atributo de voucher como immutable
, Voucher
lançará a exceção ImmutableData
.
Você pode alterar a forma como o código é gerado pelo gerador de configurações em um modelo. Um gerador deve implementar 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 ;
}
}
Então diga ao modelo para usar este gerador.
$ model = new vouchers Voucher Model ([
' code ' => [
' generator ' => My Voucher Generator MyCode::class
]
]);
As sacolas funcionam como coleções de vouchers e permitem impor validações em um conjunto inteiro. As sacolas também podem atuar como seletores de vouchers , permitindo que você escolha um voucher aleatoriamente e aplique regras sobre essa seleção. Os sacos também são Iterable
para que possam ser usados em loops.
$ collection = new vouchers Bag ();
$ collection -> fill ( 1000 );
foreach ( $ collection as $ voucher ) {
print $ voucher ;
}
Você pode usar vouchers VoucherModel
para impor um modelo em todos os itens de uma sacola, passando um modelo como o primeiro atributo na construção.
$ collection = new vouchers Bag ( $ model );
Você pode preencher um modelo com vouchers existentes usando add()
add aceitará apenas uma instância de vouchers Voucher
$ vouchers = [ $ voucher1 . . . $ voucher100 ];
foreach ( $ vouchers as $ voucher ) {
$ collection -> add ( new vouchers Voucher ( $ voucher ));
}
Você também pode executar um mapa em qualquer array, mapeando o retorno como novos vouchers dentro da sacola. Isso é útil se você precisar transformar dados para ajustá-los a um modelo.
$ collection -> map ( $ vouchers , function ( $ voucher ) {
return new vouchers Voucher ( $ voucher );
});
Você pode obter um voucher por código, que pode ser usado para verificar se existe um 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. " ;
}
Você pode fazer com que a sacola escolha um voucher aleatoriamente usando pick()
em qualquer sacola.
$ collection = new vouchers Bag ();
$ collection -> fill ( 1000 );
$ collection -> pick ();
Se desejar validar a seleção, você pode passar um retorno de chamada para pick, que será executado até retornar um true
ou lançar uma exceção 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 ();
}
Você também pode pedir pick()
para verificar todos os validadores que esta bolsa possa ter (veja Validar) e devolver apenas um voucher que seja válido. Novamente, isso lançará vouchers ExceptionsNoValid vouchers
se não encontrar um voucher.
$ collection -> pickValid ();
Você pode adicionar validadores a uma sacola, esses validadores podem ser usados para validar os requisitos de um voucher usando validate()
em uma sacola e passando o código do voucher como parâmetro.
$ collection -> validate ( " ALAN-COLE-CODE " );
Os validadores podem ser adicionados como retornos de chamada para a função validadora ou como uma classe que implementa vouchers VoucherValidator
Aqui está um exemplo que assume que um voucher tem uma expire_date
e verifica se ele não foi aprovado.
$ 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";
}
Isso mostra como obter vouchers da API de assinaturas, pegar um voucher solicitado, validá-lo e reivindicá-lo na 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 ();
}