Notification des messages
- Envoyer une notification
- Utiliser le trait notifiable
- Envoyer à l'aide de la façade de notification
- Canaux désignés
- Notification file d'attente
- Notifications à la demande
- Notifications par e-mail
- Formater les messages électroniques
- Autres options de formatage des notifications
- Message d'erreur
- Destinataires personnalisés
- Notification par e-mail Markdown
- Générer un message
- Écrire un message
- Composant bouton
- Composant panneau
- Composant table
- Composant personnalisé
- CSS personnalisé
- Notification de formatage de la base de données
- Connaissances préliminaires
- Configuration de la file d'attente de diffusion
- Notification d'écoute
- Canal de notification personnalisé
- Routage des notifications SMS
- Notification Slack
- Connaissances préliminaires
- Personnalisation du Expéditeur et destinataire
- Pièce jointe Slack
- Contenu des pièces jointes Markdown
- Routage des notifications Slack
- Notifications localisées
- Événement de notification
Notification de message
- Introduction
- Créer une notification
- Envoyer une notification
- Notifications par e-mail
- Notification par e-mail de démarque
- Générer un message notification de visite
- Marquer les notifications comme lues "Notifications de diffusion"
- Prérequis
Formater la notification SMS - Numéro de téléphone « De » personnalisé
- Routage des notifications SMS
- Notification Slack
- Prérequis
Formater les notifications Slack-
- Pièces jointes Slack
- Routage des notifications Slack
- "Notifications localisées" ( via
- Nexmo), et Slack . Les notifications peuvent également être stockées dans une base de données pour être affichées ultérieurement sur des pages Web.
En règle générale, les notifications sont des messages courts et informatifs utilisés pour informer les utilisateurs de ce qui se passe dans l'application. Par exemple, si vous rédigez une application de transaction en ligne, vous devez envoyer une notification de « paiement de facture » à l'utilisateur via des classes de canaux e-mail et SMS.
Créer des notifications
Une notification dans Laravel est une classe (généralement stockée dans le dossier
app/Notifications
). Ne vous inquiétez pas si vous ne le voyez pas, exécutez simplement la commandemake:notification
pour le créer :app/Notifications
文件夹下)。看不到的话不要担心,运行下make:notification
命令就能创建了:php artisan make:notification InvoicePaid
这条命令会在
app/Notifications
目录下生成一个新的通知类。这个类包含via
方法以及一个或多个消息构建的方法 (比如toMail
或者toDatabase
) ,它们会针对指定的渠道把通知转换为对应的消息。发送通知
使用 Notifiable Trait
通知可以通过两种方法发送:
Notifiable
trait 的notify
方法或Notification
facade。首先让我们来探讨下使用 trait:<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use Notifiable; }
默认的
AppUser
模型中使用了这个 trait,它包含着一个可以用来发送通知的方法:notify
。notify
方法需要一个通知实例做参数:use App\Notifications\InvoicePaid; $user->notify(new InvoicePaid($invoice));
{tip} 记住,你可以在任意模型中使用
IlluminateNotificationsNotifiable
trait,而不仅仅是在User
模型中。使用 Notification Facade
另外,你可以通过
Notification
facade 来发送通知。它主要用在当你给多个可接收通知的实体发送的时候,比如给用户集合发送通知。使用 Facade 发送通知的话,要把可以接收通知和通知的实例传递给send
方法:Notification::send($users, new InvoicePaid($invoice));
发送指定频道
每个通知类都会有个
via
方法,它决定了通知会在哪个频道上发送。开箱即用的频道有mail
,database
,broadcast
,nexmo
和slack
。{tip} 如果你想使用其他的频道,比如 Telegram 或者 Pusher,你可以去看下社区驱动的 Laravel 通知频道网站。
via
方法接收一个$notifiable
实例。这个实例将是通知实际发送到的类的实例。你可以用$notifiable
/** * 获取通知发送频道。 * * @param mixed $notifiable * @return array */ public function via($notifiable){ return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database']; }
Cette commande générera une nouvelle notification dans l'app/Notifications code> type de répertoire. Cette classe contient la méthode
ou la façadevia
et une ou plusieurs méthodes de construction de message (telles quetoMail
outoDatabase
), qui notifieront le canal spécifié Convertir en message correspondant.Envoi de notifications
🎜Utilisation du trait notifiable🎜🎜Les notifications peuvent être envoyées de deux manières : < La méthode
notify
du trait code>NotifiableNotification
. Explorons d'abord l'utilisation des traits : 🎜<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; class InvoicePaid extends Notification implements ShouldQueue{ use Queueable; // ... }
🎜Le modèleAppUser
par défaut utilise ce trait, qui contient une méthode qui peut être utilisée pour envoyer des notifications :notify
. La méthodenotify
nécessite une instance de notification comme paramètre : 🎜$user->notify(new InvoicePaid($invoice));
🎜🎜{tip} N'oubliez pas que vous pouvez utiliser le traitIlluminateNotificationsNotifiable
dans n'importe quel modèle, pas seulement dansUtilisateur
dans le modèle. 🎜🎜🎜🎜🎜Utilisation de la façade de notification🎜🎜De plus, vous pouvez envoyer des notifications via la façadeNotification
. Il est principalement utilisé lorsque vous envoyez des notifications à plusieurs entités pouvant recevoir des notifications, comme l'envoi de notifications à un ensemble d'utilisateurs. Si vous utilisez Facade pour envoyer des notifications, vous devez passer l'instance qui peut recevoir des notifications et des notifications à la méthodesend
: 🎜$when = now()->addMinutes(10); $user->notify((new InvoicePaid($invoice))->delay($when);
🎜🎜🎜🎜Send le canal spécifié🎜🎜 Chaque classe de notification aura une méthodevia
, qui détermine le canal sur lequel la notification sera envoyée. Les canaux prêts à l'emploi sontmail
,database
,broadcast
,nexmo
etslack<. /code> >. 🎜🎜🎜{tip} Si vous souhaitez utiliser d'autres canaux, tels que Telegram ou Pusher, vous pouvez consulter le site Web du canal de notification Laravel géré par la communauté. 🎜🎜La méthode
. Si la classe de notification est générée via la commandevia
reçoit une instance$notifiable
. Cette instance sera l'instance de la classe à laquelle la notification est réellement envoyée. Vous pouvez utiliser$notifiable
pour décider quels canaux utiliser pour envoyer des notifications : 🎜Notification::route('mail', 'taylor@example.com') ->route('nexmo', '5555555555') ->notify(new InvoicePaid($invoice));
🎜🎜🎜🎜🎜File d'attente de notification🎜🎜🎜{Remarque :} Vous devez configurer la file d'attente et démarrer une tâche de file d'attente avant en utilisant la file d'attente de notification. 🎜L'envoi de notifications peut prendre du temps, d'autant plus que les canaux nécessitent des appels API supplémentaires pour transmettre les notifications. Afin d'accélérer le temps de réponse de l'application, les notifications peuvent être poussées vers la file d'attente et envoyées de manière asynchrone. Pour implémenter les notifications push dans la file d'attente, la classe de notification correspondante peut implémenter l'interface
ShouldQueue
et utiliser <. trait code>Queueablemake:notification
, alors l'interface et le trait ont été importés par défaut, et vous pouvez les ajouter rapidement à la classe de notification :ShouldQueue
接口并使用Queueable
trait 。 如果通知类是通过make:notification
命令生成的,那么该接口和 trait 已经默认导入,你可以快速将它们添加到通知类:/** * 获取通知对应的邮件。 * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable){ $url = url('/invoice/'.$this->invoice->id); return (new MailMessage) ->greeting('Hello!') ->line('One of your invoices has been paid!') ->action('View Invoice', $url) ->line('Thank you for using our application!'); }
ShouldQueue
接口被添加到通知类以后,你可以像之前一样正常发送通知,Laravel 会自动检测到ShouldQueue
接口然后将通知推送到队列:/** * 获取通知邮件。 * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable){ return (new MailMessage)->view( 'emails.name', ['invoice' => $this->invoice] ); }
如果你想要延迟通知的发送,可以在通知实例后加上
delay
方法:use App\Mail\InvoicePaid as Mailable; /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return Mailable */ public function toMail($notifiable){ return (new Mailable($this->invoice))->to($this->user->email); }
按需通知
有时候你可能需要发送通知给某个用户,但是该用户不存在于应用的用户系统中,要实现这一目的,我们使用
Notification::route
方法在发送通知之前指定特别的通知路由:/** * 获取通知邮件。 * * @param mixed $notifiable * @return \Illuminate\Notifications\Message */ public function toMail($notifiable){ return (new MailMessage) ->error() ->subject('Notification Subject') ->line('...'); }
邮件通知
格式化邮件消息
如果通知支持以邮件方式发送,你需要在通知类上定义一个
toMail
方法。该方法会接收一个$notifiable
实体并返回IlluminateNotificationsMessagesMailMessage
实例。邮件消息可以包含多行文本以及对动作的调用,让我们来看一个toMail
方法的示例:<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use Notifiable; /** * 邮件通道通知的路由。 * * @param \Illuminate\Notifications\Notification $notification * @return string */ public function routeNotificationForMail($notification) { return $this->email_address; } }
{注:} 注意到我们在
toMail
方法中使用了$this->invoice->id
,你可以传递任何通知生成消息所需要的数据到通知的构造器。在这个例子中,我们注册了一条问候、一行文本、对动作的调用以及另一行文本。
MailMessage
对象提供的这些方法让格式化短小的事务邮件变得简单快捷。mail
通道会将消息组件转化为美观的、响应式的、带有纯文本副本的 HTML 邮件模板。下面是一个通过mail
/** * 获取通知的邮件表示。 * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable){ return (new MailMessage) ->subject('Notification Subject') ->line('...'); }
ShouldQueue< Interface /code> Après avoir été ajouté à la classe de notification, vous pouvez envoyer des notifications normalement comme avant. Laravel détectera automatiquement l'interface
ShouldQueue
et poussera la notification vers la file d'attente :php artisan vendor:publish --tag=laravel-notifications
Si vous souhaitez retarder. l'envoi des notifications, vous pouvez Ajouter la méthode
delay
après l'instance de notification :php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
Notifications à la demande
🎜Parfois, il peut être nécessaire d'envoyer une notification à un utilisateur, mais l'utilisateur n'existe pas dans le système utilisateur de l'application. Pour y parvenir, nous utilisons la méthodeNotification::route
. pour spécifier un itinéraire de notification spécial avant d'envoyer la notification. :🎜/** * 获取通知的邮件表示。 * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable){ $url = url('/invoice/'.$this->invoice->id); return (new MailMessage) ->subject('Invoice Paid') ->markdown('mail.invoice.paid', ['url' => $url]); }
🎜🎜Notifications par courrier
🎜🎜formats Convertir les e-mails
🎜Si la notification prend en charge l'envoi par e-mail, vous devez définir une méthodetoMail
sur la classe de notification. Cette méthode reçoit une entité$notifiable
et renvoie une instanceIlluminateNotificationsMessagesMailMessage
. Les e-mails peuvent contenir plusieurs lignes de texte ainsi que des appels à l'action. Regardons un exemple de la méthodetoMail
: 🎜@component('mail::message') # Invoice PaidYour invoice has been paid! @component('mail::button', ['url' => $url]) View Invoice @endcomponent Thanks,<br> {{ config('app.name') }} @endcomponent
🎜{Remarque :} Notez que nous utilisons
. toMail
$this->invoice->id
est utilisé dans la méthode code> Vous pouvez transmettre toutes les données requises pour que la notification génère un message au constructeur de la notification. 🎜🎜🎜Dans cet exemple, nous avons enregistré un message d'accueil, une ligne de texte, un appel à l'action et une autre ligne de texte. Les méthodes fournies par l'objetMailMessage
rendent le formatage des e-mails transactionnels courts rapide et facile. Le canalmail
transforme le composant de message en un magnifique modèle d'e-mail HTML réactif avec une copie en texte brut. Voici un exemple d'email généré via le canalmail
: 🎜🎜🎜🎜🎜🎜{Remarque :} Lors de l'envoi d'une notification par e-mail, assurez-vous que la valeur de
name
est définie dans le fichier de configurationconfig/app.php
, cette valeur sera utilisé dans L'en-tête et la fin du message de notification par courrier électronique.config/app.php
中设置了name
的值,该值将会用在邮件通知消息的头部和尾部。其他通知格式化选项
除了在通知类中定义多行文本之外,你还可以使用
view
方法来指定一个自定义的、用于渲染通知邮件的模板:@component('mail::button', ['url' => $url, 'color' => 'green']) View Invoice @endcomponent
此外,你可以从
toMail
方法中返回一个 可邮寄对象 :@component('mail::panel') This is the panel content. @endcomponent
错误消息
一些通知会告知用户错误信息,例如失败的订单支付。你可以在构建消息的时候调用
error
方法来指示该邮件消息表示错误信息。在邮件消息中使用error
方法时,动作按钮将会变成红色:@component('mail::table') | Laravel | Table | Example | | ------------- |:-------------:| --------:| | Col 2 is | Centered | | | Col 3 is | Right-Aligned | | @endcomponent
自定义接收人
通过
mail
通道发送通知时,通知系统会自动在被通知实体上查找email
属性,你可以通过在该实体上定义一个routeNotificationForMail
来自定义使用哪个邮箱地址发送通知:php artisan vendor:publish --tag=laravel-mail
自定义主题
默认情况下,邮件的主题就是格式为 「标题风格」 的通知类名,因此,如果通知类被命名为
InvoicePaid
,邮件的主题就是Invoice Paid
,如果你想要为消息指定明确的主题,可以在构建消息的时候调用subject
方法:php artisan notifications:table php artisan migrate
自定义模板
你可以通过发布通知扩展包的资源来修改邮件通知所使用的 HTML 和纯文本模板。运行完下面这个命令之后,邮件通知模板将会存放到
resources/views/vendor/notifications
目录:/** * 获取通知的数组表示。 * * @param mixed $notifiable * @return array */ public function toArray($notifiable){ return [ 'invoice_id' => $this->invoice->id, 'amount' => $this->invoice->amount, ]; }
Markdown 邮件通知
Markdown 邮件通知允许你利用邮件通知的预置模板,从而让你可以自由编写更长、更具个性化的消息。因为这些消息以 Markdown 格式编写,Laravel 还可以为它们渲染出高颜值、响应式的 HTML 模板,同时自动生成纯文本的副本。
生成消息
要生成带有相应 Markdown 模板的通知,可以在使用 Artisan 命令
make:notification
时带上--markdown
选项:$user = App\User::find(1); foreach ($user->notifications as $notification) { echo $notification->type; }
和其他邮件通知一样,使用 Markdown 模板的通知类也要定义一个
toMail
方法。不过,你可以使用markdown
方法取代构造通知的line
和action
Autres options de formatage des notifications
En plus de définir un texte multiligne dans la classe de notification, vous pouvez également utiliser la méthodeview
pour spécifier un modèle personnalisé. pour le rendu des e-mails de notification :$user = App\User::find(1); foreach ($user->unreadNotifications as $notification) { echo $notification->type; }
De plus, vous pouvez renvoyer un objet mailable à partir de la méthodetoMail
:$user = App\User::find(1); foreach ($user->unreadNotifications as $notification) { $notification->markAsRead(); }
🎜🎜Messages d'erreur h4>🎜Certaines notifications informeront les utilisateurs de messages d'erreur, tels que des échecs de paiement de commande. Vous pouvez appeler la méthode
error
lors de la construction du message pour indiquer que le message électronique représente des informations d'erreur. Lorsque vous utilisez la méthodeerror
dans un e-mail, le bouton d'action deviendra rouge : 🎜$user->unreadNotifications->markAsRead();
🎜🎜🎜Personnalisation du destinataire h3 >🎜Lors de l'envoi d'une notification via le canal
mail
, le système de notification recherchera automatiquement l'attributemail
sur l'entité notifiée. Vous pouvez définir unrouteNotificationForMail sur le canal. entité
Pour personnaliser l'adresse e-mail utilisée pour envoyer les notifications : 🎜$user = App\User::find(1); $user->unreadNotifications()->update(['read_at' => now()]);
🎜🎜🎜Personnalisation de l'objet
🎜Par défaut, le sujet de l'e-mail est le format est le nom de la classe de notification "style de titre". Par conséquent, si la classe de notification est nomméeInvoicePaid
, l'objet de l'e-mail seraInvoice Paid
. vous souhaitez spécifier un sujet explicite, vous pouvez appeler la méthodesubject
lors de la création d'un message : 🎜$user->notifications()->delete();
🎜🎜🎜Personnalisation des modèles h3>🎜Vous pouvez passer Publier les ressources du package d'extension de notification pour modifier les modèles HTML et de texte brut utilisés par les notifications par courrier électronique. Après avoir exécuté la commande suivante, le modèle de notification par e-mail sera stocké dans le répertoire
resources/views/vendor/notifications
: 🎜use Illuminate\Notifications\Messages\BroadcastMessage;/** * 获取通知的可广播表示。 * * @param mixed $notifiable * @return BroadcastMessage */ public function toBroadcast($notifiable){ return new BroadcastMessage([ 'invoice_id' => $this->invoice->id, 'amount' => $this->invoice->amount, ]); }
🎜🎜🎜Notifications par e-mail Markdown
🎜Les notifications par e-mail Markdown vous permettent de profiter de modèles prédéfinis pour les notifications par e-mail, vous donnant la liberté d'écrire des messages plus longs et plus personnalisés. Étant donné que ces messages sont écrits au format Markdown, Laravel peut également les restituer dans de superbes modèles HTML réactifs tout en générant automatiquement des copies en texte brut. 🎜🎜🎜🎜Génération d'un message
🎜Pour générer des notifications avec les modèles Markdown correspondants, vous pouvez utiliser la commande Artisanmake:notification
avec l'option--markdown
: 🎜return (new BroadcastMessage($data)) ->onConnection('sqs') ->onQueue('broadcasts');
🎜Comme les autres notifications par courrier électronique, les classes de notification utilisant des modèles Markdown doivent également définir une méthodetoMail
. Cependant, vous pouvez utiliser la méthodemarkdown
au lieu des méthodesline
etaction
de la notification du constructeur pour spécifier le nom du modèle Markdown à utiliser : 🎜Echo.private('App.User.' + userId) .notification((notification) => { console.log(notification.type); });
🎜🎜🎜 🎜Rédaction de messages
Les notifications par e-mail Markdown utilisent une combinaison de composants Blade et de syntaxe Markdown, vous permettant de créer facilement des notifications sans rompre avec les composants prédéfinis de Laravel :
<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use Notifiable; /** * 用户接收广播通知的通道。 * * @return string */ public function receivesBroadcastNotificationsOn() { return 'users.'.$this->id; } }
Composant Bouton
Le composant Bouton affiche un lien de bouton centré. Ce composant reçoit deux paramètres,
url
etcolor
facultatif. Les couleurs prises en charge sontbleu
,vert
et. rouge
. Vous pouvez ajouter n'importe quel nombre de composants de bouton à votre message :url
和可选的color
,支持的颜色有blue
,green
和red
。你可以添加任意数量的按钮组件到消息中:composer require laravel/nexmo-notification-channel
面板组件
面板组件将给定的文字区块渲染到一个面板中,并且有一个淡淡的背景色与周围的消息区分开。适用于需要引起注意的文字区块:
'nexmo' => [ 'key' => env('NEXMO_KEY'), 'secret' => env('NEXMO_SECRET'), 'sms_from' => '15556666666', ],
表格组件
表格组件允许你将一个 Markdown 表格转化为 HTML 表格。该组件接收 Markdown 表格作为其内容。表格列对齐支持使用默认的 Markdown 表格列对齐语法:
/** * Get the Nexmo / SMS representation of the notification. * * @param mixed $notifiable * @return NexmoMessage */ public function toNexmo($notifiable){ return (new NexmoMessage) ->content('Your SMS message content'); }
自定义组件
你可以导出所有 Markdown 通知组件到应用中进行自定义,要导出组件,使用 Artisan 命令
vendor:publish
来发布laravel-mail
资源标签:/** * Get the Nexmo / SMS representation of the notification. * * @param mixed $notifiable * @return NexmoMessage */ public function toNexmo($notifiable){ return (new NexmoMessage) ->content('Your unicode message') ->unicode(); }
该命令会发布 Markdown 邮件通知组件到
resources/views/vendor/mail
目录。mail
目录包含html
和markdown
目录,每个子目录中又包含各自的所有有效组件。你可以按照自己的喜好自由编辑这些组件。自定义 CSS
导出组件之后,
resources/views/vendor/mail/html/themes
目录将会包含一个默认的default.css
文件,你可以在这个文件中自定义 CSS,这样 Markdown 通知的 HTML 样式就会自动调整。{注:} 如果你想要为 Markdown 组件构建全新的主题,只需在
html/themes
目录中编写一个新的 CSS 文件并修改mail
配置文件的theme
选项即可。数据库通知
预备知识
database
通知通道会在数据表中存储通知信息,该表包含诸如通知类型以及用于描述通知的自定义 JSON 数据之类的信息。你可以在用户界面中查询这个数据表来展示通知,不过,在此之前,需要创建数据表来保存信息,你可以使用
notifications:table
/** * Get the Nexmo / SMS representation of the notification. * * @param mixed $notifiable * @return NexmoMessage */ public function toNexmo($notifiable){ return (new NexmoMessage) ->content('Your SMS message content') ->from('15554443333'); }
Composant panneau<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use Notifiable; /** * Route notifications for the Nexmo channel. * * @param \Illuminate\Notifications\Notification $notification * @return string */ public function routeNotificationForNexmo($notification) { return $this->phone; } }
Composant Table🎜🎜Le composant Table vous permet de convertir un tableau Markdown en tableau HTML. Ce composant reçoit une table Markdown comme contenu. L'alignement des colonnes du tableau prend en charge l'utilisation de la syntaxe d'alignement des colonnes du tableau Markdown par défaut : 🎜composer require laravel/slack-notification-channel
🎜🎜🎜🎜Composants personnalisés🎜🎜Vous pouvez exporter tous les composants de notification Markdown vers l'application pour la personnalisation, pour exporter le composant, utilisez la commande Artisanvendor:publish
pour publierlaravel-mail
Balise de ressource : 🎜/** * Get the Slack representation of the notification. * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable){ return (new SlackMessage) ->content('One of your invoices has been paid!'); }
🎜Cette commande publiera le composant de notification par e-mail Markdown dansressources/ vues le répertoire /vendor/mail
. Le répertoiremail
contient les répertoireshtml
etmarkdown
, chacun contenant tous ses composants valides. Vous êtes libre de modifier ces composants à votre guise. 🎜🎜CSS personnalisé🎜🎜Après avoir exporté le composant, le répertoireresources/views/vendor/mail/html/themes
contiendra un fichierdefault.css
par défaut, que vous pourrez personnaliser le CSS dans ce fichier afin que le style HTML de la notification Markdown s'ajuste automatiquement. 🎜🎜{Remarque :} Si vous souhaitez créer un nouveau thème pour les composants Markdown, écrivez simplement un nouveau fichier CSS dans le répertoire
🎜🎜🎜html/themes
et modifiezmail code> L'option
theme
du fichier de configuration suffit. 🎜Notifications de base de données
🎜🎜🎜🎜Connaissances préalables🎜🎜base de données< /code> Les canaux de notification stockent les informations de notification dans une table de données qui contient des informations telles que le type de notification et des données JSON personnalisées décrivant la notification. 🎜🎜Vous pouvez interroger cette table de données dans l'interface utilisateur pour afficher les notifications. Cependant, avant de le faire, vous devez créer une table de données pour enregistrer les informations. Vous pouvez utiliser la commande
notifications:table
pour. générer le fichier de migration puis utiliser Cela génère la table de données correspondante : 🎜/** * Get the Slack representation of the notification. * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable){ return (new SlackMessage) ->from('Ghost', ':ghost:') ->to('#other') ->content('This will be sent to #other'); }
🎜🎜🎜🎜Formater la notification de la base de données
Si la notification prend en charge l'enregistrement dans la table de la base de données, la classe de notification doit définir la méthode
toDatabase
outoArray
. Cette méthode accepte une entité$notifiable
comme paramètre et renvoie un tableau PHP natif. Les données renvoyées seront codées au format JSON et stockées dans la colonnedata
de la tablenotifications
. Regardons un exemple de la méthodetoArray
:toDatabase
或toArray
方法。此方法接受$notifiable
实体作参数并返回原生 PHP 数组。返回的数据将被编码为 JSON 并存储到notifications
表的data
列。来看一个toArray
方法示例:/** * Get the Slack representation of the notification. * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable){ return (new SlackMessage) ->from('Laravel') ->image('https://laravel.com/favicon.png') ->content('This will display the Laravel logo next to the message'); }
toDatabase
Vs.toArray
toArray
方法还可以使用broadcast
通道来判断哪些数据被广播到 JavaScript 客户端。如果针对database
和broadcast
通道分别有两个不同的数组表示,你需要定义toDatabase
方法代替toArray
方法。访问通知
一旦通知存入数据库,就需要适当的方法自通知实体访问它们。 包含在 Lareval 的默认
AppUser
模型带有IlluminateNotificationsNotifiable
trait,它的notifications
Eloquent 关联方法能返回实体通知。要获取通知,可以像其它 Eloquent 关联方法一样访问此方法。默认情况下,通知按照created_at
时间戳排序:/** * Get the Slack representation of the notification. * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable){ $url = url('/exceptions/'.$this->exception->id); return (new SlackMessage) ->error() ->content('Whoops! Something went wrong.') ->attachment(function ($attachment) use ($url) { $attachment->title('Exception: File Not Found', $url) ->content('File [background.jpg] was not found.'); }); }
若要只获取 「未读」通知,可以使用
unreadNotifications
关联方法。同样这些通知按照created_at
时间戳排序:/** * Get the Slack representation of the notification. * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable){ $url = url('/invoices/'.$this->invoice->id); return (new SlackMessage) ->success() ->content('One of your invoices has been paid!') ->attachment(function ($attachment) use ($url) { $attachment->title('Invoice 1322', $url) ->fields([ 'Title' => 'Server Expenses', 'Amount' => ',234', 'Via' => 'American Express', 'Was Overdue' => ':-1:', ]); }); }
{tip} 若要从 JavaScript 客户端访问通知,需要为应用定义一个通知控制器,它返回可通知实体的通知,比如当前用户。可以从 JavaScript 客户端向该控制器 URI 发送 HTTP 请求。
标记通知已读
通常,在用户阅览一条通知之后,你会想将其标识为「已读」。
IlluminateNotificationsNotifiable
trait 提供了markAsRead
方法,它更新数据库中通知记录的read_at
列:/** * Get the Slack representation of the notification. * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable){ $url = url('/exceptions/'.$this->exception->id); return (new SlackMessage) ->error() ->content('Whoops! Something went wrong.') ->attachment(function ($attachment) use ($url) { $attachment->title('Exception: File Not Found', $url) ->content('File [background.jpg] was *not found*.') ->markdown(['text']); }); }
可以在通知控制集合上直接使用
markAsRead
方法代替循环调用通知:<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable{ use Notifiable; /** * Route notifications for the Slack channel. * * @param \Illuminate\Notifications\Notification $notification * @return string */ public function routeNotificationForSlack($notification) { return 'https://hooks.slack.com/services/...'; } }
还可以使用指更新将所有的通知标为已读,而不从数据库中读取它们:
$user->notify((new InvoicePaid($invoice))->locale('es'));
可以使用
delete
Notification::locale('es')->send($users, new InvoicePaid($invoice));
toDatabase
Vs.toArray
toArray<. /code> Les méthodes peuvent également utiliser le canal
broadcast
pour déterminer quelles données sont diffusées vers le client JavaScript. Si vous avez deux représentations de tableau différentes pour les canauxdatabase
etbroadcast
, vous devez définir la méthodetoDatabase
au lieu detoArray code> méthode.
au lieu d'appeler les notifications en boucle : 🎜Accès aux notifications
Une fois les notifications stockées dans la base de données, des méthodes appropriées sont nécessaires pour y accéder depuis l'entité notifiante. Le modèle
AppUser
par défaut inclus avec Lareval a le traitIlluminateNotificationsNotifiable
, et sa méthode associéenotifications
Eloquent peut renvoyer des notifications d'entité. Pour recevoir des notifications, vous pouvez accéder à cette méthode comme aux autres méthodes liées à Eloquent. Par défaut, les notifications sont triées par horodatagecreated_at
:use Illuminate\Contracts\Translation\HasLocalePreference; class User extends Model implements HasLocalePreference{ /** * Get the user's preferred locale. * * @return string */ public function preferredLocale() { return $this->locale; } }
Pour obtenir uniquement les notifications "non lues", vous pouvez utiliser la méthode d'associationunreadNotifications
. Encore une fois, ces notifications sont triées par horodatagecreated_at
:$user->notify(new InvoicePaid($invoice));
{tip} Pour accéder aux notifications d'un client JavaScript, vous devez définir un contrôleur de notification pour votre application qui renvoie des notifications pour les entités notifiables. , comme l'utilisateur actuel. Les requêtes HTTP peuvent être envoyées à cet URI de contrôleur à partir d'un client JavaScript.
Marquer les notifications comme lues
Souvent, après qu'un utilisateur a lu une notification, vous souhaitez la marquer comme "lue". Le traitIlluminateNotificationsNotifiable
fournit la méthodemarkAsRead
, qui met à jour la colonneread_at
de l'enregistrement de notification dans la base de données : 🎜/** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'Illuminate\Notifications\Events\NotificationSent' => [ 'App\Listeners\LogNotification', ], ];
🎜peut être utilisé directement sur la méthode de collecte de contrôle des notifications< code>markAsRead/** * Handle the event. * * @param NotificationSent $event * @return void */ public function handle(NotificationSent $event){ // $event->channel // $event->notifiable // $event->notification // $event->response }
🎜Vous pouvez également utiliser la mise à jour du doigt pour marquer toutes les notifications comme lues sans les lire dans la base de données : 🎜<?php namespace App\Channels; use Illuminate\Notifications\Notification;class VoiceChannel{ /** * 发送指定的通知. * * @param mixed $notifiable * @param \Illuminate\Notifications\Notification $notification * @return void */ public function send($notifiable, Notification $notification) { $message = $notification->toVoice($notifiable); // Send notification to the $notifiable instance... } }
🎜Vous pouvez utiliser < La méthode code>delete code> supprime la totalité de la notification du tableau : 🎜<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use App\Channels\VoiceChannel; use App\Channels\Messages\VoiceMessage; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; class InvoicePaid extends Notification{ use Queueable; /** * 获取通知通道. * * @param mixed $notifiable * @return array|string */ public function via($notifiable) { return [VoiceChannel::class]; } /** * 获取语音表示的通知. * * @param mixed $notifiable * @return VoiceMessage */ public function toVoice($notifiable) { // ... } }
🎜🎜🎜🎜🎜Notification de diffusion🎜🎜🎜🎜🎜🎜Connaissances préliminaires🎜🎜Avant de diffuser des notifications, vous devez configurer et vous familiariser avec la diffusion d'événements de Laravel service. La diffusion d'événements permet au client JavaScript de répondre aux événements Laravel déclenchés par le serveur. 🎜🎜🎜🎜🎜Notifications de diffusion formatées
Le canal
rrreeebroadcast
diffuse des notifications à l'aide du service de diffusion d'événements de Laravel, qui permet aux clients JavaScript de capturer les notifications en temps réel. Si la notification prend en charge la diffusion, vous devez définir la méthodetoBroadcast
sur la classe de notification. Cette méthode accepte une entité$notifiable
comme paramètre et renvoie une instanceBroadcastMessage
. Les données renvoyées seront codées au format JSON et diffusées au client JavaScript. Regardons un exemple de la méthodetoBroadcast
broadcast
通道使用 Laravel 的 event broadcasting 服务广播通知,它允许 JavaScript 客户端实时捕获通知。如果通知支持广播,你就需要在通知类上定义toBroadcast
方法。此方法接受$notifiable
实体作为参数,并返回BroadcastMessage
实例。返回的数据将被编码为 JSON 并广播给 JavaScript 客户端。我们来看一个toBroadcast
方法示例广播队列配置
所有的广播通知都被放入广播队列。想要配置用于广播操作的队列连接或者队列名称,需要使用
rrreeeBroadcastMessage
的onConnection
和onQueue
方法:{tip} 除了指定的数据,广播通知还包含
type
域,它包括通知类的类名。监听通知
通知将会以格式化为
rrreee{notifiable}.{id}
的形式在私有频道上广播,因此,如果你要发送通知到 ID 为1
的AppUser
实例,那么该通知将会在私有频道App.User.1
上进行广播,如果使用了 Laravel Echo,可以使用辅助函数notification
轻松在某个频道上监听通知:自定义通知通道
如果你想要自定义被通知实体在某个通道上接收广播通知,可以在被通知实体上定义一个
rrreeereceivesBroadcastNotificationsOn
方法:短信(SMS)通知
预备知识
Laravel 基于 Nexmo 发送短信通知,在使用 Nexmo 发送通知前,需要安装对应 Composer 依赖包
rrreeelaravel/nexmo-notification-channel
:下一步,你需要在配置文件
rrreeeconfig/services.php
中进行相应配置。你可以参考以下示例配置:sms_from
配置项就是你用于发送短信消息的手机号码,你需要在 Nexmo 控制面板中为应用生成一个手机号码。格式化短信通知
如果通知支持以短信方式发送,那么你需要在通知类上定义一个
rrreeetoNexmo
方法。该方法接收一个$notifiable
实体并返回IlluminateNotificationsMessagesNexmoMessage
实例:Unicode 内容
如果你的短信消息包含 Unicode 字符,需要在构造
NexmoMessage
实例时调用unicode
rrreeeConfiguration de la file d'attente de diffusion
Toutes les notifications de diffusion sont placées dans la file d'attente de diffusion. Pour configurer la connexion à la file d'attente ou le nom de la file d'attente pour les opérations de diffusion, vous devez utiliser les méthodesonConnection
etonQueue
deBroadcastMessage
:rrreee
{tip} En plus des données spécifiées, les notifications de diffusion contiennent également le champ
🎜🎜🎜Écoute des notifications🎜🎜Les notifications seront formatées commetype
, qui contient le nom de la classe de notification.{notifiable}.{id}
dans le canal privé, donc si vous souhaitez envoyer une notification à l'instanceAppUser
avec l'ID1
, la notification sera diffusée sur le canal privéApp.User.1< /code> à diffuser. Si vous utilisez Laravel Echo, vous pouvez utiliser la fonction d'assistance
notification
pour surveiller facilement les notifications sur un canal : 🎜rrreeeCanal de notification personnalisé
🎜Si vous le souhaitez. personnaliser l'entité notifiée pour recevoir des notifications de diffusion sur un certain canal, vous pouvez définir une méthodereceivesBroadcastNotificationsOn
sur l'entité notifiée : 🎜rrreee🎜🎜🎜< h2>SMS notification🎜🎜🎜🎜Prérequis🎜🎜Laravel est basé sur Nexmo🎜 Pour envoyer des notifications par SMS, avant d'utiliser Nexmo pour envoyer des notifications, vous devez installer le package de dépendances Composer correspondantlaravel/nexmo-notification-channel
: 🎜rrreee🎜Ensuite, vous devez configurer le fichier de configurationconfig/services. Configurez en conséquence dans php
. Vous pouvez vous référer à l'exemple de configuration suivant : 🎜rrreee🎜sms_from
L'élément de configuration est le numéro de téléphone mobile que vous utilisez pour envoyer des messages SMS. Vous devez générer un numéro de téléphone mobile pour l'application dans le contrôle Nexmo. panneau. 🎜🎜🎜🎜🎜Notifications SMS formatées🎜🎜Si la notification prend en charge l'envoi par SMS, vous devez définir une méthodetoNexmo
sur la classe de notification. Cette méthode reçoit une entité$notifiable
et renvoie une instanceIlluminateNotificationsMessagesNexmoMessage
: 🎜rrreeeContenu Unicode
🎜Si votre message SMS contient des caractères Unicode, vous devez construisez-le Appelez la méthodeunicode
lorsque l'instance deNexmoMessage
: 🎜rrreee🎜🎜🎜🎜Personnaliser le numéro "envoyer"
Si vous souhaitez envoyer des notifications via un numéro différent du numéro de mobile spécifié dans le fichier de configuration
rrreeeconfig/services.php
, vous pouvez utiliserNexmoMessage
Méthodefrom
sur l'instance :config/services.php
中指定的手机号不同的其他号码发送通知,可以使用NexmoMessage
实例上的from
方法:短信通知路由
使用
rrreeenexmo
通道发送通知的时候,通知系统会自动在被通知实体上查找phone_number
属性。如果你想要自定义通知被发送到的手机号码,可以在该实体上定义一个routeNotificationForNexmo
方法:Slack 通知
预备知识
在通过 Slack 发送通知前,必须通过 Composer 安装 Slack 通知通道:
rrreee此外,你还要为 Slack 组配置一个 "Incoming Webhook" 集成。该集成会在你进行 Slack 通知路由 的时候提供一个 URL。
格式化 Slack 通知
如果通知支持通过 Slack 消息发送,则需要在通知类上定义一个
rrreeetoSlack
方法,该方法接收一个$notifiable
实体并返回IlluminateNotificationsMessagesSlackMessage
实例,该实例包含文本内容以及格式化额外文本或数组字段的 “附件”。让我们来看一个基本的toSlack
使用示例:在这个例子中,我们只发送一行简单的文本到 Slack,最终创建的消息如下:
Customizing The Sender & Recipient
你可以使用
from
和to
方法自定义发送者和接收者,from
方法接收一个用户名和 emoji 标识,而to
rrreeeRoutage des notifications SMSLors de l'utilisation du canal
rrreeenexmo
pour envoyer des notifications, le système de notification recherchera automatiquement l'attributphone_number
sur l'entité notifiée. Si vous souhaitez personnaliser le numéro de téléphone mobile auquel les notifications sont envoyées, vous pouvez définir une méthoderouteNotificationForNexmo
sur cette entité :Notifications Slack
PrérequisDe plus, vous devez également configurer le groupe Slack Une intégration "Incoming Webhook"🎜. Cette intégration fournit une URL lorsque vous acheminement des notifications Slack 🎜. 🎜🎜🎜🎜🎜Formatage des notifications Slack🎜🎜Si les notifications prennent en charge l'envoi via des messages Slack, vous devez définir une méthodeAvant d'envoyer des notifications via Slack, vous devez installer le canal de notification Slack via Composer :
rrreeetoSlack
sur la classe de notification, qui La méthode reçoit une entité$notifiable
et renvoie une instanceIlluminateNotificationsMessagesSlackMessage
qui contient du contenu textuel et des « pièces jointes » de texte supplémentaire formaté ou de champs de tableau. Regardons un exemple d'utilisation de base detoSlack
: 🎜rrreee🎜Dans cet exemple, nous envoyons simplement une simple ligne de texte à Slack, et le message final créé est le suivant : 🎜🎜🎜🎜🎜Personnalisation de l'expéditeur et du destinataire
🎜Vous pouvez personnaliser l'expéditeur et le destinataire à l'aide des méthodesfrom
etto
,La méthode from
reçoit un nom d'utilisateur et un identifiant emoji, tandis que la méthodeto
reçoit une chaîne ou un nom d'utilisateur : 🎜rrreee🎜 Vous pouvez également utiliser une image comme logo pour remplacer un emoji : 🎜rrreee 🎜🎜🎜🎜🎜 Pièces jointes Slack🎜🎜Vous pouvez également ajouter des « pièces jointes » aux messages Slack. Par rapport aux simples messages texte, les pièces jointes peuvent offrir des choix de format plus riches. Dans cet exemple, nous enverrons une notification d'une erreur d'exception survenue dans l'application, y compris un lien pour afficher plus de détails sur l'exception : 🎜rrreee🎜Le code ci-dessus générera le message Slack suivant : 🎜🎜🎜🎜🎜🎜La pièce jointe vous permet également de spécifier les données du tableau à présenter à l'utilisateur. Pour améliorer la lisibilité, le tableau donné sera affiché sous forme de tableau :
rrreeeLe code ci-dessus générera le message Slack suivant :
Contenu des pièces jointes Markdown
Si certains champs de pièce jointe contiennent du Markdown, vous pouvez utiliser la méthode
rrreeemarkdown
pour créer Slack afin d'analyser et d'afficher les champs de pièce jointe écrits au format Markdown. La méthode inclutpretext
,text
oufields
. Pour en savoir plus sur le formatage dans Slack, consultez la documentation de l'API Slack :markdown
方法来构建 Slack 用以解析并显示以 Markdown 格式编写的附件字段,该方法支持的值包括pretext
、text
或fields
。想要了解更多关于 Slack 格式化的信息,查看 Slack API 文档:Slack 通知路由
要路由 Slack 通知到适当的位置,需要在被通知的实体上定义一个
rrreeerouteNotificationForSlack
方法,这将会返回通知被发送到的 Webhook URL。Webhook URL 可通过在 Slack 组上添加一个 "Incoming Webhook" 服务来生成:本地化通知
Laravel 允许您以当前语言环境之外的其他语言发送通知,并且会在通知队列时记住该语言环境。
要实现这一点,
rrreeeIlluminateNotificationsNotification
类提供了一个locale
方法来设置所需的语言。在格式化通知时,应用程序将更改为此语言设置,然后在格式化完成后还原为以前的语言设置:多重通知的本地化也可通过
rrreeeNotification
Facade 实现:用户首选语言区域设置
有些情况下,应用程序保存了每个用户的首选语言区域设置。通过在模型上实现
rrreeeHasLocalePreference
契约,可以指定 Laravel 在发送通知时使用用户保存的首选语言设置:实现接口后,Laravel 将在向模型发送通知和邮件时自动使用首选区域设置。因此,使用此接口时不需要调用
rrreeelocale
方法:通知事件
当通知被发送后,通知系统会触发
rrreeeIlluminateNotificationsEventsNotificationSent
事件,该事件实例包含被通知的实体(如用户)和通知实例本身。你可以在EventServiceProvider
中为该事件注册监听器:{提示} 在
EventServiceProvider
中注册监听器之后,使用 Artisan 命令event:generate
可以快速生成监听器类。在事件监听器中,可以访问事件的
rrreeenotifiable
、notification
和channel
属性了解通知接收者和通知本身的更多信息:自定义通道
Laravel 为我们提供了多种通知通道,但是尝试编写自定义通道驱动以通过其他通道发送通知,也很简单。首先定义一个包含
🎜send
方法的类,该方法接收两个参数:$notifiable
和$notification
rrreeeRoutage des notifications Slack
🎜Pour acheminer les notifications Slack vers l'emplacement approprié, vous devez définir unrouteNotificationForSlack sur le code de l'entité notifiée. >, cela renverra l'URL du Webhook à laquelle la notification est envoyée. Les URL Webhook peuvent être générées en ajoutant un service « Webhook entrant » sur un groupe Slack : 🎜rrreee🎜🎜
Localisation des notifications
🎜Laravel vous permet d'envoyer notifications dans une langue autre que les paramètres régionaux actuels, et les paramètres régionaux seront mémorisés lors de la notification à la file d'attente. 🎜🎜Pour y parvenir, la classeIlluminateNotificationsNotification
fournit une méthodelocale
pour définir la langue souhaitée. Lors du formatage d'une notification, l'application passera à ce paramètre de langue, puis reviendra au paramètre de langue précédent une fois le formatage terminé : 🎜rrreee🎜La localisation de plusieurs notifications est également possible via la façadeNotification
: 🎜rrreeeParamètres régionaux préférés de l'utilisateur
🎜Dans certains cas, l'application enregistre les paramètres régionaux préférés de chaque utilisateur. En implémentant le contratHasLocalePreference
sur votre modèle, vous pouvez spécifier que Laravel utilise le paramètre de langue préférée enregistré par l'utilisateur lors de l'envoi de notifications : 🎜rrreee🎜Après avoir implémenté l'interface, Laravel utilisera automatiquement la préférence lors de l'envoi de notifications et e-mails aux paramètres régionaux du modèle. Il n'est donc pas nécessaire d'appeler la méthodelocale
lors de l'utilisation de cette interface : 🎜rrreee🎜🎜Événements de notification
🎜Lorsque la notification est Après l'envoi, le système de notification déclenchera l'événementIlluminateNotificationsEventsNotificationSent
. L'instance d'événement contient l'entité notifiée (telle que l'utilisateur) et l'instance de notification elle-même. Vous pouvez enregistrer un écouteur pour cet événement dansEventServiceProvider
: 🎜rrreee🎜{Tip} Après avoir enregistré un écouteur dans
🎜Dans l'écouteur d'événement, vous pouvez accéder aux propriétésEventServiceProvider
, utilisez la commande Artisanevent : generate
peut générer rapidement des classes d'écoute. 🎜notifiable
,notification
etchannel
de l'événement pour en savoir plus sur la notification. destinataire et la notification elle-même Plus d'informations sur : 🎜rrreee🎜🎜Canaux personnalisés
🎜Laravel nous fournit plusieurs canaux de notification, mais essayez d'écrire un canal de notification personnalisé Les pilotes de canal permettant d'envoyer des notifications via d'autres canaux sont également simples. Définissez d'abord une classe contenant la méthodesend
, qui reçoit deux paramètres :$notifiable
et$notification
:🎜rrreeeUne fois la classe du canal de notification définie, vous pouvez utiliser la méthode
rrreeevia
pour renvoyer le nom de la classe dans l'application :Cet article a été publié pour la première fois sur le site LearnKu.com.
- Connaissances préliminaires