thomasjohnkane / snooze
在 Laravel 中安排未来的通知和提醒
Requires
- php: ^8.1
- illuminate/support: ^10.0 | ^11.0
Requires (Dev)
- orchestra/testbench: ^8.0 | ^9.0
- phpunit/phpunit: ^10.0 | ^11.0
- timacdonald/log-fake: ^2
This package is auto-updated.
Last update: 2024-09-16 02:43:39 UTC
README
在 Laravel 中安排未来的通知和提醒
为什么要使用这个包?
- 是否曾想安排一个在特定时间发出的未来通知?(延迟队列选项不够用吗?)
- 想要一个简单的用户入门邮件序列吗?
- 如何处理生日电子邮件呢?
常见用途
- 提醒系统(预约前一周,前一天,一小时前等)
- 跟进调查(购买后两天)
- 用户入门邮件序列(注册后欢迎邮件,三天后提供额外提示,七天后提供升级优惠)
- 短期重复报告(接下来四周每周发送一次)
安装
通过 composer 安装
composer require thomasjohnkane/snooze
php artisan migrate
发布配置文件
php artisan vendor:publish --provider="Thomasjohnkane\Snooze\ServiceProvider" --tag="config"
用法
使用模型特质
Snooze 为您的模型提供了一个特质,类似于标准的 Notifiable
特质。它为您的模型添加了一个 notifyAt()
方法来安排通知。
use Thomasjohnkane\Snooze\Traits\SnoozeNotifiable; use Illuminate\Notifications\Notifiable; class User extends Model { use Notifiable, SnoozeNotifiable; // ... } // Schedule a birthday notification $user->notifyAt(new BirthdayNotification, Carbon::parse($user->birthday)); // Schedule for a week from now $user->notifyAt(new NextWeekNotification, Carbon::now()->addDays(7)); // Schedule for new years eve $user->notifyAt(new NewYearNotification, Carbon::parse('last day of this year'));
使用 ScheduledNotification::create 辅助函数
您也可以使用 ScheduledNotification
上的 create
方法。
ScheduledNotification::create( Auth::user(), // Target new ScheduledNotificationExample($order), // Notification Carbon::now()->addHour() // Send At );
这对于安排匿名通知(直接路由,而不是在模型上)也很有用。
$target = (new AnonymousNotifiable) ->route('mail', 'hello@example.com') ->route('sms', '56546456566'); ScheduledNotification::create( $target, // Target new ScheduledNotificationExample($order), // Notification Carbon::now()->addDay() // Send At );
关于安排 snooze:send
命令的重要说明
创建一个计划通知将把通知添加到数据库。它将在运行 snooze:send
命令时(或之后)发送,该命令是在存储的 sendAt
时间。
默认情况下,snooze:send
命令每分钟安排运行一次。您可以在发布的配置文件中更改此值(sendFrequency
)。可用选项有 everyMinute
、everyFiveMinutes
、everyTenMinutes
、everyFifteenMinutes
、everyThirtyMinutes
、hourly
和 daily
。
您需要做的唯一一件事是确保 schedule:run
也在运行。您可以在控制台中运行 php artisan schedule:run
来测试它。 要使其自动运行,请参阅此处。
注意:如果您希望 snooze 不会自动安排命令,可以将
scheduleCommands
配置值设置为false
。
设置发送容忍度
如果您的调度程序停止工作,则计划通知的积压将会增加。为了防止用户一次性接收到所有旧计划通知,命令将只发送配置的容忍度内的邮件。默认情况下,此值为 24 小时,因此只有计划在此窗口内发送的邮件才会发送。您可以使用 SCHEDULED_NOTIFICATION_SEND_TOLERANCE
环境变量或 snooze.php
配置文件来配置此值(单位为秒)。
设置修剪年龄
该包可以修剪发送/取消发送超过 x 天的发送/取消发送的消息。您可以使用 SCHEDULED_NOTIFICATION_PRUNE_AGE
环境变量或 snooze.php
配置文件来配置此值(单位为天)。默认情况下,此功能是关闭的。
详细示例
取消计划通知
$notification->cancel();
注意:您不能取消已经发送的通知。
重新安排计划通知
$rescheduleAt = Carbon::now()->addDay(1) $notification->reschedule($rescheduleAt)
注意:您不能重新安排已经发送或取消的通知。如果您想复制已经发送或取消的通知,请与新的发送日期一起传递一个真值第二个参数;reschedule($date, true)
,或者使用下面显示的scheduleAgainAt($date)
方法。
复制要再次发送的计划通知
$notification->scheduleAgainAt($newDate); // Returns the new (duplicated) $notification
检查计划通知的状态
// Check if a notification is already cancelled $result = $notification->isCancelled(); // returns a bool // Check if a notification is already sent $result = $notification->isSent(); // returns a bool
有条件地中断计划通知
如果您想有条件地停止发送电子邮件,可以在任何通知上添加shouldInterrupt()
方法。该方法将在通知发送前立即检查。
例如,如果用户变得不活跃,或者通知所针对的订单已被取消,则可能不会发送未来的 drip 通知。
public function shouldInterrupt($notifiable) { return $notifiable->isInactive() || $this->order->isCanceled(); }
如果您的通知上没有此方法,通知将不会被中断。如果您想对一组通知重复条件逻辑,请考虑创建一个shouldInterupt特质。
计划通知元信息
您可以在计划通知上存储元信息,然后稍后通过此元信息查询计划通知。
此功能在存储计划通知用于未来的日期,但系统中的某些更改需要您更新它们时可能很有用。通过使用元列,可以更轻松地从数据库中查询这些计划通知,而不仅仅是可通知项。
存储元信息
使用ScheduledNotification::create
辅助函数
ScheduledNotification::create( $target, // Target new ScheduledNotificationExample($order), // Notification Carbon::now()->addDay(), // Send At, ['foo' => 'bar'] // Meta Information );
使用notifyAt
特质
$user->notifyAt(new BirthdayNotification, Carbon::parse($user->birthday), ['foo' => 'bar']);
从计划通知中检索元信息
您可以在现有的计划通知上调用getMeta
函数来检索特定通知的元信息。
向此函数传递没有参数将返回整个元列的数组形式。
传递一个字符串键(getMeta('foo')
),将检索元列中的特定键。
使用ScheduledNotification::findByMeta辅助函数查询计划通知
您可以使用findByMeta
辅助函数通过数据库查询具有特定元信息的计划通知。
ScheduledNotification::findByMeta('foo', 'bar'); //key and value
第一个参数是元键,第二个参数是要查找的值。
注意:索引列目前没有使用数据库索引
有条件地关闭调度器
如果您想禁用发送计划通知,请将环境变量SCHEDULED_NOTIFICATIONS_DISABLED
设置为true
。您仍然可以安排通知,一旦调度器启用,它们将被发送。
这可能有助于确保计划通知仅由特定的服务器发送,例如。
在单个服务器上启用
如果您想使snooze
命令利用 Laravel 调度器的onOneServer
功能,可以使用以下环境变量
SCHEDULED_NOTIFICATIONS_ONE_SERVER = true
运行测试
composer test
安全
如果您发现任何安全相关的问题,请通过电子邮件联系,而不是使用问题跟踪器。
贡献
- 分支它(https://github.com/thomasjohnkane/snooze/fork)
- 创建您的功能分支(
git checkout -b feature/fooBar
) - 提交您的更改(
git commit -am 'Add some fooBar'
) - 将更改推送到分支(
git push origin feature/fooBar
) - 创建一个新的拉取请求
鸣谢
此软件包是在melihovv/laravel-package-generator的帮助下启动的。