Версія фреймворка: 8.x

Повідомлення

Вступ

На додаток до підтримки длявідправка електронної пошти, Laravel надає підтримку надсилання повідомлень за різними каналами доставки, включаючи пошту, SMS (черезВонаж, раніше відомий як Nexmo), іОслаблення. Повідомлення також можуть зберігатися у базі даних, щоб вони могли відображатися у вашому веб-інтерфейсі.

Як правило, Notification повинні бути короткими, інформаційними повідомленнями, які сповіщають користувачів про щось, що сталося у вашій програмі. Наприклад, якщо ви пишете заявку на виставлення рахунку, ви можете надіслати Notification "Оплачений рахунок-фактура" своїм користувачам за допомогою електронної пошти та SMS-каналів.

Створення сповіщень

У Laravel кожне повідомлення представлене одним класом (зазвичай зберігається вapp/Notificationsкаталог). Не хвилюйтеся, якщо ви не бачите цей каталог у своїй програмі, він буде створений для вас під час запускуmake:notificationКоманда ремісників:

php artisan make:notification InvoicePaid

Ця команда помістить новий клас сповіщень у вашapp/Notificationsкаталог. Кожен клас повідомлень містить aviaі змінну кількість методів побудови повідомлень (таких якtoMailабоtoDatabase), які перетворюють повідомлення на повідомлення, оптимізоване для цього конкретного каналу.

Надсилання сповіщень

Using The Notifiable Trait

Повідомлення можуть надсилатися двома способами: за допомогоюnotifyметодNotifiableознака або використанняNotificationфасад. Спочатку давайте дослідимо, використовуючи ознаку:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
}

Ця ознака використовується за замовчуваннямApp\Models\Userмодель і містить один метод, який можна використовувати для надсилання сповіщень:notify.notifyметод очікує отримати екземпляр Notification:

use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));
Пам'ятайте, ви можете використовуватиIlluminate\Notifications\Notifiableвластивість будь-якої з ваших моделей. Ви не обмежуєтесь лише включенням цього на свійUserмодель.

Використання фасаду повідомлень

Крім того, ви можете надсилати Notification черезNotificationфасад. Це корисно в першу чергу, коли вам потрібно надіслати Notification до кількох об’єктів, про які потрібно повідомити, наприклад до колекції користувачів. Щоб надіслати Notification за допомогою фасаду, передайте всі об'єкти, що підлягають повідомленню, та екземпляр Notification вsendметод:

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

Визначення каналів доставки

Кожен клас повідомлень маєviaметод, який визначає, за якими каналами буде надходити повідомлення. Повідомлення можуть надсилатися наmail,database,broadcast,nexmo, іslackканалів.

Якщо ви хочете скористатися іншими каналами доставки, такими як Telegram або Pusher, перегляньте спільнотуВеб-сайт Laravel Notification Channels.

viaметод отримує a$notifiableекземпляр, який буде екземпляром класу, до якого надсилається Notification. Ви можете використовувати$notifiableщоб визначити, за якими каналами слід надсилати повідомлення:

/**
 * Get the notification's delivery channels.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function via($notifiable)
{
    return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database'];
}

Черга сповіщень

Перед тим, як сповіщати про чергу, вам слід налаштувати свою чергу тапочати робітника.

Надсилання сповіщень може зайняти час, особливо якщо каналу потрібен зовнішній виклик API для доставки Notification. Щоб пришвидшити час відповіді вашої програми, нехай ваше повідомлення буде в черзі, додавши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Інтерфейс додано до вашого Notification, ви можете надіслати Notification як зазвичай. Laravel виявитьShouldQueueінтерфейс класу і автоматично поставити в чергу доставку повідомлення:

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

Якщо ви хочете затримати доставку повідомлення, ви можете встановити ланцюжокdelayметоду до вашої інстанції Notification:

$delay = now()->addMinutes(10);

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

Ви можете передати масив доdelayспосіб вказати величину затримки для певних каналів:

$user->notify((new InvoicePaid($invoice))->delay([
    'mail' => now()->addMinutes(5),
    'sms' => now()->addMinutes(10),
]));

Під час отримання повідомлень у черзі буде створено завдання в черзі для кожного поєднання одержувача та каналу. Наприклад, шість завдань буде відправлено до черги, якщо ваше Notification має трьох одержувачів і два канали.

Налаштування черг каналів сповіщень

Якщо ви хочете вказати конкретну чергу, яку слід використовувати для кожного каналу сповіщень, що підтримується Notificationм, ви можете визначити aviaQueuesу вашому повідомленні. Цей метод повинен повернути масив пар назв каналів / назв черги:

/**
 * Determine which queues should be used for each notification channel.
 *
 * @return array
 */
