Вступление
В дополнение к поддержке отправки электронной почты, Laravel поддерживает отправку уведомлений по различным каналам доставки, включая почту, SMS (через Nexmo ) и Slack . Уведомления также могут храниться в базе данных, поэтому они могут отображаться в вашем веб-интерфейсе.
Как правило, уведомления должны быть короткими информационными сообщениями, которые уведомляют пользователей о том, что произошло в вашем приложении. Например, если вы пишете приложение для выставления счетов, вы можете отправить своим пользователям уведомление «Оплачен счет» через каналы электронной почты и SMS.
Создание уведомлений
В Laravel каждое уведомление представлено одним классом (обычно хранящимся в каталоге). Не беспокойтесь, если вы не увидите этот каталог в своем приложении, он будет создан для вас при запуске команды Artisan:app/Notifications
make:notification
php artisan make:notification InvoicePaid
Эта команда поместит новый класс уведомлений в ваш каталог. Каждый класс уведомлений содержит метод и переменное число методов построения сообщений (таких как или ), которые преобразуют уведомление в сообщение, оптимизированное для этого конкретного канала.app/Notifications
via
toMail
toDatabase
Отправка уведомлений
Использование черты Notifiable
Уведомления могут быть отправлены двумя способами: с помощью notify
метода Notifiable
черты или с помощью Notification
фасада . Во-первых, давайте рассмотрим, используя черту:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
}
Эта черта используется по умолчанию модели и содержит один метод , который может быть использован для отправки уведомлений: . Метод ожидает получить экземпляр уведомления:App\User
notify
notify
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice));
Помните, что вы можете использовать эту черту на любой из ваших моделей. Вы не ограничены только включением этого в свою модель.
Illuminate\Notifications\Notifiable
User
Использование фасада уведомлений
Кроме того, вы можете отправлять уведомления через Notification
фасад . Это полезно, в первую очередь, когда вам нужно отправить уведомление нескольким объектам, подлежащим уведомлению, например, группе пользователей. Чтобы отправить уведомления с использованием фасада, передайте все уведомляемые объекты и экземпляр уведомления send
методу:
Notification::send($users, new InvoicePaid($invoice));
Указание каналов доставки
У каждого класса уведомлений есть via
метод, который определяет, по каким каналам будет доставлено уведомление. Уведомления могут быть отправлены на mail
, database
, broadcast
, nexmo
, и slack
каналах.
Если вы хотите использовать другие каналы доставки, такие как Telegram или Pusher, посетите веб-сайт Laravel Notification Channels, управляемый сообществом .
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\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class InvoicePaid extends Notification implements ShouldQueue
{
use Queueable;
// ...
}
После того, как ShouldQueue
интерфейс был добавлен к вашему уведомлению, вы можете отправить уведомление как обычно. Laravel определит 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 с простым текстом.
При отправке почтовых уведомлений обязательно установите
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\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
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;
}
}
Настройка предмета
По умолчанию темой письма является имя класса уведомления, отформатированного в «case title». Итак, если ваш класс уведомлений назван 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. По этой причине Laravel позволяет вам возвращать любое почтовое сообщение, сгенерированное почтовым уведомлением, непосредственно из закрытия маршрута или контроллера. Когда MailMessage
возвращается, он будет отображен и отображен в браузере, что позволит вам быстро просмотреть его дизайн, не отправляя его на фактический адрес электронной почты:
Route::get('mail', function () {
$invoice = App\Invoice::find(1);
return (new App\Notifications\InvoicePaid($invoice))
->toMail($invoice->user);
});
Уценка почтовых уведомлений
Почтовые уведомления с разметкой позволяют использовать предварительно созданные шаблоны почтовых уведомлений, предоставляя при этом больше свободы для написания более длинных настраиваемых сообщений. Поскольку сообщения написаны в Markdown, Laravel может создавать красивые, отзывчивые HTML-шаблоны для сообщений, а также автоматически генерировать простой текстовый аналог.
Генерация сообщения
Чтобы создать уведомление с соответствующим шаблоном Markdown, вы можете использовать --markdown
опцию команды Artisan: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, которые позволяют легко создавать уведомления, используя предварительно созданные компоненты уведомлений Laravel:
@component('mail::message')
# Invoice Paid
Your invoice has been paid!
@component('mail::button', ['url' => $url])
View Invoice
@endcomponent
Thanks,<br>
{{ config('app.name') }}
@endcomponent
Компонент кнопки
Компонент кнопки отображает ссылку по центру кнопки. Компонент принимает два аргумента, a url
и необязательный color
. Поддерживаемые цвета blue
, green
и red
. Вы можете добавить в уведомление столько компонентов кнопок, сколько пожелаете:
@component('mail::button', ['url' => $url, 'color' => 'green'])
View Invoice
@endcomponent
Компонент панели
Компонент панели отображает данный блок текста на панели, цвет фона которой немного отличается от остальной части уведомления. Это позволяет вам обратить внимание на данный блок текста:
@component('mail::panel')
This is the panel content.
@endcomponent
Компонент таблицы
Компонент 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
После экспорта компонентов каталог будет содержать файл. Вы можете настроить CSS в этом файле, и ваши стили будут автоматически встроены в HTML-представления ваших уведомлений об уценке.resources/views/vendor/mail/html/themes
default.css
Если вы хотите создать совершенно новую тему для компонентов Markdown, напишите новый CSS-файл в каталоге и измените опцию вашего файла конфигурации.
html/themes
theme
Уведомления базы данных
Предпосылки
Канал 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. Если вы хотели бы иметь два различных представления массива для database
и broadcast
каналов, вы должны определить toDatabase
метод вместо toArray
метода.
Доступ к уведомлениям
После того, как уведомления сохранены в базе данных, вам нужен удобный способ доступа к ним из ваших уведомляемых объектов. Черта, которая включена в Laravel по умолчанию модели, включает в себя Красноречивые отношения, возвращающие уведомления для объекта. Чтобы получать уведомления, вы можете получить доступ к этому методу, как и к любым другим отношениям Eloquent. По умолчанию уведомления будут отсортированы по отметке времени:Illuminate\Notifications\Notifiable
App\User
notifications
created_at
$user = App\User::find(1);
foreach ($user->notifications as $notification) {
echo $notification->type;
}
Если вы хотите получить только «непрочитанные» уведомления, вы можете использовать unreadNotifications
отношения. Опять же, эти уведомления будут отсортированы по created_at
отметке времени:
$user = App\User::find(1);
foreach ($user->unreadNotifications as $notification) {
echo $notification->type;
}
Чтобы получить доступ к вашим уведомлениям из вашего JavaScript-клиента, вы должны определить контроллер уведомлений для вашего приложения, который возвращает уведомления для уведомляемой сущности, такой как текущий пользователь. Затем вы можете сделать HTTP-запрос к URI этого контроллера из вашего JavaScript-клиента.
Пометка уведомлений как прочитанных
Как правило, вы хотите пометить уведомление как «прочитанное», когда пользователь просматривает его. Эта черта обеспечивает метод, который обновляет столбец в записи базы данных уведомления: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();
Широковещательные уведомления
Предпосылки
Перед рассылкой уведомлений вы должны настроить и ознакомиться со службами трансляции событий Laravel . Вещание событий позволяет реагировать на события Laravel на стороне сервера из вашего клиента JavaScript.
Форматирование широковещательных уведомлений
В broadcast
транслирует канал уведомления с использованием Laravel в событии вещания услуг, что позволит вашему клиенту JavaScript , чтобы поймать уведомления в режиме реального времени. Если уведомление поддерживает широковещательную рассылку, вы должны определить toBroadcast
метод в классе уведомлений. Этот метод получит $notifiable
объект и должен вернуть BroadcastMessage
экземпляр. Возвращенные данные будут закодированы как 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
поле, содержащее имя класса уведомления.
Прослушивание уведомлений
Уведомления будут транслироваться на частном канале, отформатированном с использованием соглашения. Таким образом, если вы отправляете уведомление экземпляру с идентификатором , уведомление будет транслироваться по частному каналу. При использовании Laravel Echo вы можете легко прослушивать уведомления на канале, используя вспомогательный метод:{notifiable}.{id}
App\User
1
App.User.1
notification
Echo.private('App.User.' + userId)
.notification((notification) => {
console.log(notification.type);
});
Настройка канала уведомлений
Если вы хотите настроить, по каким каналам уведомляемый объект получает свои широковещательные уведомления, вы можете определить receivesBroadcastNotificationsOn
метод для уведомляемого объекта:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The channels the user receives notification broadcasts on.
*
* @return string
*/
public function receivesBroadcastNotificationsOn()
{
return 'users.'.$this->id;
}
}
СМС уведомления
Предпосылки
Отправка SMS-уведомлений в Laravel осуществляется с помощью 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-уведомлений
Если уведомление поддерживает отправку в виде 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');
}
Unicode 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
from
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
каналу система уведомлений автоматически ищет phone_number
атрибут в уведомляемом объекте. Если вы хотите настроить номер телефона, на который доставляется уведомление, определите routeNotificationForNexmo
метод для объекта:
<?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;
}
}
Slack Уведомления
Предпосылки
Прежде чем вы сможете отправлять уведомления через Slack, вы должны установить канал уведомлений через Composer:
composer require laravel/slack-notification-channel
Вам также необходимо настроить интеграцию Incoming Webhook для вашей команды Slack. Эта интеграция предоставит вам URL, который вы можете использовать при маршрутизации уведомлений Slack .
Форматирование слабых уведомлений
Если уведомление поддерживает отправку в качестве сообщения Slack, вы должны определить toSlack
метод в классе уведомлений. Этот метод получит $notifiable
объект и должен вернуть экземпляр. Слабые сообщения могут содержать текстовое содержимое, а также «вложение», которое форматирует дополнительный текст или массив полей. Давайте посмотрим на базовый пример:Illuminate\Notifications\Messages\SlackMessage
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. Вложения обеспечивают более широкие возможности форматирования, чем простые текстовые сообщения. В этом примере мы отправим уведомление об ошибке об исключении, которое произошло в приложении, включая ссылку для просмотра более подробной информации об исключении:
/**
* 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
метод, чтобы дать Slack возможность анализировать и отображать заданные поля вложений в виде текста в формате Markdown. Значения , принятые по этому методу являются: pretext
, text
и / или fields
. Для получения дополнительной информации о форматировании вложений Slack, ознакомьтесь с документацией Slack API :
/**
* 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 в нужное место, определите routeNotificationForSlack
метод для вашей уведомляемой сущности. Это должно вернуть URL-адрес webhook, на который должно быть доставлено уведомление. URL-адреса Webhook могут быть сгенерированы путем добавления службы «Incoming Webhook» в вашу команду Slack:
<?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/...';
}
}
Локализация уведомлений
Laravel позволяет отправлять уведомления в локали, отличной от текущего языка, и даже запомнит эту локаль, если уведомление поставлено в очередь.
Для этого класс предлагает метод для установки желаемого языка. Приложение изменится на эту локаль при форматировании уведомления, а затем вернется к предыдущей локали после завершения форматирования:Illuminate\Notifications\Notification
locale
$user->notify((new InvoicePaid($invoice))->locale('es'));
Локализация нескольких уведомляемых записей также может быть достигнута через Notification
фасад:
Notification::locale('es')->send($users, new InvoicePaid($invoice));
Предпочтительные для пользователя локали
Иногда приложения хранят предпочтительный язык каждого пользователя. Внедрив HasLocalePreference
контракт для вашей уведомляемой модели, вы можете поручить Laravel использовать эту сохраненную локаль при отправке уведомления:
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;
}
}
После того, как вы реализовали интерфейс, Laravel будет автоматически использовать предпочтительный языковой стандарт при отправке уведомлений и почтовых сообщений модели. Поэтому нет необходимости вызывать 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
}
Пользовательские каналы
Laravel поставляется с несколькими каналами уведомлений, но вы можете написать свои собственные драйверы для доставки уведомлений по другим каналам. Laravel делает это просто. Чтобы начать, определите класс, который содержит send
метод. Метод должен получить два аргумента: a $notifiable
и 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...
}
}
После определения класса канала уведомлений вы можете вернуть имя класса из via
метода любого из ваших уведомлений:
<?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;
/**
* 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)
{
// ...
}
}
0 комментариев