Система уведомлений Laravel позволяет отправлять уведомления пользователям используя различные каналы. В этой статье мы рассмотрим Laravel Notifications, самый прекрасный способ обработки уведомлений для вашего веб-приложения.
Что такое Уведомления?
Во время разработки приложений часто нужно уведомлять пользователей о различных изменениях или действиях. Это могут быть email-уведомлений при изменении статуса заказа, либо отправка сообщений в Slack при завершении фоновой задачи приложения. Обычно это короткие сообщения, просто дающие представление об изменениях состояний.
Laravel предоставляет почтовый класс, который можно использовать для отправки электронных писем. Но, обычно это большие письма с markup-разметкой и мы не можем отправлять их по другим каналам. Laravel Notifications решает эту проблему, предоставляя элегантный и удобный способ отправки уведомлений пользователям.
Каналы Уведомлений
Вся прелесть Laravel Notifications в том, что он позволяет вам выбирать каналы, по которым будут доставляться ваши уведомления. Давайте рассмотрим какие каналы, в настоящее время, поддерживает фреймворк.
- Mail: уведомления будут отправлены пользователям в виде электронных писем.
- SMS: пользователи будут получать уведомления на свои мобильные телефоны.
- Database: эта опция позволяет вам сохранять уведомления в базе данных, которые далее своим способом можно показывать пользователям.
- Slack: эта опция позволяет отправлять уведомления в канал Slack.
Мы рассмотрим mail, database и slack уведомления, так как они используются чаще всего.
Установка приложения
Для начала мы быстренько установим Laravel через Composer.
composer create-project laravel/laravel LaraNotifications
Когда приложение Laravel будет готово, откройте файл .env
и настройте в нём свою базу данных.
Создание Уведомления
Уведомления Laravel просты в использовании, так как они генерируют отдельный класс для каждого уведомления. В этом классе мы можем описать, как будем доставлять уведомления пользователям.
Чтобы создать новый класс уведомлений, выполните следующую команду в терминале.
php artisan make:notification NewUser
Она создаст новый файл app\Notifications\NewUser.php
со следующим содержимым:
namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; class NewUser extends Notification { use Queueable; /** * Создание нового экземпляра уведомления * * @return void */ public function __construct() { // } /** * Получение каналов доставки уведомления * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Получение шаблона почтового уведомления * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->line('The introduction to the notification.') ->action('Notification Action', url('/')) ->line('Thank you for using our application!'); } /** * Получение массива уведомления * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }
Обратите внимание на метод via
в вышеприведенном классе, в нём вы можете указать, как вы хотите, чтобы пользователь получал уведомления. В вышеприведенном классе объявлено, что мы хотим использовать уведомление по электронной почте.
return ['mail'];
Соответственно, он запустит метод toMail()
.
Запуск Уведомлений
Чтобы включить уведомления Laravel для модели User, мы должны использовать трейт Notifiable
, как показано ниже:
namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; }
Laravel «из коробки» содержит модель User
, поэтому она уже использует этот трейт. Если вы хотите включить уведомления для своей модели, например, Customer
или Admin
, то вы должны использовать трейт Notifiable
в классе вашей модели.
После добавления трейта вы можете просто отправить уведомление пользователю, как показано ниже.
$user->notify(new App\Notifications\NewUser);
Теперь $user
получит уведомление NewUser
.
Вы также можете для отправки уведомлений использовать фасад Notification
, как показано ниже.
Notification::send($user, new App\Notifications\NewUser);
Перед отправкой уведомления по электронной почте мы добавим в метод toMail()
наше специальное сообщение
/** * Получение шаблона почтового уведомления * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->line('Welcome to our application, you now can use our application.') ->action('Visit Your Account', url('/')) ->line('Thank you for using our application!'); }
Мы узнали, как можно сгенерировать класс уведомлений и использовать его для отправки уведомления пользователю по почтовому каналу. В следующих разделах мы рассмотрим, как мы можем настроить уведомления для базы данных и Slack.
Уведомления для базы данных
Такие уведомления хранятся в таблице вашей базы данных. Таблица содержит пользовательское сообщение в формате JSON.
Прежде, чем использовать уведомления базы данных, мы должны создать для них новую таблицу. Не волнуйтесь, Laravel подготовил для этого отдельную команду
php artisan notifications:table php artisan migrate
Приведенные выше команды создадут новый файл миграции для таблицы уведомлений и создадут таблицу в вашей базе данных.
Как я упоминал ранее, для уведомления по почте мы использовали метод toMail()
. Для уведомлений базы данных вам нужно определить либо метод toDatabase()
, либо toArray() и он должен возвращать простой PHP-массив. Этот массив будет сохранен в столбце data
таблицы уведомлений.
Так как у нас уже есть метод toArray()
, то мы его и будем использовать. После внесения изменений в базу данных наш класс уведомлений будет выглядеть следующим образом.
namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; class NewUser extends Notification { use Queueable; /** * Создание нового экземпляра уведомления * * @return void */ public function __construct() { // } /** * Получение каналов доставки уведомления * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail', 'database']; } /** * Получение шаблона почтового уведомления * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->line('Welcome to our application, you now can use our application.') ->action('Visit Your Account', url('/')) ->line('Thank you for using our application!'); } /** * Получение массива уведомления * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ 'message' => 'Аккаунт успешно зарегистрирован.' ]; } }
Теперь мы отправляем уведомление как по почте, так и в канал базы данных.
Отображение Уведомлений базы данных
Laravel предоставляет несколько методов для доступа и удаления уведомлений базы данных. Наша модель User
использует трейт Notifiable
, который включает отношение, возвращающее уведомления для пользователя.
Чтобы получить такое уведомление, просто используйте отношение notifications
.
$user = auth()->user(); foreach ($user->unreadNotifications as $notification) { echo $notification->type; }
Для получения всех непрочитанных уведомлений:
foreach ($user->unreadNotifications as $notification) { // }
Отметить уведомления как прочитанные:
foreach ($user->unreadNotifications as $notification) { $notification->markAsRead(); }
Чтобы пометить все уведомления как прочитанные, используйте метод markAsRead()
непосредственно в коллекции уведомлений.
$user->unreadNotifications->markAsRead();
Чтобы удалить все уведомления для конкретной модели User
:
$user->notifications()->delete();
Slack Уведомления
Чтобы отправлять уведомления в Slack, необходимо установить Guzzle HTTP.
composer require guzzlehttp/guzzle
И обновить наш класс уведомлений NewUser
, изменив метод via()
как показано ниже
/** * Получение каналов доставки уведомления * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail', 'database', 'slack']; }
Теперь наш класс использует три канала доставки, для простоты я использую один класс для всех трех каналов. В своих профессиональных проектах я предпочитаю создавать отдельный класс для каждого канала доставки.
Добавим метод toSlack()
:
/** * Получение шаблона уведомления для Slack * * @param mixed $notifiable * @return SlackMessage */ public function toSlack($notifiable) { return (new SlackMessage) ->content('Account Registered successfully.'); }
Настройка хука
Чтобы получить уведомление Slack, перейдите по адресу https://{вашакоманда}.slack.com/apps
. Выберите тип «Incoming Webhook» и добавьте новую конфигурацию.
Скопируйте URL-адрес Webhook и вернитесь в приложение Laravel.
Чтобы направить уведомление в Slack, нам нужно определить метод routeNotificationForSlack()
в моделе User
.
/** * Маршрут уведомления для Slack канала * * @param \Illuminate\Notifications\Notification $notification * @return string */ public function routeNotificationForSlack($notification) { return 'your_webhook_url.'; }
Чтобы узнать больше о различных параметрах, доступных для Slack уведомлений, ознакомьтесь с Официальной документацией Laravel.
Заключение
В этом уроке мы создали систему Laravel Уведомлений и узнали, как отправлять их из Laravel по электронной почте, в базу данных и в каналы Slack. Подписывайтесь на наши соцсети для получения уведомлений о новых уроках Laravel.
Автор: LaraShout
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.