Une bibliothèque PHP pour générer et valider vouchers . Nous ne faisons aucune hypothèse sur le stockage et proposons à la place le concept de Bags
pouvant accueillir un nombre illimité de vouchers
. Ces sacs peuvent valider vouchers , générer de nouveaux vouchers et appliquer des règles de validation sur l'ensemble de l'ensemble.
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 peuvent prendre presque n'importe quelle forme, mais vous pouvez utiliser vouchers VoucherModel
pour appliquer la validation et la structure. Le seul attribut obligatoire est code
qui par défaut est immuable.
$ voucher = new vouchers Voucher ();
print $ voucher ; // ABCD-EFGH-IJKL
Vous pouvez également transmettre un tableau au bon pour définir des valeurs préexistantes pour le bon. Les champs correspondants (dont code
) seront validés.
$ voucher = new Voucher ([ ' code ' => ' ALAN-COLE-CODE ' , ' claimed_by ' => '' , ' claimed_on ' => '' ]);
print $ voucher ; // "ALAN-COLE-CODE"
Toute valeur transmise lors de la création du bon peut être récupérée et définie à l'aide de get()
et set()
sur le bon.
$ voucher -> set ( ' owner ' , ' Alan ' );
echo $ voucher -> get ( ' owner ' ); // Alan
En créant un modèle, vous pouvez définir des valeurs par défaut et une validation sur vouchers créés ou chargés. Les modèles sont transmis sous forme de tableau vouchers VoucherModel
$ model = new vouchers Voucher Model ([
' owner ' => [
' required ' => true ,
' immutable ' => true ,
],
' claimed_by ' => [
' required ' => true ,
]
]);
Si vous définissez un attribut de bon comme immutable
, Voucher
lèvera l'exception ImmutableData
.
Vous pouvez modifier la façon dont le code est généré par le générateur de paramètres sur un modèle. Un générateur doit implémenter 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 ;
}
}
Dites ensuite au modèle d'utiliser ce générateur.
$ model = new vouchers Voucher Model ([
' code ' => [
' generator ' => My Voucher Generator MyCode::class
]
]);
Les sacs font office de collections de vouchers et vous permettent d'appliquer des validations sur un ensemble complet. Les sacs peuvent également servir de sélecteur de vouchers , vous permettant de choisir un bon au hasard et d'appliquer des règles sur cette sélection. Les sacs sont également Iterable
afin de pouvoir être utilisés en boucles.
$ collection = new vouchers Bag ();
$ collection -> fill ( 1000 );
foreach ( $ collection as $ voucher ) {
print $ voucher ;
}
Vous pouvez utiliser vouchers VoucherModel
pour appliquer un modèle sur tous les articles d'un sac en passant un modèle comme premier attribut lors de la construction.
$ collection = new vouchers Bag ( $ model );
Vous pouvez remplir un modèle avec vouchers existants en utilisant add()
add n'acceptera qu'une instance de vouchers Voucher
$ vouchers = [ $ voucher1 . . . $ voucher100 ];
foreach ( $ vouchers as $ voucher ) {
$ collection -> add ( new vouchers Voucher ( $ voucher ));
}
Vous pouvez également exécuter une carte sur n'importe quel tableau, mappant le retour sous forme de nouveaux vouchers dans le sac. Ceci est pratique si vous devez transformer des données pour les adapter à un modèle.
$ collection -> map ( $ vouchers , function ( $ voucher ) {
return new vouchers Voucher ( $ voucher );
});
Vous pouvez obtenir un bon par code, qui peut être utilisé pour voir si un bon existe.
$ 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. " ;
}
Vous pouvez demander au sac de vous choisir un bon au hasard en utilisant pick()
sur n'importe quel sac.
$ collection = new vouchers Bag ();
$ collection -> fill ( 1000 );
$ collection -> pick ();
Si vous souhaitez valider la sélection, vous pouvez passer un rappel à pick qui s'exécutera jusqu'à ce qu'il renvoie un true
ou lèvera une exception 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 ();
}
Vous pouvez également demander pick()
de vérifier tous les validateurs que ce sac pourrait avoir (voir Valider) et de renvoyer uniquement un bon valide. Encore une fois, cela lancera vouchers ExceptionsNoValid vouchers
s'il ne trouve pas de bon.
$ collection -> pickValid ();
Vous pouvez ajouter des validateurs à un sac, ces validateurs peuvent être utilisés pour valider les exigences d'un bon en utilisant validate()
sur un sac et en passant le code du bon comme paramètre.
$ collection -> validate ( " ALAN-COLE-CODE " );
Les validateurs peuvent être ajoutés en tant que rappels à la fonction de validation, ou en tant que classe qui implémente vouchers VoucherValidator
Voici un exemple qui suppose qu'un bon a une expire_date
et vérifie qu'il n'a pas été transmis.
$ 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";
}
Cela montre comment obtenir vouchers à partir de l'API des abonnements, prendre un bon demandé, le valider et le réclamer sur l'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 ();
}