Уведомления
Содержание:
Введение
Дополнительно к поддержке отправке сообщений,
Ларавел предоставляет поддержку уведомлений для различных каналов вкючая почту,
СМС (через Nexmo), и Slack.
Уведомления также могут храниться в базе данных, так их можно показать в вашем
веб-интерфейсе.
Обычно, уведомления это коротки, инфомративные сообщения, которые информирую пользователей
от том, что произошло в вашем приложении. Например, если вы пишите приложение оплаты,
вы должны отправлять уведомление "Счет Оплачен" вашим пользователям через
электронную почту и СМС каналы.
Создание уведомлений
В Ларавел, каждое уведомление представлено одним классом (обычно располагается в
директории app/Notifications
). Не нужно беспокоиться, если вы не видите эту
директорию в вашем приложении, она будет создана для вас при запуске команды Artisan
make:notification
:
php artisan make:notification InvoicePaid
Такая команда разместитт новый класс в вашей директории app/Notifications
.
Каждый класс уведомлений содержит метод via
и большое количество
методов построения сообщений (таких как toMail
или toDatabase
),
которые преобразовывают уведомление в сообщение, оптимизированное для каждого конкретного
канала.
Отправка уведомлений
Использование трейта Notifiable
Уведомления могут быть отправлены двумя способами: используя метод notify
трейта Notifiable
или используя фасад Notification
. Во-первых,
давайте обратимся к реализации через трейт:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
}
Этот трейт используется стандартной моделью App\User
и содержит один метод,
который можно использовать для отправки уведомлений: notify
. Метод notify
ожидает получения экземпляр уведомления:
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice));
Вы не ограничены включать трейт только модели User
.
Вы можете использовать трейт Illuminate\Notifications\Notifiable
для любой из ваших моделей.
Использование фасада Notification
Как альтернатива, вы можете отправить уведомления через фасад Notification
.
Этот очень полезно, когда вам необходимо отправить уведомление нескольким лицам,
таким как коллекции пользователей. Чтобы отправить уведомление используя фасад, передайте всех
получателей и экземпляр уведомлени в метод send
:
Notification::send($users, new InvoicePaid($invoice));
Указание каналов доставки
Каждый класс имеет метод via
, который определяет в какие каналы уведомление
будет доставлено. Уведомления могут отсылаться на следующие каналы:
mail
, database
, broadcast
, nexmo
, и slack
.
Если вы хотите использовать другие каналы доставки такие как Telegram или Pusher,
просмотрите сайт сообщества
Каналы уведомления Ларавел.
Метод via
получает экземпляр $notifiable
, который будет экземпляром класса,
в который уведомление и будет отправлено. Вы можете исопльзовать $notifiable
для определения
в какие каналы уведомления должны быть доставлены:
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database'];
}
Очереди уведомлений
Перед постановкой уведомлений в очередь, вы должны настроить ваши очереди
и
запустить процесс.
Отправка уведомлений может занимать время, особенной если каналам нужны внешние API
для проведения операции. Чтобы ускорить время отклика приложения, давайте поставим уведомления
в очередь путём добавления интерфейса ShouldQueue
и трейта Queueable
в ваш класс. Трейт и интерфейс уже импортированы для всех уведомлений, сгенерированных
с использованием команды make:notification
, поэтому их можно легко добавлять
их в ваш класс уведомления:
<?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
в ваше уведомление, вы можете отправить
уведомление как обычное. Ларавел определить интерфейс ShouldQueue
для класса
и автоматически поставить в очередь доставку уведомления:
$user->notify(new InvoicePaid($invoice));
Если вы хотите отложить доставку уведомлений, вы можете добавить цепочкой метод delay
в экземпляр уведомления:
$when = now()->addMinutes(10);
$user->notify((new InvoicePaid($invoice))->delay($when));
Уведомления по требованию
Иногда вам может потребоваться отправить уведомления кому-нибудь, кто не является
пользователем приложения. Используя метод Notification::route
, вы можете
указать дополнительную информацию в том числе и маршруты до отправки уведомления:
Notification::route('mail', 'taylor@example.com')
->route('nexmo', '5555555555')
->notify(new InvoicePaid($invoice));
Почтовые уведомления
Если уведомление высылается как сообщение через электронную почту, вы должны определить
метод toMail
как класс уведомления. Этот метод получать экземпляр $notifiable
и должен вернуть экземпляр Illuminate\Notifications\Messages\MailMessage
.
Сообщения могут содержать как текст так и "действия". Давайте взглянем на пример
метода toMail
:
/**
* Get the mail representation of the notification.
*
* @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!');
}
Стоит отметить, что мы используем $this->invoice->id
в нашем методе toMail
.
Вы можете передать любые данные необходимые для генерации сообщения в конструктор уведомления.
В этом примере мы регистрируем приветствие в качестве строкового текста, призываем к действию и
далее еще строка текста. Такие методы предоставленные MailMessage
делают форматирование
простых писем быстрым и простым. Канал работы с почтой передаст компоненты сообщения в замечательный и
адаптивный шаблон HTML с содержимым в виде текста. Далее приведен пример электронного письма,
сгененрированного каналом mail
:
При отправке уведомлений в виде электронных писем, вам обязательно нужно установить
значение name
в файле конфигурации config/app.php
. Это значение
будет использовано в шапке и подвале ваших электронных писем-уведомлений.
Другие опции форматирования уведомлений.
Вместо определения "лний" текста в классе уведомления, вы можете использовать метод view
для указания пользовательского шаблона, который будет использоваться при генерации уведомлений
электронного сообщения:
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)->view(
'emails.name', ['invoice' => $this->invoice]
);
}
Дополнительно, вы можете вернуть объект почты из метода toMail
:
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);
}
Сообщения ошибок
Некоторые уведомления информируют пользователя об ошибках, таких как неудача при проведении
платежного поручения. Вы можете пометить такие сообщения как сообщение об ошибке используя
метод error
при построении сообщения. При использовании метода error
для сообщения почты, кнопка действия будет не красной и не синей:
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Message
*/
public function toMail($notifiable)
{
return (new MailMessage)
->error()
->subject('Notification Subject')
->line('...');
}
Настройка отправителя
По умолчанию, отправитель электронных сообщений определен в файле конфигурации config/mail.php
.
Однако, вы можете указать адрес отправителя для указания уведомлений,
используя метод from
:
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->from('test@example.com', 'Example')
->line('...');
}
Настройка получателя
При отправке уведомлений через канал mail
, система уведомлений автоматически
ищет свойство email
для объекта уведомления. Вы можете настроить какой адрес
электронной почты нужно использовать для доставки уведомления путём определения метода
routeNotificationForMail
для экземпляра объекта:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* Route notifications for the mail channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @return string
*/
public function routeNotificationForMail($notification)
{
return $this->email_address;
}
}
Настройка темы
По умолчанию, тема элетронного письма является именем класса уведомления переформатированный
в "Заглавные буквы". Поэтому, если название класса уведомления будет InvoicePaid
,
темя электронного сообщения будет Invoice Paid
. Если вы хотите указать тему напрямую
для сообщения, вы можете вызвать метод subject
при построении вашего сообщения:
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->subject('Notification Subject')
->line('...');
}
Настройка шаблонов
Вы можете изменить HTML и шаблон обычного текстового шаблона письма уведомления
путём публикации ресурсов пакета уведомления. После запуска этой команды, шаблоны
письма уведомления будут расположены в директории resources/views/vendor/notifications
:
php artisan vendor:publish --tag=laravel-notifications
Предпросмотр почтовых уведомлений
При проектировании шаблона письма уведомления, удобно организовать быстрый просмотр содеражиня письма
в браузере как обычный шаблон Blade. По этой причине, Ларавел позволяет вам возвращать
любое электронное сообщение сгенерированное почтовым уведомлением напрямую или из замыкания или контроллера.
При возвращении MailMessage
, он будет отрисаван и показан в браузере, позволяя вам
быстро просматривать дизайн сообщения без необходимости отправки сообщения на электронный ящик:
Route::get('mail', function () {
$invoice = App\Invoice::find(1);
return (new App\Notifications\InvoicePaid($invoice))
->toMail($invoice->user);
});
Шаблоны почтовых уведомлений
Разметка Markdown для почтовых уведомлений позволяет получить преимущество встроенных шаблонов писем,
в то же время давая свободу для написания длинных, сообщений на ваш вкус. В силу того,
что сообщения написаны в Markdown, Ларавел получает как красивые адаптвные шаблоны для сообщений,
так и в автоматическом режиме генерирует обыкновенную текстовую копию сообщения.
Генерация сообщения
Чтобы сгенерировать уведомление с соответсвующим шаблоном Markdown, вы можете использовать
опцию --markdown
для команды Артизан make:notification
:
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
Как и для других почтовых уведомлений, уведомления использующие шаблон Markdown должны
определить метод toMail
для класса уведомления. Однако, вместо использования
методов line
и action
для построения уведомления, можно применить
метод markdown
для указания имени используемого шаблона Markdown:
/**
* Get the mail representation of the 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]);
}
Написание сообщения
Разметка для почты Markdown использует комбинацию компонентов Blade и синтаксис Markdown,
что позволяет легко строить уведомления используя предварительно созданные уведомления Ларавел:
@component('mail::message')
# Invoice Paid
Your invoice has been paid!
@component('mail::button', ['url' => $url])
View Invoice
@endcomponent
Thanks,<br>
{{ config('app.name') }}
@endcomponent
Компонент Button
Компонент Button генерирует центрированную ссылку в виде кнопки. Компонент принимает два аргумента,
обязательный url
и необязательный color
, который отвечает за цвет.
Поддерживаются следующие цвета blue
, green
, и red
.
Вы можете добавить так много кнопок в уведомление, как посчитаете нужным:
@component('mail::button', ['url' => $url, 'color' => 'green'])
View Invoice
@endcomponent
Компонент Panel
Компонент Panel генерирует данный блок текста в панел, у которой немного отличается цвет фона
от остального компонента. Это позволяет вам направить внимание на данный блок текста:
@component('mail::panel')
This is the panel content.
@endcomponent
Компонент Table
Компонент Table позволяет вам трансформировать таблицу Markdown в такблицу HTML.
Компонент принимает таблицу Markdown в качестве содержимого. Выравнивание колонок таблицы
поддерживается благодаря внутреннм возможностям базового синтаксиса Markdown:
@component('mail::table')
| Laravel | Table | Example |
| ------------- |:-------------:| --------:|
| Col 2 is | Centered | $10 |
| Col 3 is | Right-Aligned | $20 |
@endcomponent
Настройка компонента
Вы можете экспортировать все компоненты Markdown для уведомлений в ваше прилоежение для настройки.
Чтобы экспортировать компоненты, используйте команду Artisan vendor:publish
с тегом
laravel-mail
для публикации материалов:
php artisan vendor:publish --tag=laravel-mail
Такая команда опубликует компоненты Markdown в директорию resources/views/vendor/mail
.
Папка mail
будет содержать папки html
и text
, каждая из которых,
содержит соответсвующее представление каждого доступного компонента.
Вы можете легко настроить эти компоненты так, как считаете нужным.
Настройка CSS
После экспорта компонентов, папка resources/views/vendor/mail/html/themes
будет содержать файл default.css
. Вы можете настроить стили в этом файле,
и они автоматически будут вписаны внутрь представления HTML для ваших уведомлений Markdown.
Если вы хотите построить полностью новую тему для Markdown компонентов в Ларавел,
вы можете разместить CSS файл внутри директории html/themes
. После названия и сохранения
вашего файла CSS, обновисте опцию theme
для файла конфигурации mail
так,
что название соотвествовало названию вашей новой темы.
Для настройки темы для индивидульаных уведомлений вы можете вызвать метод theme
во время построения сообщения электронной почты в качестве уведомления.
Метод theme
принимает имя темы, которая должна быть использована
при отправке уведомления:
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->theme('invoice')
->subject('Invoice Paid')
->markdown('mail.invoice.paid', ['url' => $url]);
}
Уведомления БД
Требования
Канал уведомлений database
хранит информацию об уведомлениях в таблицах базы данных.
Эта таблица будет содержать информацию, такую как тип уведомления и данных пользователя
описывающее уведомления в формате JSON.
Вы можете делать поиск по таблице для того, чтобы показать уведомления в интерфесе вашего
приложения пользотелю. Но перед тем как сделать это, вам может понадобиться создать
таблицу базу данных для хранения уведомлений. Вы можете использовать команду
notifications:table
для генерации миграций с соответсвующей схемой:
php artisan notifications:table
php artisan migrate
При наличии поддержки сохранения уведомлений в базе данных, вы должны определить
метод toDatabase
или toArray
для класса уведомления.
Этот метод будет получать $notifiable
и вернёт PHP массив. Возвращаемый массив
будет преобразован в JSON и сохранёт в колонке data
вашей таблицы notifications
. Давайте посмотрим на пример метода
toArray
:
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
];
}
toDatabase
против toArray
Метод toArray
также используется каналом broadcast
для определения
данных необходимых для трансляции на ваш JavaScript клиент. Если вы бы хотели видеть
2 различные реализации для каналов database
и broadcast
, вам необходимо
определить метод toDatabase
вместо метода toArray
.
Доступ к уведомлениям
После того, как уведомления были сохранены в базе данных, вам нужен удобный способ получить доступ
к ним из уведомлений. Трейт Illuminate\Notifications\Notifiable
,
который включён в базовую модель Ларавел App\User
,
включает отношение Eloquent notifications
, которое возвращает уведомления для объекта.
Чтобы поймать уведомления, вы можете получить доступ к этому методу как и к любым другим
отношениям Eloquent. По умолчанию, уведомления будут отсортированы по
временной отметке created_at
:
$user = App\User::find(1);
foreach ($user->notifications as $notification) {
echo $notification->type;
}
Если вы хотите получить только "unread" (непрочитанные) уведомления, вы можете
использовать отношение unreadNotifications
. Опять же, эти уведомления
будут отсортированы по временной отметке created_at
:
$user = App\User::find(1);
foreach ($user->unreadNotifications as $notification) {
echo $notification->type;
}
Для получения уведомлений из клиента JavaScript, вам необходимо определить контроллер для уведомления
для вашего приложения, который и вернёт уведомления. После чего необходимо сделать
HTTP запрос на соответсвующий URI контроллера из клиента JavaScript.
Отметка уведомления как прочитанного
Обычно, вы захотите отметисть уведомление как "read" (прочтённое),
когда пользователь просматрел его. Трейт Illuminate\Notifications\Notifiable
предоставляет метод markAsRead
, который обновляет значение колонки
read_at
в базе данных:
$user = App\User::find(1);
foreach ($user->unreadNotifications as $notification) {
$notification->markAsRead();
}
Вместо перебора через каждое уведомление, вы можете использовать метод
markAsRead
напрямую для коллекции уведомлений:
$user->unreadNotifications->markAsRead();
Вы можоте также использовать запрос на массовое обновление, чтобы отметить уведомления как прочитанные
без получения их из базы данных:
$user = App\User::find(1);
$user->unreadNotifications()->update(['read_at' => now()]);
Вы можете удалить delete
уведомления для того, чтобы убрать
их из таблицы полностью:
$user->notifications()->delete();
Уведомления в трансляциях
Требования
Перед трансляцией уведомлений, вы должны быть знакомы с
сервисами трансляции Ларавел, также их нужно настроить.
Вещание события даёт прекрасный способ отреагировать на запущеные Ларавел события сервера
из вашего клиента JavaScript.
Канал broadcast
вещает уведомления используя
сервисы трансляции Ларавел,
что позволяет вашему клиенту JavaScript получать уведомления в режиме реального времени.
Если уведомление поддерживает ващание, вы можете определить
метод toBroadcast
на класс уведомления. Этот класс получает $notifiable
,
а вернуть должен экземпляр BroadcastMessage
.
Если метод toBroadcast
не существует, метод toArray
будет использован
для сбора данных, которые должны быть транслированы. Возвращаемые данные будут закодированы
в JSON и будет транслироваться в JavaScript клиент. Давайте рассмотрим пример реализации
метода toBroadcast
:
use Illuminate\Notifications\Messages\BroadcastMessage;
/**
* Get the broadcastable representation of the notification.
*
* @param mixed $notifiable
* @return BroadcastMessage
*/
public function toBroadcast($notifiable)
{
return new BroadcastMessage([
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
]);
}
Конфигурация очереди трансляции
Все уведомления собраны в очередь для трансляции. Если вы хотите настроить
соединение или имя очереди, которая используется для постановки в очередь операций трансляции,
вы можете использовать методы onConnection
и onQueue
для
BroadcastMessage
:
return (new BroadcastMessage($data))
->onConnection('sqs')
->onQueue('broadcasts');
Дополнительно к данным, которые вы указывате, уведомления трансляции будут также
содержать поле type
содержащее имя класса уведомления.
Прослушивание уведомлений
Уведомления будут транслироваться на частный канал отформатированному с использованием
соглашения {notifiable}.{id}
. Поэтому, если вы отправляете
уведомление в экземпляр App\User
с ID 1
, уведомление будет
транслироваться на канале App.User.1
. При использовании
Echo,
вы можете легко прослушивать канал на уведомления используя метод-помощник notification
:
Echo.private('App.User.' + userId)
.notification((notification) => {
console.log(notification.type);
});
Настройка канала уведомления
Если вы хотите настроить какой канал получает вещание уведомлений, вы можете определить
метод receivesBroadcastNotificationsOn
для сущности уведмления:
<?php
namespace App;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The channels the user receives notification broadcasts on.
*
* @return string
*/
public function receivesBroadcastNotificationsOn()
{
return 'users.'.$this->id;
}
}
SMS уведомления
Требования
Отправка уведомлений SMS в Ларавел осуществляется через Nexmo.
Чтобы начать пользоваться сервисом Nexmo, вам необъодимо установить пакет Composer
laravel/nexmo-notification-channel
:
composer require laravel/nexmo-notification-channel
Далее, вам необходимо добавить немного опций конфигурации в ваш файл конфигурации config/services.php
.
Можно просто копировать пример конфигурации для начала:
'nexmo' => [
'key' => env('NEXMO_KEY'),
'secret' => env('NEXMO_SECRET'),
'sms_from' => '15556666666',
],
Опция sms_from
— это номер телефона, с которого будет отправляться SMS сообщения.
Вы должны сгенерировать номер телефона для вашего приложения в панели управления Nexmo.
Если есть возможность отправки уведомлений как SMS, вы должны определить метод toNexmo
в классе уведомления. Этот метод будет получать объект $notifiable
и должен вернуть
экземпляр Illuminate\Notifications\Messages\NexmoMessage
:
/**
* 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');
}
Элементы содержания в формате Юникод
Если ваше SMS сообщение содержить символы в формате Юникода, вы должны вызвать
метод unicode
, при построении экземпляра NexmoMessage
:
/**
* 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();
}
Настройка номера "от"
Если вы хотите высылать некоторые уведомления с номера телефона, который отличается
от указанного в файле config/services.php
, вы можете использовать метод
на экзепляр NexmoMessage
:
/**
* 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');
}
Маршруты SMS уведомлений
Чтобы уведомления Nexmo нашли нужный номер телефона, определите метод
routeNotificationForNexmo
для вашего объекта уведомления:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
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_number;
}
}
Уведомления Slack
Требования
Перед тем, как высылать уведомления через Slack, вы должны установить канал уведомления
через Композер:
composer require laravel/slack-notification-channel
Вам также необходимо настроить входящие
"Веб-хуки"
для вашей команды Slack. Эта интеграция предоставит вам URL, который можно использовать
для настройки маршрутов уведомлений Slack.
Если уведомление поддерживает возможность быть отправленым в качестве сообщения Slack,
вы должны определить метод toSlack
для класса уведомления.
Этот метод получит объект $notifiable
и должен вернуть экземпляр
Illuminate\Notifications\Messages\SlackMessage
. Сообщения Slack могут содержать
как текстовый контент, так и вложения, которые формарирую дополнительный текст или массив полей.
Давайте взглянем на базовый пример toSlack
:
/**
* 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!');
}
Настройка отправителя и получателя
Вы можете использовать методы from
и to
для настройки отправителя и получателя.
Метод from
принимает имя пользователя и спецсимволы "эмоджи", в то время как метод
to
принимает канал или имя пользователя:
/**
* 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');
}
Также можно использовать изображение в качестве логотипа вместо эмоджи:
/**
* 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');
}
Вложения Slack
Вы также можете добавить вложения в сообщения Slack. Вложения дают возможность
богатого форматирования текста в отличие от обычного текста. В следующем примере
мы отправим уведомление ошибки о возникшем исключении в приложении, которое будет
содержать ссылку с большей информацией об исключении при переходе:
/**
* 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.');
});
}
Вложения также позволяют вам указать массив данных, которые должны быть представлены пользователю.
Выбранные данные будут присутствовать в формате таблицы для более простого восприятия:
/**
* 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' => '$1,234',
'Via' => 'American Express',
'Was Overdue' => ':-1:',
]);
});
}
Разметка Markdown для контента вложений
Если некоторые из ваших полей вложения содержат Markdown, вы можете использовать
метод markdown
, чтобы научить Slack воспринимать и отображать
данные поля вложения как текст в формате Markdown. Значения, принимаемые этим методом
следующие: pretext
, text
, и / или fields
.
Для получения большей информации о форматировании вложений, проверьте документацию
Slack:
/**
* 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']);
});
}
Маршруты Slack уведомлений
Чтобы привести уведомления Slack в нужную локацию,
определите метод routeNotificationForSlack
для объекта уведомления.
В результате должен вернуться веб-хук URL, на которое будет доставлено уведомление.
Веб-хук URL можете быть сгенерирован путём добавления сервия "входящих веб-хуков"
в ваше сообщество Slack:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
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/...';
}
}
Локализация уведомлений
Ларавел позволяет вам отсылать уведомления в локали отличной от текущего языка.
Даже больше, Ларавел может запомнить эту локаль, если уведомление добавлено в очередь.
Чтобы справиться с такой задаче класс Illuminate\Notifications\Notification
предлагает метод locale
для установки необходимого языка. Приложение поменяет
локаль при подготовке уведомления и даже вернёт локаль назад, после окончательной
подготовки локали:
$user->notify((new InvoicePaid($invoice))->locale('es'));
Через фасад Notification
можно добиться локализации нескольких объектов:
Notification::locale('es')->send($users, new InvoicePaid($invoice));
Выбранные пользователем локали
Иногда, приложение хранит локаль, выбранную каждым пользователейм. Расширением контракта
HasLocalePreference
для вашей модели уведомления, вы можете научить Ларавел
использовать сохранённую локаль при отправке уведомлений:
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;
}
}
После реализации интерфейса, Ларавел автоматически использует выбранную локаль при отправке
уведмолений и электронных сообщение в модель. Поэтому, нет необходимости вызывать метод
locale
прн использовании этого интерфейса:
$user->notify(new InvoicePaid($invoice));
События уведомлений
Когда уведомление отправлено, событие Illuminate\Notifications\Events\NotificationSent
запускается системой уведомлений. Внутри содержится как экземпляр самого уведомления,
так и "уведомляющую" сущность. Вы можете зарегистрировать слушателей для этого события
в вашем EventServiceProvider
:
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Notifications\Events\NotificationSent' => [
'App\Listeners\LogNotification',
],
];
После регистрации слушателей в вашем EventServiceProvider
используйте
команду Artisan event:generate
для быстрой генерации классов слушателя.
Внутри слушателя события, вы можете получить доступ к свойтсвам события таким как:
notifiable
, notification
, и channel
для получения
большей информации о получателе уведомления или об самом уведомлении:
/**
* Handle the event.
*
* @param NotificationSent $event
* @return void
*/
public function handle(NotificationSent $event)
{
// $event->channel
// $event->notifiable
// $event->notification
// $event->response
}
Пользовательские каналы
В состав Ларавел уже включены разнообразные каналы уведомлений, но если вы хотите,
то можно написать ваши собственные драйверы для доставки уведомлений через другие каналы.
Ларавел позволяет сделать это легко. Для начала, необходимо определить класс,
который содержит метод send
. Метод должен получать два аргумента:
$notifiable
and a $notification
:
<?php
namespace App\Channels;
use Illuminate\Notifications\Notification;
class VoiceChannel
{
/**
* Send the given notification.
*
* @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...
}
}
После определения класса канала уведомления, вы можете вернуть имя класса
из метода для любых ваших уведомлений:
<?php
namespace App\Notifications;
use App\Channels\Messages\VoiceMessage;
use App\Channels\VoiceChannel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
class InvoicePaid extends Notification
{
use Queueable;
/**
* Get the notification channels.
*
* @param mixed $notifiable
* @return array|string
*/
public function via($notifiable)
{
return [VoiceChannel::class];
}
/**
* Get the voice representation of the notification.
*
* @param mixed $notifiable
* @return VoiceMessage
*/
public function toVoice($notifiable)
{
// ...
}
}