digitalcloud/advanced-notifications

v0.1 2019-01-13 13:25 UTC

This package is auto-updated.

Last update: 2024-08-29 04:54:34 UTC


README

此包允许您在数据库中管理系统通知。

描述

当与处理大量客户的系统一起工作时,通知管理变得相当复杂,一个通知管理工具将很有用。在这里,我们介绍了一个强大的工具,允许您管理系统的通知。我们提供API,以便在多个级别上启用和禁用通知,如下所示

  • 您可以全局禁用通知,因此系统将不再发送此类通知。
  • 您可以全局禁用通知通道,因此系统将不再通过此通道发送通知。
  • 您可以禁用特定通知对象在特定通知和/或通道上的通知。

安装

您可以通过composer安装此包

composer require digitalcloud/advanced-notifications

在Laravel 5.5中,服务提供程序将自动注册。在框架的旧版本中,只需将服务提供程序添加到config/app.php文件中即可

    'providers' => [
        DigitalCloud\AdvancedNotifications\AdvancedNotificationsServiceProvider::class,
    ];
    

您可以使用以下命令发布迁移

php artisan vendor:publish --provider="DigitalCloud\AdvancedNotifications\AdvancedNotificationsServiceProvider" --tag="migrations"

迁移发布后,您可以通过运行迁移来创建高级通知表

php artisan migrate

安装后,您可以进行如下操作

    // disable/enable all notifications for specific channel
    AdvancedNotifications::setChannelStatus('database', false); // true to enable
    
    // get specific channel status
    $channelStatus = AdvancedNotifications::getChannelStatus('database');
    
    //  disable/enable a specific notification globally- for all users.
    AdvancedNotifications::setNotificationStatus(InvoicePaid::class, false); // true to enable
    
    // get a specific notification status
    $notificationStatus = AdvancedNotifications::getNotificationStatus(InvoicePaid::class);

    // disable/enable a specific notification for a specific notifiable.
    $notifiable = \App\User::find(1);
    AdvancedNotifications::setNotificationStatusForNotifiable(InvoicePaid::class, $notifiable, false); // true to enable
    
    // get a specific notification status for a specific notifiable.
    $notificationStatusForNotifiable = AdvancedNotifications::getNotificationStatusForNotifiable(InvoicePaid::class, $notifiable);

    // disable/enable a specific channel for a specific notifiable.
    AdvancedNotifications::setChannelStatusForNotifiable('database', $notifiable, false); // true to enable
    
    // get a specific channel status for a specific notifiable.
    $channelStatusForNotifiable = AdvancedNotifications::getChannelStatusForNotifiable('database', $notifiable);

此包将尊重每个通道、通知和可通知对象的状态,它将在实际发送通知之前测试这些类型的状态。

用法

示例1

最好将准备可通知对象的任务留给通知本身。因此,使用getNotifiables()setNotifiables()可以使您的代码更整洁和清晰。这是一个很好的例子

<?php

namespace App\Notifications;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification
{
    use Queueable;
    /**
     * @var User
     */
    private $notifiables;

    public function send() {
        if($this->getNotifiables()) {
            app(\Illuminate\Contracts\Notifications\Dispatcher::class)
                ->sendNow($this->getNotifiables(), $this);
        }
    }
    
    public function getNotifiables() {
            return $this->notifiables;
        }

    public function setNotifiables($notifiables) {
        $this->notifiables = $notifiables;
    }

}
示例2:将通知作为事件监听器

我们可以通过向通知类添加handel()函数将通知作为事件监听器。

<?php

namespace App\Notifications;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification
{
    use Queueable;
    /**
     * @var User
     */
    private $notifiables;
    
    public function handle($event) {
        // setup notifiable objects, just for illustration
        // you can replace this code by your suitable logic
        if($event->notifiables) {
            $this->setNotifiables($event->notifiables);
        }

        // send the notification
        $this->send();
    }

    public function send() {
        if($this->getNotifiables()) {
            app(\Illuminate\Contracts\Notifications\Dispatcher::class)
                ->sendNow($this->getNotifiables(), $this);
        }
    }
    
    public function getNotifiables() {
        return $this->notifiables;
    }

    public function setNotifiables($notifiables) {
        $this->notifiables = $notifiables;
    }

}

然后在app/providers/EventServiceProvider.php中的$listen数组中添加此类作为监听器

protected $listen = [
    \App\Events\NewPurchase::class => [InvoicePaid::class]
];

然后您可以在需要时触发事件

event(new NewPurchase($args));

您可以将可通知对象传递给事件,或者将此任务留给通知本身。

NewPurchase看起来像这样

<?php

namespace App\Events;

use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;

class NewPurchase
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $notifiables;

    public function __construct($notifiables = null)
    {
        $this->notifiables = $notifiables;
    }
}