В реальных проектах пользователи любят получать уведомления обо всем: пароль сбросил, заказ отправлен, кто-то лайкнул пост. Laravel умеет это делать почти «из коробки», но важно понимать, как это организовать, чтобы не превратить проект в спагетти.
Создание уведомления
В Laravel уведомление создается командой Artisan:
php artisan make:notification ResetPasswordNotification
Laravel создаст класс в app/Notifications.
Настройка уведомления
В классе уведомления нужно указать, через какие каналы оно будет отправляться (via) и как именно (toMail, toDatabase и т.д.):
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->line('Мы получили запрос на сброс пароля для вашего аккаунта.')
->action('Сбросить пароль', url(config('app.url').route('password.reset', $this->token, false)))
->line('Если вы не запрашивали сброс пароля, ничего делать не нужно.');
}
Тут никаких сложностей — указываешь канал и формат уведомления.
Отправка уведомления
Чтобы отправить уведомление пользователю:
$user->notify(new ResetPasswordNotification($token));
Просто, и при этом Laravel сам решает, через какой канал доставлять уведомление.
Каналы уведомлений
Laravel из коробки поддерживает:
- Mail — письма на почту
- Database — хранение уведомлений в базе
- Broadcast — веб-сокеты для реального времени
- Nexmo — SMS
Если нужно что-то нестандартное, можно создать свой канал.
Создание собственного канала
Если стандартных каналов мало, создаешь свой:
- Создаешь класс канала.
- Реализуешь интерфейс
Illuminate\Contracts\Notifications\Notification. - Пишешь метод
send, где описываешь, как доставлять уведомление.
Так можно интегрировать любой сервис: Telegram, Slack, свой внутренний API — что угодно.
Заключение
Уведомления в Laravel — это инструмент для того, чтобы не плодить костыли при оповещении пользователей. Главное — держать их в одном месте, использовать каналы и отделять логику отправки от бизнес-логики приложения. Делай уведомления правильно, и не придется потом вырезать все костыли и переделывать проект.
0 комментариев