Звичайно сповіщення надсилають моделі з трейтом Notifiable: $user->notify(...). Модель сама знає свої адреси - email для пошти, phone для SMS (через методи routeNotificationFor...).
Але інколи отримувач - не користувач: гість, що залишив заявку, адреса з форми «Повідомити, коли з'явиться товар», канал Slack команди, email бухгалтерії.
Сповіщення на льоту (on-demand) - через фасад з явною маршрутизацією:
use Illuminate\Support\Facades\Notification;
Notification::route('mail', 'accounting@example.com')
->route('slack', '#billing')
->notify(new InvoicePaid($invoice));
Можна вказати ім'я отримувача пошти:
Notification::route('mail', ['buyer@example.com' => 'Олена Петренко'])
->notify(new OrderReceived($order));
Як це працює всередині: route() створює об'єкт AnonymousNotifiable, який зберігає маршрути для каналів. Сповіщення отримує його як $notifiable у методах via() і toMail().
Що з цього випливає:
via()має працювати з анонімним отримувачем. Якщо ви вибираєте канали за налаштуваннями користувача ($notifiable->prefers_sms), для анонімного отримувача таких властивостей немає:
public function via(object $notifiable): array
{
return $notifiable instanceof AnonymousNotifiable
? ['mail']
: $notifiable->notificationChannels();
}
- канал
databaseнедоступний - немає моделі, до якої прив'язати запис; - немає бажаної локалі - мову доведеться задати явно:
->locale('uk'); - маршрут береться з
route(), а не зrouteNotificationForMail.
Типові задачі:
- службові сповіщення команді (новий платіж у Slack, помилка імпорту на пошту);
- листи гостям до реєстрації;
- кілька отримувачів:
Notification::send($users, ...)для моделей іroute()для зовнішніх адрес.
Тести:
Notification::fake();
// ...
Notification::assertSentOnDemand(InvoicePaid::class,
fn ($notification, $channels, $notifiable) => $notifiable->routes['mail'] === 'accounting@example.com');