liran-co / laravel-notification-subscriptions
通知订阅管理。
Requires
- php: ^7.2.5|^8.0|^8.1
- laravel/framework: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
README
Laravel Notification Subscriptions 是一个包,它直接连接到 Laravel 的现有 通知系统,并为管理用户对应用程序通知的订阅和自动抑制不应发送的通知添加了功能。您可以订阅和取消订阅特定通知通道、创建可选通知,并按另一个模型的范围设置您的订阅。
安装
要开始,安装 liran-co/laravel-notification-subscriptions
包
composer require liran-co/laravel-notification-subscriptions
运行迁移以创建 notification_subscriptions
表
php artisan migrate
可选:通过运行并选择适当的提供者选项发布配置文件
php artisan vendor:publish
基本用法
此包使用 监听器 来监听您的应用程序中发送的任何通知。当触发通知时,该包会检查是否应该根据用户的订阅实际发送通知。如果不是,则抑制通知。
入门
此包假设您已经设置了 Laravel 的通知系统。如果您还没有 阅读文档 以开始。
将 HasNotificationSubscriptions
特性添加到您的 User
模型中
use Illuminate\Database\Eloquent\Model; use LiranCo\NotificationSubscriptions\Traits\HasNotificationSubscriptions; class User extends Model { use HasNotificationSubscriptions; // ... }
取消订阅
要取消用户对特定 Notification
的订阅,请将那个通知的类名传递给 unsubscribe
函数。
use App\Notifications\InvoicePaid; $user->unsubscribe(InvoicePaid::class); //You can also pass a string, but this is the preferred method.
上面的操作将取消用户对所有通道的订阅。您可以通过传递通道名称作为第二个参数来取消用户对特定通道的订阅
use App\Notifications\InvoicePaid; $user->unsubscribe(InvoicePaid::class, 'mail');
现在,每次发送 InvoicePaid
通知时,该包将自动检测用户已取消订阅并抑制通知。例如
use App\Notifications\InvoicePaid; $user->notify(new InvoicePaid($invoice)); //This won't get sent.
可选通知
默认情况下,如果没有找到订阅/取消订阅记录,则将发送所有通知。这意味着您不需要明确地将用户订阅到通知,只需取消他们的订阅即可。
但是,在某些情况下,您可能想创建可选通知。为此,修改您的通知类并添加一个名为 getOptInSubscriptions
的函数
<?php namespace App\Notifications; // ... class InvoicePaid extends Notification { public function via($notifiable) { return ['mail', 'sms']; } public function getOptInSubscriptions() { return ['sms']; } }
现在,除非用户明确订阅了它,否则包将始终抑制 sms
通道。
订阅
要订阅用户到可选通知或重新订阅之前已取消订阅的通知
use App\Notifications\InvoicePaid; $user->subscribe(InvoicePaid::class);
同样,您可以应用通道
use App\Notifications\InvoicePaid; $user->subscribe(InvoicePaid::class, 'mail');
重置订阅
此包对您的应用程序如何管理通知和订阅没有任何假设。例如,如果您取消用户对特定通知通道的订阅,然后稍后将其订阅到所有通道,则以前的记录不会被删除。要重置用户的通知
use App\Notifications\InvoicePaid; $user->resetSubscriptions(InvoicePaid::class);
您可以使用 resetSubscriptions
链接
use App\Notifications\InvoicePaid; $user->resetSubscriptions(InvoicePaid::class)->subscribe(InvoicePaid::class);
检索订阅
您可以使用 notificationSubscriptions()
关系获取用户的订阅
$user->notificationSubscriptions();
模型范围
在某些应用程序中,您需要取消用户与特定模型相关的通知。例如,如果用户是多个组织的成员,他们可能只想取消单个组织的订阅。您可以通过在通知上应用模型范围来实现这一点
use App\Models\Organization; use App\Notifications\InvoicePaid; //... $organization = Organization::find(1); $user->unsubscribe(InvoicePaid::class, '*', $organization);
或者,对于单个通道
use App\Models\Organization; use App\Notifications\InvoicePaid; //... $organization = Organization::find(1); $user->unsubscribe(InvoicePaid::class, 'mail', $organization);
接下来,我们需要一种方法来检索发送通知时的 Organization
。在您的通知类中添加一个名为 getSubscriptionModel
的函数,告诉它如何检索模型
<?php namespace App\Notifications; // ... class InvoicePaid extends Notification { public function __construct(Invoice $invoice) { $this->invoice = $invoice; } public function getSubscriptionModel($notifiable) { return $this->invoice->organization; } }
现在,当这个通知被发送时,它将检查模型作用域,并在需要时应用它。您可以为 getSubscriptionModel
添加自己的逻辑,甚至在您不想作用域订阅的情况下返回 null
。
重置作用域订阅
要重置作用域订阅上的通知
use App\Models\Organization; use App\Notifications\InvoicePaid; //... $organization = Organization::find(1); $user->resetSubscriptions(InvoicePaid::class, $organization);
检索作用域订阅
检索与特定模型相关的订阅
use App\Models\Organization; //... $organization = Organization::find(1); $user->notificationSubscriptions()->model($organization);
高级用法
忽略订阅
如果您想让包完全忽略您的通知,并跳过任何压制,请在您的通知类中将公共 $ignoreSubscriptions
属性设置为 true。
<?php namespace App\Notifications; // ... class InvoicePaid extends Notification { public function __construct(Invoice $invoice, $ignore = false) { $this->ignoreSubscriptions = $ignore; } }
use App\Notifications\InvoicePaid; $user->notify(new InvoicePaid($invoice, true)); //This will always get sent.
排除渠道
您可能想要排除某些渠道,使其在检查退订时不被考虑。默认情况下,我们已经排除了 database
渠道。您可以在配置文件中配置此选项。
<?php return [ 'excluded_channels' => ['database'], ];
解析逻辑
该包使用以下逻辑来解析是否发送通知
-
如果
channel
在excluded_channels
中,则发送通知。 -
如果通知的公共属性
$ignoreSubscriptions
设置为true
,则发送通知。 -
尝试检索特定渠道的记录,如果没有找到,则尝试检索所有渠道(即
"*"
)的记录。3a. 如果没有记录,并且渠道不是自愿的,则发送通知。
3b. 如果有记录,则根据订阅的状态(已订阅或未订阅)发送通知。