liran-co/laravel-notification-subscriptions

通知订阅管理。

v1.8 2024-04-03 15:10 UTC

This package is auto-updated.

Last update: 2024-09-03 15:59:27 UTC


README

Laravel Notification Subscriptions 是一个包,它直接连接到 Laravel 的现有 通知系统,并为管理用户对应用程序通知的订阅和自动抑制不应发送的通知添加了功能。您可以订阅和取消订阅特定通知通道、创建可选通知,并按另一个模型的范围设置您的订阅。

Latest Stable Version Total Downloads License

安装

要开始,安装 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'],

];

解析逻辑

该包使用以下逻辑来解析是否发送通知

  1. 如果 channelexcluded_channels 中,则发送通知。

  2. 如果通知的公共属性 $ignoreSubscriptions 设置为 true,则发送通知。

  3. 尝试检索特定渠道的记录,如果没有找到,则尝试检索所有渠道(即 "*")的记录。

    3a. 如果没有记录,并且渠道不是自愿的,则发送通知。

    3b. 如果有记录,则根据订阅的状态(已订阅或未订阅)发送通知。

许可证

MIT 许可证下发布。有关更多信息,请参阅 LICENSE