•   Новости. Советы. Уроки.
Блог / Советы и уроки / Уведомления в Laravel 5.3

Уведомления в Laravel 5.3

Mohamed Said
Автор перевода: Андрей Волков
11.08.2016

В Laravel 5.3 появилась новая функция, позволяющая отправлять уведомления через такие сервисы, как Slack, а так же через SMS, электронную почту и другими способами.

Так давайте же посмотрим, как легко создать и отправить уведомление, используя эту новую функцию:

class NewPost extends \Illuminate\Notifications\Notification
    {
        public function __construct($post)
        {
            $this->post = $post;
        }

        public function via($notifiable)
        {
            return ['database'];
        }

        public function toArray($notifiable)
        {
            return [
                'message' => 'Новый пост в блоге',
                'action' => url($this->post->slug)
            ];
        }
    }

Всё, что вам нужно сделать, чтобы отправить уведомление выбранному пользователю:

$user->notify(new NewPost($post));

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

Laravel 5.3 поставляется с новой консольной командой для создания уведомлений:

php artisan make:notification NewPost

Это позволит создать новый класс app/Notification, каждый класс уведомлений содержит метод via(), а также методы для построения уведомлений в различных каналах.

Используя метод via() можно указать каналы, через которые вы бы хотели направить уведомление. Давайте проверим пример из официальной документации:

public function via($notifiable)
{
    return $notifiable->prefers_sms ? ['sms'] : ['mail', 'database'];
}

Метод via получает экземпляр $notifiable, который является моделью отправленного уведомления. В большинстве случаев будет использована модель пользователя, хотя функционал этим не ограничивается.

Поддерживаемые каналы: mail, nexmo, database, broadcast и slack.

Форматирование уведомлений по Email

Вы можете отформатировать, каким образом уведомления будут отправляться по различным каналам, например, давайте взглянем на форматирование уведомления по электронной почте:

public function toMail($notifiable)
{
    return (new MailMessage)
        ->subject('Новый пост!')
            ->line('Новый пост опубликован в моем блоге!')
            ->action('Читать', url($this->post->slug))
            ->line('Пожалуйста, не забывайте поделиться с друзьями.');
}

Это позволит создать сообщение, используя гибкий шаблон из коробки, который можно публиковать с помощью консольной команды vendor:publish.

Система уведомлений будет автоматически искать свойство email в вашей модели, однако, вы можете настроить это поведение, определив метод routeNotificationForMail в вашей модели, возвращающий адрес электронной почты.

public function routeNotificationForMail()
{
    return $this->email_address;
}

Форматирование SMS уведомлений Nexmo

Так же, как и в случае уведомлений по электронной почте, вам необходимо определить метод toNexmo в классе уведомлений:

public function toNexmo($notifiable)
{
    return (new NexmoMessage)
        ->from(123456789)
        ->content('Новый пост в моем блоге!');
}

В случае уведомлений Nexmo, Laravel будет искать свойство номера телефона в модели. Вы можете переопределить это методом routeNotificationForNexmo. Вы можете установить глобальный номер from в файле конфигурации Nexmo, таким образом, вам не нужно будет использовать номер from в каждом уведомлении.

Форматирование уведомлений базы данных

Форматирование уведомлений базы данных вы можете определить в методе toDatabase:

public function toDatabase($notifiable)
{
    return new DatabaseMessage([
        'message' => 'Новый пост опубликован в блоге!',
        'action' => url($this->post->slug)
    ]);
}

Что бы начать использовать канал базы данных, прочитайте полную документацию на официальном сайте.

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

Вы можете отправлять уведомления, используя метод notify() в вашей модели, этот метод существует в трейте Notifiable, который вам нужно добавить к вашей модели.

$user->notify(new NewPost($post));

Вы также можете использовать фасад Notification, это позволит вам отправлять уведомления нескольким уведомляемым пользователям одновременно:

Notification::send(User::all(), new NewPost($post));

Очередь уведомлений

Вы можете легко создавать очереди отправки уведомлений с помощью интерфейса ShouldQueue:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;

class NewPost extends Notification implements ShouldQueue
{
    use Queueable;
}