Laravel 10. Уведомления в реальном времени. Часть 2.
Пришло время для самого уведомления. Мне необхдимо было сделать уведомление о новом заказе. При этом надо было учитывать, что заказ создается с использованием транзакции. Т.е. в базу должны быть записаны:
- общая информация о заказе
- товары которые были в заказе
Транзакция должна завершиться успешно, и только тогда отправляется уведомление. Это важный момент.
Итак, создаем само уведомление:
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));
Важлива інформація
України
втрати противника
орієнтовно склали: