Слава Україні!

Laravel 10. Уведомления в реальном времени. Часть 2.

Laravel 10. Уведомления в реальном времени с использованием сервиса Ably
24-го квітня 2023, 10:42

Пришло время для самого уведомления. Мне необхдимо было сделать уведомление о новом заказе. При этом надо было учитывать, что заказ создается с использованием транзакции. Т.е. в базу должны быть записаны:

  • общая информация о заказе
  • товары которые были в заказе

Транзакция должна завершиться успешно, и только тогда отправляется уведомление. Это важный момент.

Итак, создаем само уведомление:


php artisan make:notification NewOrder

В папке App\Notifications будет создан класс уведомления NewOrder. Тут стоить заметить, что по умолчанию уведомления создается под отправку через электронную почту. Нам же нужно отправлять через канал Ably, а так же сохранять уведомление в базу. Поэтому немного изменим класс. Удаляем методы toMail($notifiable) и toArray($notifiable).

Вводим перемнную $order - в ней будет храниться заказ. Далее изменяем метод via($notifiable) и добавляем 2 метода - toDatabase($notifiable) и toBroadcast(object $notifiable). Полный код класса:


class NewOrder extends Notification
{
    use Queueable;

    protected $order;

    /**
    * Create a new notification instance.
    */
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
    * Get the notification's delivery channels.
    *
    * @return array
    */
    public function via(object $notifiable): array
    {
        return ['database', 'broadcast'];
    }

    public function toDatabase($notifiable)
    {
        return [
            'order_id' => $this->order->id,
            'title' => 'Новый заказ',
        ];
    }

    /**
    * Get the broadcastable representation of the notification.
    */
    public function toBroadcast(object $notifiable): BroadcastMessage
    {
        return new BroadcastMessage([
            'id' => $this->id,
            'read_at' => null,
            'data' => [
                'title' => 'Новый заказ',
                'order_id' => $this->order->id,
            ],
        ]);
    }
}

Я использовал трайт Queueable. Уведомление может прекрасно работать и без него, однако мне необходим функция отслеживания транзакций - afterCommit().

Теперь необхдимо создать событие, при котором уведомление будет отправлено.

В модели Order созлаем метод (можно так же сделать через Observer):


protected static function booted(): void
{
    static::created(function (Order $order) {
        $user = User::find(1);
        $user->notify((new NewOrder($order))->afterCommit());
    });
}

Здесь, для упрощения я отправляю уведомление пользователю с ID = 1. В модели User должен быть использован трайт Notifiable.

Для отправления уведомлений нескольким пользователям можно использовать цикл или фасад:


use Illuminate\Support\Facades\Notification;

Notification::send($users, new NewOrder($order));

Важлива інформація

Міністерство оборони
України
з 24.02 по 18.03
втрати противника
орієнтовно склали:
897010 ( +1560 ) особового складу
10352 ( +8 ) танків
21509 ( +20 ) бойових бронемашин
24640 ( +42 ) артилерійських систем
1319 ( +1 ) РСЗВ
1107 ( +3 ) засоби ППО
370 ( +0 ) літаків
331 ( +0 ) гелікоптерів
40892 ( +107 ) автомобільної техніки
28 ( +0 ) кораблі / катери
3121 ( +0 ) крилаті ракети
29616 ( +149 ) БПЛА
3780 ( +2 ) спец. техніки
4 ( +0 ) установок ОТРК/ТРК
1 ( +0 ) підводні човни