public function viaQueues()
{
    return [
        'mail' => 'mail-queue',
        'slack' => 'slack-queue',
    ];
}

Повідомлення на вимогу

Іноді вам може знадобитися надіслати повідомлення комусь, хто не зберігається як "користувач" вашої програми. ВикористанняNotification::routeметодом фасаду, ви можете вказати спеціальну інформацію про маршрутизацію сповіщень перед надсиланням повідомлення:

Notification::route('mail', 'taylor@example.com')
            ->route('nexmo', '5555555555')
            ->route('slack', 'https://hooks.slack.com/services/...')
            ->notify(new InvoicePaid($invoice));

Повідомлення поштою

Форматування поштових повідомлень

Якщо повідомлення підтримує надсилання у вигляді електронного листа, слід визначитиtoMailв класі сповіщень. Цей метод отримає a$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метод. Ви можете передавати будь-які дані, необхідні для створення повідомлення, у конструктор Notification.

У цьому прикладі ми реєструємо привітання, рядок тексту, заклик до дії, а потім ще один рядок тексту. Ці методи передбаченіMailMessageobject дозволяє спростити та швидко форматувати невеликі транзакційні електронні листи. Потім поштовий канал переведе компоненти повідомлень у приємний, чуйний HTML-шаблон електронної пошти зі звичайним текстом. Ось приклад електронного листа, створеногоmailканал:

Під час надсилання сповіщень поштою обов’язково встановітьname value in your config/app.phpфайл конфігурації. Це значення буде використано у верхньому та нижньому колонтитулі ваших повідомлень про поштові Notification.

Інші параметри форматування сповіщень

Замість того, щоб визначати "рядки" тексту в класі сповіщень, ви можете використовувати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]
    );
}

Ви можете вказати текстовий Шаблон для поштового повідомлення, передавши ім'я View як другий елемент масиву, який надаєтьсяviewметодMailMessage:

/**
 * 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.html', 'emails.name.plain'],
        ['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($notifiable->email);
}

Повідомлення про помилки

Деякі Notification інформують користувачів про помилки, наприклад, про невдалу оплату рахунка-фактури. Ви можете вказати, що поштове повідомлення стосується помилки, зателефонувавши на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 для конкретного Notification за допомогою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канал, система Notification автоматично шукатимеemailвласність на вашу юридичну особу. Ви можете налаштувати, яка електронна адреса використовується для надсилання Notification, визначивши arouteNotificationForMailметод на сутність:

<?php

namespace App\Models;

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 array|string
     */
    public function routeNotificationForMail($notification)
    {
        // Return email address only...
        return $this->email_address;

        // Return name and email address...
        return [$this->email_address => $this->name];
    }
}

Налаштування теми

За замовчуванням темою повідомлення електронної пошти є назва класу Notification, відформатоване як "заголовок". Отже, якщо названо ваш клас сповіщень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('...');
}

Налаштування пошти

За замовчуванням Notification електронною поштою надсилатиметься із драйвером за замовчуванням, визначеним уconfig/mail.phpфайл конфігурації. Однак ви можете вказати іншу поштову скриньку під час виконання, зателефонувавши доmailerметод при побудові вашого повідомлення:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->mailer('postmark')
                ->line('...');
}

Налаштування шаблонів

