mmockelyn / laravel-vouchers
允许用户兑换与模型绑定的优惠券。
Requires
- php: ^7.1|^8.0|^8.1|^8.2
- illuminate/config: ^8.0|^9.0|^10.0
- illuminate/database: ^8.0|^9.0|^10.0
- illuminate/support: ^8.0|^9.0|^10.0
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: ^6.0|^8.0
- phpunit/phpunit: ^8.0|^9.0
README
此包可以将优惠券与您的 Eloquent 模型关联。如果您需要将优惠券代码与存储在 Eloquent 模型中的内容关联起来,这可能很有用。
以下是一个创建和兑换优惠券的示例
$videoCourse = VideoCourse::find(1);
$voucher = $videoCourse->createVoucher();
auth()->user()->redeemVoucher($voucher);
安装
您可以通过 composer 安装此包
composer require beyondcode/laravel-vouchers
包将自动注册自己。
您可以使用以下命令发布迁移
php artisan vendor:publish --provider="BeyondCode\Vouchers\VouchersServiceProvider" --tag="migrations"
在迁移发布后,您可以通过运行迁移来创建优惠券表
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider=BeyondCode\Vouchers\VouchersServiceProvider --tag="config"
这是已发布配置文件的内容
<?php
return [
/*
* Database table name that will be used in migration
*/
'table' => 'vouchers',
/*
* Database pivot table name for vouchers and users relation
*/
'relation_table' => 'user_voucher',
/*
* List of characters that will be used for voucher code generation.
*/
'characters' => '23456789ABCDEFGHJKLMNPQRSTUVWXYZ',
/*
* Voucher code prefix.
*
* Example: foo
* Generated Code: foo-AGXF-1NH8
*/
'prefix' => null,
/*
* Voucher code suffix.
*
* Example: foo
* Generated Code: AGXF-1NH8-foo
*/
'suffix' => null,
/*
* Code mask.
* All asterisks will be removed by random characters.
*/
'mask' => '****-****',
/*
* Separator to be used between prefix, code and suffix.
*/
'separator' => '-',
/*
* The user model that belongs to vouchers.
*/
'user_model' => \App\User::class,
];
使用方法
此包的基本概念是您可以创建与特定模型关联的优惠券。例如,您可能有这样一个应用程序,它在网上销售视频课程,优惠券可以给用户访问一个特定视频课程的权利。
将 BeyondCode\Vouchers\Traits\HasVouchers
特性添加到您想要与优惠券关联的所有 Eloquent 模型中。
此外,将 BeyondCode\Vouchers\Traits\CanRedeemVouchers
特性添加到您的用户模型中。这样,用户就可以轻松兑换优惠券代码,而包将负责在数据库中存储优惠券/用户关联。
创建优惠券
使用外观
您可以使用 Vouchers
外观创建一个或多个优惠券
$videoCourse = VideoCourse::find(1);
// Create 5 vouchers associated to the videoCourse model.
$vouchers = Vouchers::create($videoCourse, 5);
返回值是一个包含所有生成的 Voucher
模型的数组。
优惠券模型有一个名为 code
的属性,其中包含生成的优惠券代码。
使用 Eloquent 模型
此外,您还可以通过在关联模型上使用 createVouchers
方法来创建优惠券
$videoCourse = VideoCourse::find(1);
// Returns an array of Vouchers
$vouchers = $videoCourse->createVouchers(2);
// Returns a single Voucher model instance
$vouchers = $videoCourse->createVoucher();
具有附加数据的优惠券
将任意数据与您的优惠券关联可能很有用——也许是从创建优惠券的人那里的一条个性化信息等。在创建优惠券时,您可以将一个数组作为第二个参数传递,您可以在稍后从 Voucher 实例中检索该数组。
$videoCourse = VideoCourse::find(1);
$vouchers = $videoCourse->createVouchers(2, [
'from' => 'Marcel',
'message' => 'This one is for you. I hope you like it'
]);
$voucher = $user->redeem('ABC-DEF');
$from = $voucher->data->get('from');
$message = $voucher->data->get('message');
具有到期日期的优惠券
您还可以创建仅在特定日期之前可用的优惠券。用户之后不能兑换此代码。《createVouchers》方法接受一个 Carbon 实例作为第三个参数。
$videoCourse = VideoCourse::find(1);
$videoCourse->createVouchers(2, [], today()->addDays(7));
兑换优惠券
让您的用户兑换优惠券代码的最简单方法是在您的用户模型上使用 redeemCode
方法
$voucher = $user->redeemCode('ABCD-EFGH');
如果优惠券有效,该方法将返回与该代码关联的优惠券模型。
如果您想要兑换现有的优惠券模型,可以在您的用户模型上使用 redeemVoucher
方法
$user->redeemVoucher($voucher);
在用户成功兑换优惠券后,此包将触发 BeyondCode\Vouchers\Events\VoucherRedeemed
事件。事件包含用户实例和优惠券实例。您应该监听此事件,以便在用户兑换优惠券时执行应用程序的业务逻辑。
访问关联的优惠券模型
优惠券模型有一个指向关联 Eloquent 模型的 model
关联。
$voucher = $user->redeemCode('ABCD-EFGH');
$videoCourse = $voucher->model;
处理错误
redeemCode
和 redeemVoucher
方法抛出一些异常,您需要在应用程序中捕获并作出反应
优惠券无效
如果用户尝试兑换无效代码,包将抛出以下异常: BeyondCode\Vouchers\Exceptions\VoucherIsInvalid
。
优惠券已兑换
所有生成的代金券只能使用一次。如果用户尝试第二次使用代金券,或者另一个用户已经使用过这张代金券,程序将抛出以下异常:BeyondCode\Vouchers\Exceptions\VoucherAlreadyRedeemed::class
。
代金券过期
如果用户尝试使用过期的代金券代码,程序将抛出以下异常:BeyondCode\Vouchers\Exceptions\VoucherExpired
。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全
如果您发现任何安全相关的问题,请发送电子邮件至marcel@beyondco.de,而不是使用问题跟踪器。
鸣谢
此软件包在很大程度上基于Zura Gabievi的Laravel Promocodes软件包。代码可以在GitHub上找到。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。