tuyakhov/yii2-notifications

该扩展为通过多种投递渠道发送通知提供支持,包括邮件、短信、Slack 等。通知也可以存储在数据库中,以便在您的网络界面中显示。

安装次数: 27,077

依赖关系: 2

建议者: 0

安全: 0

星级: 64

关注者: 7

分支: 21

开放性问题: 8

类型:yii2-extension

v1.2.1 2016-09-08 00:00 UTC

README

此 Yii2 扩展提供了通过多种投递渠道发送通知的支持,包括邮件、短信、Slack、Telegram 等。通知也可以存储在数据库中,以便在您的网络界面中显示。

通常,通知应该是简短的信息性消息,通知用户应用程序中发生的事情。例如,如果您正在编写一个账单应用程序,您可能通过电子邮件和短信渠道向用户发送“发票已支付”的通知。

Latest Stable Version Scrutinizer Code Quality Build Status Code Climate

安装

安装此扩展的首选方式是通过 composer

运行以下命令之一

php composer.phar require --prefer-dist tuyakhov/yii2-notifications "*"

"tuyakhov/yii2-notifications": "*"

将以下内容添加到您的 composer.json 文件的 require 部分。

用法

以下示例显示了如何创建 Notifier 实例并发送您的第一个通知

$notifier = new \tuyakhov\notifications\Notifier([
  'channels' => [...],
]);
$notifier->send($recipients, $notifications);

Notifier 通常用作应用程序组件,并在应用程序配置中进行配置,如下所示

[
   'components' => [
       'notifier' => [
           'class' => '\tuyakhov\notifications\Notifier',
           'channels' => [
               'mail' => [
                   'class' => '\tuyakhov\notifications\channels\MailChannel',
                   'from' => 'no-reply@example.com'
               ],
               'sms' => [
                   'class' => '\tuyakhov\notifications\channels\TwilioChannel',
                   'accountSid' => '...',
                   'authToken' => '...',
                   'from' => '+1234567890'
               ],
               'telegram' => [
                    'class' => '\tuyakhov\notifications\channels\TelegramChannel',
                    'botToken' => '...'
                ],
               'database' => [
                    'class' => '\tuyakhov\notifications\channels\ActiveRecordChannel'
               ]
           ],
       ],
   ],
]

配置组件后,即可用于发送通知

$recipient = User::findOne(1);
$notification = new InvoicePaid($invoice);

Yii::$app->notifier->send($recipient, $notification);

每个通知类应实现 NotificationInterface,并包含一个 viaChannels 方法和多个消息构建方法(例如 exportForMail),这些方法将通知转换为针对特定渠道优化的消息。以下是一个处理发票已支付情况的示例通知

use tuyakhov\notifications\NotificationInterface;
use tuyakhov\notifications\NotificationTrait;

class InvoicePaid implements NotificationInterface
 {
    use NotificationTrait;
    
    private $invoice;
    
    public function __construct($invoice) 
    {
        $this->invoice = $invoice;
    }

    /**
     * Prepares notification for 'mail' channel
     */
    public function exportForMail() {
        return Yii::createObject([
           'class' => '\tuyakhov\notifications\messages\MailMessage',
           'view' => ['html' => 'invoice-paid'],
           'viewData' => [
               'invoiceNumber' => $this->invoice->id,
               'amount' => $this->invoice->amount
           ]
        ])
    }
    
    /**
     * Prepares notification for 'sms' channel
     */
    public function exportForSms()
    {
        return \Yii::createObject([
            'class' => '\tuyakhov\notifications\messages\SmsMessage',
            'text' => "Your invoice #{$this->invoice->id} has been paid"
        ]);
    }
    
    /**
     * Prepares notification for 'database' channel
     */
    public function exportForDatabase()
    {
        return \Yii::createObject([
            'class' => '\tuyakhov\notifications\messages\DatabaseMessage',
            'subject' => "Invoice has been paid",
            'body' => "Your invoice #{$this->invoice->id} has been paid",
            'data' => [
                'actionUrl' => ['href' => '/invoice/123/view', 'label' => 'View Details']
            ]
        ]);
    }
 }

您可以在任何模型上使用 NotifiableInterfaceNotifiableTrait

use yii\db\ActiveRecord;
use tuyakhov\notifications\NotifiableTrait;
use tuyakhov\notifications\NotifiableInterface;

class User extends ActiveRecord implements NotifiableInterface 
{
   use NotifiableTrait;
   
   public function routeNotificationForMail() 
   {
        return $this->email;
   }
}

数据库通知

database 通知渠道将通知信息存储在数据库表中。
您可以通过查询表来在应用程序的用户界面中显示通知。但在您这样做之前,您需要创建一个数据库表来存储您的通知。为此,您可以使用此扩展附带迁移

yii migrate --migrationPath=@vendor/tuyakhov/yii2-notifications/src/migrations

'controllerMap' => [
    ...
    'migrate' => [
        'class' => 'yii\console\controllers\MigrateController',
        'migrationNamespaces' => [
            'tuyakhov\notifications\migrations',
        ],
    ],
    ...
],
php yii migrate/up

访问通知
通知存储在数据库中后,您需要一种方便的方式从可通知实体访问它们。此扩展附带的 NotifiableTrait 包含一个返回实体通知的 notifications 关系。要获取通知,您可以像访问任何其他 ActiveRecord 关系一样访问此方法。

$model = User::findOne(1);
foreach($model->notifications as $notification) {
    echo $notification->subject;
}

如果您只想检索“未读”通知,则可以使用 unreadNotifications 关系。

$model = User::findOne(1);
foreach($model->unreadNotifications as $notification) {
    echo $notification->subject;
}

您可以访问使用 DatabaseMessage 添加的描述通知的自定义 JSON 数据。

/** @var $notificatiion tuyakhov\notifications\models\Notificatios */
$actionUrl = $notification->data('actionUrl'); // ['href' => '/invoice/123/pay', 'label' => 'Pay Invoice']

将通知标记为已读
通常,当用户查看通知时,您会希望将其标记为“已读”。在 Notification 模型中的 ReadableBehavior 提供一个 markAsRead 方法,该方法更新通知数据库记录上的 read_at 列

$model = User::findOne(1);
foreach($model->unreadNotifications as $notification) {
    $notification->markAsRead();
    
    // the following methods are also available
    $notification->markAsUnread();
    $notification->isUnread();
    $notification->isRead();
}