Ви можете змінити HTML і шаблон простого тексту, що використовуються у Notificationх електронною поштою, опублікувавши ресурси пакета сповіщень. Після запуску цієї команди шаблони повідомлень про пошту будуть розміщені вresources/views/vendor/notificationsкаталог:

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

Вкладення

Щоб додати вкладення до Notification електронною поштою, використовуйтеattachметод під час створення вашого повідомлення.attachметод приймає повний (абсолютний) шлях до файлу як перший аргумент:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->greeting('Hello!')
                ->attach('/path/to/file');
}

Прикріплюючи файли до повідомлення, ви також можете вказати відображуване ім'я та / або тип MIME, передавши файлarrayяк другий аргументattachметод:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->greeting('Hello!')
                ->attach('/path/to/file', [
                    'as' => 'name.pdf',
                    'mime' => 'application/pdf',
                ]);
}
На відміну від вкладання файлів у доступні об’єкти, ви не можете вкладати файл безпосередньо з диска зберігання за допомогоюattachFromStorage. Вам краще скористатисяattachметод з абсолютним шляхом до файлу на диску зберігання. Як варіант, ви можете повернути aдоступнийвідtoMailметод.

Вкладені файли необроблених даних

attachDataметод може бути використаний для приєднання необробленого рядка байтів як вкладення:

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->greeting('Hello!')
                ->attachData($this->pdf, 'name.pdf', [
                    'mime' => 'application/pdf',
                ]);
}

Попередній перегляд створених сповіщень

При розробці шаблону Notification про пошту зручно швидко переглядати відтворене поштове повідомлення у вашому браузері, як типовий шаблон Blade. З цієї причини Laravel дозволяє повертати будь-яке поштове повідомлення, генероване поштовим повідомленням, безпосередньо із Закриття маршруту або контролера. Коли aMailMessageповернеться, він буде відтворений і відображений у браузері, що дозволить вам швидко переглянути його дизайн без необхідності надсилати його на фактичну електронну адресу:

Route::get('mail', function () {
    $invoice = App\Invoice::find(1);

    return (new App\Notifications\InvoicePaid($invoice))
                ->toMail($invoice->user);
});

Повідомлення поштової розсилки

Notification про поштову розсилку дозволяють скористатися заздалегідь побудованими шаблонами сповіщень про пошту, надаючи вам більше свободи для написання довших, налаштованих повідомлень. Оскільки повідомлення написані в Markdown, Laravel може рендерити чудові, чуйні HTML-шаблони для повідомлень, а також автоматично генерувати аналог простого тексту.

Створення повідомлення

Щоб створити Notification з відповідним шаблоном Markdown, ви можете використовувати--markdownваріантmake:notificationКоманда ремісників:

php artisan make:notification InvoicePaid --markdown=mail.invoice.paid

Як і всі інші Notification поштою, Notification, які використовують шаблони Markdown, повинні визначати atoMailметод їх класу сповіщень. Однак замість використання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

Кнопка Компонент

Компонент кнопки відображає відцентрове посилання кнопки. Компонент приймає два аргументи, aurlта необов’язковоcolor. Підтримувані кольориblue,green, іred. Ви можете додати до Notification скільки завгодно компонентів кнопок:

@component('mail::button', ['url' => $url, 'color' => 'green'])
View Invoice
@endcomponent

Компонент панелі

Компонент панелі відображає даний блок тексту на панелі, яка має дещо інший колір фону, ніж решта Notification. Це дозволяє звернути увагу на певний блок тексту:

@component('mail::panel')
This is the panel content.
@endcomponent

Компонент таблиці

Компонент таблиці дозволяє перетворити таблицю Markdown в таблицю HTML. Компонент приймає таблицю Markdown як свій вміст. Вирівнювання стовпців таблиці підтримується за допомогою синтаксису вирівнювання таблиці Markdown за замовчуванням:

@component('mail::table')
| Laravel       | Table         | Example  |
| ------------- |:-------------:| --------:|
| Col 2 is      | Centered      | $10      |
| Col 3 is      | Right-Aligned | $20      |
@endcomponent

