Notifications
简介
除了支持 发送邮件 之外,Laravel 还支持通过多种频道发送通知,包括邮件、短信(通过 Vonage,原来叫 Nexmo),以及 Slack。此外,已经创建了各种各样的 社区通知频道,来在十几个不同的频道中发送通知!通知还能存储到数据库以便后续在 Web 页面中显示。
通常,通知应该是简短的信息性消息,用于通知用户应用中发生的事情。例如,如果你正在编写一个账单应用,则可以通过邮件和 短信频道向用户发送一个「支付凭证」通知。
创建通知
Laravel 中,通常每个通知都由一个存储在 app/Notifications
目录下的一个类表示。如果在你的应用中没有看到这个目录,不要担心,当运行 make:notification
命令时它将为您创建:
php artisan make:notification InvoicePaid
这个命令会在 app/Notifications
目录下生成一个新的通知类。每个通知类都包含一个 via
方法以及一个或多个消息构建的方法比如 toMail
或 toDatabase
,它们会针对特定的渠道把通知转换为对应的消息。
发送通知
使用 Notifiable Trait
通知可以通过两种方式发送: 使用 Notifiable
特性的 notify
方法或使用 Notification
门面。 该 Notifiable
默认包含在应用程序的 App\Models\User
模型中:
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
}
此 notify
方法需要接收一个通知实例参数:
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice));
技巧:请记住,你可以在任何模型中使用 Notifiable
trait。而不仅仅是在 User
模型中。
使用 Notification Facade
另外,你可以通过 Notification
facade 来发送通知,它主要用在当你需要给多个可接收通知的实体发送的时候,比如给用户集合发送通知。使用 Facade 发送通知的话,要把可接收通知实例和通知实例传递给 send
方法:
use Illuminate\Support\Facades\Notification;
Notification::send($users, new InvoicePaid($invoice));
您也可以使用sendNow
方法立即发送通知。即使通知实现了ShouldQueue
接口,该方法也会立即发送通知:
Notification::sendNow($developers, new DeploymentCompleted($deployment));
发送指定频道
每个通知类都有一个via
方法,用于确定将在哪些通道上传递通知。通知可以在mail
、database
、broadcast
、vonage
和slack
频道上发送。
提示:如果你想使用其他的频道,比如 Telegram 或者 Pusher,你可以去看下社区驱动的 Laravel 通知频道网站。
via
方法接收一个 $notifiable
实例,这个实例将是通知实际发送到的类的实例。你可以用 $notifiable
来决定这个通知用哪些频道来发送:
/**
* 获取通知发送频道
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return $notifiable->prefers_sms ? ['vonage'] : ['mail', 'database'];
}
通知队列化
注意:使用通知队列前需要配置队列并 开启一个队列任务。
发送通知可能是耗时的,尤其是通道需要调用额外的 API 来传输通知。为了加速应用的响应时间,可以将通知推送到队列中异步发送,而要实现推送通知到队列,可以让对应通知类实现 ShouldQueue
接口并使用 Queueable
trait。如果通知类是通过 make:notification
命令生成的,那么该接口和 trait 已经默认导入,你可以快速将它们添加到通知类:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
class InvoicePaid extends Notification implements ShouldQueue
{
use Queueable;
// ...
}
一旦 ShouldQueue
接口被添加到您的通知中,您就可以像往常一样发送通知。 Laravel 将检测类上的 ShouldQueue
接口并自动将通知的传递排队:
$user->notify(new InvoicePaid($invoice));
如果您想延迟通知的传递,您可以将 delay
方法链接到通知实例:
$delay = now()->addMinutes(10);
$user->notify((new InvoicePaid($invoice))->delay($delay));