Уведомления

Содержание:


Введение

Дополнительно к поддержке отправке сообщений, Ларавел предоставляет поддержку уведомлений для различных каналов вкючая почту, СМС (через 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.

Метод 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 уведомлений

Если есть возможность отправки уведомлений как 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 Уведомлений

Если уведомление поддерживает возможность быть отправленым в качестве сообщения 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)
    {
        // ...
    }
}