Налаштування компонентів

Ви можете експортувати всі компоненти Notification Markdown у власну програму для налаштування. Щоб експортувати компоненти, використовуйтеvendor:publishРеміснича команда видаватиlaravel-mailтег активу:

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

Ця команда опублікує компоненти пошти Markdown уresources/views/vendor/mailкаталог.mailкаталог міститимеhtmlі atextкаталог, кожен із відповідних Views кожного доступного компонента. Ви можете налаштувати ці компоненти як завгодно.

Налаштування CSS

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

Якщо ви хочете створити абсолютно нову тему для компонентів Laravel Markdown, ви можете розмістити файл CSS уhtml/themesкаталог. Після іменування та збереження файлу CSS оновіть файлthemeваріантmailконфігураційний файл відповідно до назви вашої нової теми.

Щоб налаштувати тему для окремого Notification, ви можете зателефонувати доthemeметод під час створення поштового повідомлення Notification.themeметод приймає назву теми, яку слід використовувати під час надсилання Notification:

/**
 * 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]);
}

Notification бази даних

Передумови

databaseканал сповіщень зберігає інформацію Notification в таблиці бази даних. Ця таблиця міститиме таку інформацію, як тип Notification, а також користувацькі дані JSON, що описують Notification.

Ви можете запитати таблицю, щоб відобразити Notification в інтерфейсі користувача вашої програми. Але перед тим, як це зробити, вам потрібно буде створити таблицю бази даних для зберігання ваших сповіщень. Ви можете використовуватиnotifications:tableкоманда для генерації міграції за допомогою відповідної схеми таблиці:

php artisan notifications:table

php artisan migrate

Форматування сповіщень баз даних

Якщо Notification підтримує збереження в таблиці бази даних, слід визначити atoDatabaseабоtoArrayв класі сповіщень. Цей метод отримає a$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. Якщо ви хочете мати два різних View масиву дляdatabaseіbroadcastканали, вам слід визначити atoDatabaseметод замість atoArrayметод.

Доступ до сповіщень

Після того, як Notification зберігаються в базі даних, вам потрібен зручний спосіб отримати доступ до них із ваших об’єктів, про які потрібно повідомити.Illuminate\Notifications\Notifiableознака, яка включена за замовчуванням LaravelApp\Models\Userмодель, включає anotificationsКрасномовний зв’язок, який повертає повідомлення для сутності. Щоб отримати Notification, ви можете отримати доступ до цього методу, як і до будь-якого іншого красномовного зв'язку. За замовчуванням Notification сортуються заcreated_atпозначка часу:

$user = App\Models\User::find(1);

foreach ($user->notifications as $notification) {
    echo $notification->type;
}

Якщо ви хочете отримати лише "непрочитані" повідомлення, ви можете використовуватиunreadNotificationsвідносини. Знову ж таки, ці Notification буде відсортовано заcreated_atпозначка часу:

$user = App\Models\User::find(1);

foreach ($user->unreadNotifications as $notification) {
    echo $notification->type;
}
Щоб отримати доступ до сповіщень із вашого клієнта JavaScript, слід визначити контролер сповіщень для своєї програми, який повертає Notification для об’єкта, що підлягає повідомленню, наприклад поточного користувача. Потім ви можете зробити запит HTTP на URI цього контролера від свого клієнта JavaScript.

Позначення повідомлень як прочитаних

Як правило, ви хочете позначити повідомлення як "прочитане", коли користувач його переглядає.Illuminate\Notifications\Notifiableознака забезпечує amarkAsReadметод, який оновлюєread_atстовпець у записі бази даних Notification:

$user = App\Models\User::find(1);

foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
}

Однак, замість перегляду кожного повідомлення, ви можете використовуватиmarkAsReadметод безпосередньо на колекції сповіщень:

$user->unreadNotifications->markAsRead();

Ви також можете використовувати запит масового оновлення, щоб позначити всі Notification як прочитані, не отримуючи їх із бази даних:

$user = App\Models\User::find(1);

$user->unreadNotifications()->update(['read_at' => now()]);

Ви можетеdeleteNotification, щоб повністю видалити їх із таблиці:

$user->notifications()->delete();

Broadcast Notifications

Передумови

Перш ніж транслювати Notification, слід налаштувати та ознайомитись із повідомленнями Laravelтрансляція подійпослуги. Трансляція подій забезпечує спосіб реагування на серверні події Laravel із вашого клієнта JavaScript.

Форматування сповіщень про Broadcast

broadcastканал транслює повідомлення за допомогою Laravelтрансляція подійслужби, що дозволяє вашому клієнту JavaScript отримувати Notification в режимі реального часу. Якщо повідомлення підтримує Broadcast, ви можете визначити atoBroadcastв класі сповіщень. Цей метод отримає a$notifiableсутність і повинна повернути aBroadcastMessageекземпляр. Якщо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,
    ]);
}

Конфігурація черги мовлення

Усі Notification про Broadcast в черзі на Broadcast. Якщо ви хочете налаштувати підключення черги або ім'я черги, що використовується для черги операції трансляції, ви можете використовуватиonConnectionіonQueueметодиBroadcastMessage:

return (new BroadcastMessage($data))
                ->onConnection('sqs')
                ->onQueue('broadcasts');

Налаштування типу повідомлення

Окрім зазначених вами даних, усі Broadcast Notifications також мають символtypeполе, що містить повну назву класу Notification. Якщо ви хочете налаштувати повідомленняtypeщо надається вашому клієнту JavaScript, ви можете визначитиbroadcastTypeметод у класі сповіщень:

use Illuminate\Notifications\Messages\BroadcastMessage;

/**
 * Get the type of the notification being broadcast.
 *
 * @return string
 */
