Вступление

В дополнение к поддержке отправки электронной почты, Laravel поддерживает отправку уведомлений по различным каналам доставки, включая почту, SMS (через Nexmo ) и Slack . Уведомления также могут храниться в базе данных, поэтому они могут отображаться в вашем веб-интерфейсе.

Как правило, уведомления должны быть короткими информационными сообщениями, которые уведомляют пользователей о том, что произошло в вашем приложении. Например, если вы пишете приложение для выставления счетов, вы можете отправить своим пользователям уведомление «Оплачен счет» через каналы электронной почты и SMS.

Создание уведомлений

В Laravel каждое уведомление представлено одним классом (обычно хранящимся в каталоге). Не беспокойтесь, если вы не увидите этот каталог в своем приложении, он будет создан для вас при запуске команды Artisan:app/Notificationsmake:notification

php artisan make:notification InvoicePaid

Эта команда поместит новый класс уведомлений в ваш каталог. Каждый класс уведомлений содержит метод и переменное число методов построения сообщений (таких как или ), которые преобразуют уведомление в сообщение, оптимизированное для этого конкретного канала.app/NotificationsviatoMailtoDatabase

 

Отправка уведомлений

Использование черты 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\Usernotifynotify

use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));

Помните, что вы можете использовать эту черту на любой из ваших моделей. Вы не ограничены только включением этого в свою модель.Illuminate\Notifications\NotifiableUser

 

Использование фасада уведомлений

Кроме того, вы можете отправлять уведомления через Notification фасад . Это полезно, в первую очередь, когда вам нужно отправить уведомление нескольким объектам, подлежащим уведомлению, например, группе пользователей. Чтобы отправить уведомления с использованием фасада, передайте все уведомляемые объекты и экземпляр уведомления sendметоду:

Notification::send($users, new InvoicePaid($invoice));

 

Указание каналов доставки

У каждого класса уведомлений есть viaметод, который определяет, по каким каналам будет доставлено уведомление. Уведомления могут быть отправлены на maildatabasebroadcastnexmo, и 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\MailMessagetoMail

/**
 * 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->idtoMail

В этом примере мы регистрируем приветствие, строку текста, призыв к действию, а затем еще одну строку текста. Эти методы, предоставляемые 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.phpfrom

/**
 * 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. Поддерживаемые цвета bluegreenи 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:publishlaravel-mail

php artisan vendor:publish --tag=laravel-mail

Эта команда опубликует почтовые компоненты Markdown в каталоге. Каталог будет содержать и в каталог, каждый из которых содержит свои соответствующие представления каждого доступного компонента. Вы можете настроить эти компоненты по своему усмотрению.resources/views/vendor/mailmailhtmltext

Настройка CSS

После экспорта компонентов каталог будет содержать файл. Вы можете настроить CSS в этом файле, и ваши стили будут автоматически встроены в HTML-представления ваших уведомлений об уценке.resources/views/vendor/mail/html/themesdefault.css

Если вы хотите создать совершенно новую тему для компонентов Markdown, напишите новый CSS-файл в каталоге и измените опцию вашего файла конфигурации.html/themesthememail

 

Уведомления базы данных

Предпосылки

Канал 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\NotifiableApp\Usernotificationscreated_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\NotifiablemarkAsReadread_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\User1App.User.1notification

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.phpfromNexmoMessage

/**
 * 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\SlackMessagetoSlack

/**
 * 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. Значения , принятые по этому методу являются: pretexttextи / или 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\Notificationlocale

$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\NotificationSentEventServiceProvider

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Notifications\Events\NotificationSent' => [
        'App\Listeners\LogNotification',
    ],
];

После регистрации слушателей в вашей EventServiceProvider, используйте команду Artisan для быстрой генерации классов слушателей.event:generate

В качестве слушателя событий, вы можете получить доступ к notifiablenotificationи 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)
    {
        // ...
    }
}