Класс Notification
Класс Notification в Laravel предоставляет удобный способ отправки уведомлений через различные каналы, включая почту, SMS, Slack, базу данных и другие. В контексте почтовых уведомлений класс позволяет создавать и отправлять письма, используя Mailable-классы или встроенные шаблоны. Основное преимущество заключается в единообразном API для всех типов уведомлений.
Для отправки уведомлений через почту используется фасад Notification или трейт Notifiable на модели. Первым параметром передаётся получатель (пользователь или массив), вторым - экземпляр класса уведомления, который определяет способ доставки и содержимое письма.
Синтаксис
<?php
use Illuminate\Support\Facades\Notification;
Notification::send($recipient, $notification);
?>
Создание класса уведомления
Для отправки уведомлений необходимо создать класс, который расширяет базовый класс Notification. В этом классе определяются методы, определяющие каналы доставки и содержимое уведомления. Создадим класс для приветственного письма:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class WelcomeNotification extends Notification implements ShouldQueue
{
use Queueable;
public function __construct()
{
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->greeting('Hello, ' . $notifiable->name)
->line('Welcome to our website!')
->action('Visit Site', url('/'))
->line('Thank you for registration');
}
}
?>
Отправка уведомления пользователю
После создания класса уведомления, его можно отправить конкретному пользователю. Используем фасад Notification для отправки:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Notification;
class UserController extends Controller
{
public function register()
{
$user = User::first();
Notification::send($user, new WelcomeNotification());
return 'Notification sent';
}
}
?>
Результат выполнения кода:
"Notification sent"
Отправка уведомления нескольким пользователям
Метод send позволяет отправлять уведомления нескольким получателям одновременно. Передадим коллекцию пользователей первым параметром:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Notification;
class UserController extends Controller
{
public function sendToAll()
{
$users = User::where('active', true)->get();
Notification::send($users, new WelcomeNotification());
return 'Notifications sent to all active users';
}
}
?>
Результат выполнения кода:
"Notifications sent to all active users"
Отправка уведомления через трейт Notifiable
Модели, использующие трейт Notifiable, получают метод notify, который упрощает отправку уведомлений. Этот подход более лаконичен, когда уведомление отправляется конкретному экземпляру модели:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\WelcomeNotification;
class UserController extends Controller
{
public function welcome()
{
$user = User::find(1);
$user->notify(new WelcomeNotification());
return 'Welcome notification sent';
}
}
?>
Результат выполнения кода:
"Welcome notification sent"
Отправка уведомления с использованием Mailable-класса
Для более сложных писем можно использовать Mailable-классы внутри метода toMail. Это даёт полный контроль над видом письма:
<?php
namespace App\Notifications;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Mail\InvoiceMailable;
class InvoiceNotification extends Notification implements ShouldQueue
{
protected $invoice;
public function __construct($invoice)
{
$this->invoice = $invoice;
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new InvoiceMailable($this->invoice))->to($notifiable->email);
}
}
?>
Отправим это уведомление пользователю с указанием счёта:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Invoice;
use App\Notifications\InvoiceNotification;
class InvoiceController extends Controller
{
public function sendInvoice()
{
$user = User::first();
$invoice = Invoice::first();
$user->notify(new InvoiceNotification($invoice));
return 'Invoice notification sent';
}
}
?>
Результат выполнения кода:
"Invoice notification sent"
Метод sendNow - синхронная отправка
Метод sendNow отправляет уведомление синхронно, игнорируя очереди. Это полезно, когда уведомление должно быть отправлено немедленно:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Notification;
class UserController extends Controller
{
public function sendNow()
{
$user = User::first();
Notification::sendNow($user, new WelcomeNotification());
return 'Notification sent immediately';
}
}
?>
Результат выполнения кода:
"Notification sent immediately"
Метод route - указание почтового адреса
Метод route позволяет указать адрес электронной почты для отправки, даже если у модели нет свойства email. Это удобно для отправки уведомлений на произвольный адрес:
<?php
namespace App\Http\Controllers;
use App\Notifications\WelcomeNotification;
use Illuminate\Support\Facades\Notification;
class UserController extends Controller
{
public function sendToEmail()
{
$email = 'user@example.com';
Notification::route('mail', $email)
->notify(new WelcomeNotification());
return 'Notification sent to custom email';
}
}
?>
Результат выполнения кода:
"Notification sent to custom email"