public function broadcastType()
{
    return 'broadcast.message';
}

Прослуховування сповіщень

Notification транслюватимуться на приватному каналі, відформатованому за допомогою{notifiable}.{id}конвенції. Отже, якщо ви надсилаєте повідомлення наApp\Models\Userекземпляр з ідентифікатором1, повідомлення буде транслюватися наApp.Models.User.1приватний канал. При використанніLaravel Echo, Ви можете легко прослуховувати Notification на каналі за допомогоюnotificationдопоміжний метод:

Echo.private('App.Models.User.' + userId)
    .notification((notification) => {
        console.log(notification.type);
    });

Налаштування каналу сповіщень

Якщо ви хочете налаштувати, на яких каналах суб’єкт, що підлягає повідомленню, отримує Notification про Broadcast, ви можете визначити areceivesBroadcastNotificationsOnметод на об'єкт, що підлягає повідомленню:

<?php

namespace App\Models;

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-Notification

Передумови

Надсилання SMS-сповіщень у Laravel забезпечуєтьсяNexmo. Перш ніж ви зможете надсилати Notification через Nexmo, вам потрібно встановитиlaravel/nexmo-notification-channelПакет composer:

composer require laravel/nexmo-notification-channel

Це також встановитьnexmo/laravelпакет. Цей пакет включаєвласний файл конфігурації. Ви можете використовуватиNEXMO_KEYіNEXMO_SECRETзмінні середовища для встановлення вашого відкритого та секретного ключа Nexmo.

Далі вам потрібно буде додати параметр конфігурації до вашогоconfig/services.phpфайл конфігурації. Для початку можна скопіювати приклад конфігурації нижче:

'nexmo' => [
    'sms_from' => '15556666666',
],

sms_fromОпція - це номер телефону, з якого будуть надсилатися ваші SMS-повідомлення. Ви повинні створити номер телефону для своєї програми на панелі керування Nexmo.

Форматування сповіщень SMS

Якщо Notification підтримує надсилання у вигляді SMS, слід визначити atoNexmoв класі сповіщень. Цей метод отримає a$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');
}

Форматування сповіщень із шорткодом

Laravel також підтримує надсилання сповіщень із шорткодом, які є заздалегідь визначеними шаблонами повідомлень у вашому обліковому записі Nexmo. Ви можете вказати тип повідомлення (alert,2fa, абоmarketing), а також користувацькі значення, які заповнюватимуть шаблон:

/**
 * Get the Nexmo / Shortcode representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function toShortcode($notifiable)
{
    return [
        'type' => 'alert',
        'custom' => [
            'code' => 'ABC123',
        ];
    ];
}
ПодобаєтьсяRouting SMS-сповіщень, вам слід реалізуватиrouteNotificationForShortcodeметод на вашій моделі, що підлягає повідомленню.

Вміст Unicode

Якщо ваше SMS-повідомлення буде містити символи Unicode, вам слід зателефонувати до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();
}

Налаштування номера "Від"

Якщо ви хочете надіслати деякі Notification з номера телефону, який відрізняється від номера телефону, вказаного у вашомуconfig/services.phpфайл, ви можете використовувати файлfromметод на aNexmoMessageпримірник:

/**
 * 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');
}

Routing SMS-сповіщень

Щоб направити Notification Nexmo на відповідний номер телефону, визначте arouteNotificationForNexmoметод на вашому об’єкті, про який потрібно повідомити:

<?php

namespace App\Models;

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 Notification

Передумови

Перш ніж ви зможете надсилати Notification через Slack, ви повинні встановити канал сповіщень через Composer:

composer require laravel/slack-notification-channel

Вам також потрібно буде налаштувати файл"Вхідний веб-хук"інтеграція для вашої команди Slack. Ця інтеграція надасть вам URL-адресу, яку ви можете використовувати, колиRouting повідомлень Slack.

Форматування слабких сповіщень

Якщо Notification підтримує надсилання як повідомлення Slack, слід визначити atoSlackв класі сповіщень. Цей метод отримає a$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/img/favicon/favicon.ico')
                ->content('This will display the Laravel logo next to the message');
}

Slack вкладення

Ви також можете додати "вкладення" до повідомлень Slack. Вкладені файли мають більше можливостей форматування, ніж прості текстові повідомлення. У цьому прикладі ми надішлемо Notification про помилку про виняток, який стався в програмі, включаючи посилання для перегляду детальної інформації про виняток:

/**
 * 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 перегляньтеДокументація API 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']);
                });
}

Routing Slack сповіщень

Щоб направити Notification Slack у належне місце, визначте arouteNotificationForSlackметод на вашому об’єкті, про який потрібно повідомити. Це повинно повернути URL-адресу веб-хука, на яку має надходити повідомлення. URL-адреси Webhook можуть бути сформовані додаванням служби "Вхідний Webhook" до вашої команди Slack:

<?php

namespace App\Models;

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/...';
    }
}

Локалізація сповіщень

Laravel дозволяє надсилати Notification мовою, відмінною від поточної мови, і навіть запам'ятовуватиме цю локаль, якщо Notification буде поставлено в чергу.

Для цього,Illuminate\Notifications\Notificationклас пропонує alocaleспосіб встановити потрібну мову. Програма зміниться на цю локаль під час форматування Notification, а потім повернеться до попередньої мови після завершення форматування:

$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));

Події Notification

Коли повідомлення надіслано,Illuminate\Notifications\Events\NotificationSentподія запускається системою Notification. Він містить сутність, про яку потрібно повідомити, та сам екземпляр Notification. Ви можете зареєструвати слухачів для цієї події у своємуEventServiceProvider:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Notifications\Events\NotificationSent' => [
        'App\Listeners\LogNotification',
    ],
];
Після реєстрації слухачів у вашомуEventServiceProvider, використовуватиevent:generateКоманда Artisan для швидкого створення класів слухачів.

У програмі прослуховування подій ви можете отримати доступ доnotifiable,notification, іchannelвластивості події, щоб дізнатись більше про одержувача Notification або саме Notification:

/**
 * 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 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)
    {
        // ...
    }
}