Урок 15: Работа с событиями и слушателями в Laravel

На 15-ом уроке мы рассмотрим один из самых мощных инструментов Laravel, это события и слушатели.
Если вы когда-нибудь задумывались, как сделать ваше приложение гибким и легко расширяемым, то события нужно понять и изучить. Они позволяют разделять логику приложения, делая код чище и поддерживаемее. В этом уроке я покажу, как создавать события, регистрировать слушатели, отправлять уведомления и работать с очередями.

Что такое события?

События (Events) в Laravel это способ реагировать на определенные действия в вашем приложении. Например:

  • Пользователь зарегистрировался → отправить приветственное письмо.
  • Статья опубликована → уведомить подписчиков.
  • Заказ оформлен → обновить складские остатки.

Преимущества событий:

  • Декомпозиция кода. Логика разбивается на независимые части.
  • Гибкость. Можно добавлять новые обработчики без изменения существующего кода.
  • Масштабируемость. События легко интегрируются с очередями для асинхронной обработки.

Создание событий

События в Laravel это обычные PHP-классы. Давайте создадим событие UserRegistered, которое будет вызываться после регистрации пользователя.

Шаг 1: Генерация события

Откройте терминал и выполните:

bash
php artisan make:event UserRegistered

В папке app/Events появится файл UserRegistered.php.

Шаг 2: Редактирование события

Добавим пользователя в конструктор, чтобы передать его данные в слушатели:

php
<?php  

namespace App\Events;  

use App\Models\User;  
use Illuminate\Foundation\Events\Dispatchable;  
use Illuminate\Queue\SerializesModels;  

class UserRegistered  
{  
    use Dispatchable, SerializesModels;  

    public $user;  

    public function __construct(User $user)  
    {  
        $this->user = $user;  
    }  
}  

Регистрация слушателей

Слушатели (Listeners) это классы, которые реагируют на события. Например, слушатель SendWelcomeEmail отправит письмо при регистрации.

Шаг 1: Создание слушателя

Выполните команду:

bash
php artisan make:listener SendWelcomeEmail --event=UserRegistered

Файл SendWelcomeEmail.php будет создан в app/Listeners.

Шаг 2: Регистрация в провайдере

Откройте app/Providers/EventServiceProvider.php и добавьте связь события и слушателя:

php
protected $listen = [  
    UserRegistered::class => [  
        SendWelcomeEmail::class,  
    ],  
];

Шаг 3: Реализация слушателя

Допишем логику отправки письма:

php
<?php  

namespace App\Listeners;  

use App\Events\UserRegistered;  
use App\Mail\WelcomeEmail;  
use Illuminate\Support\Facades\Mail;  

class SendWelcomeEmail  
{  
    public function handle(UserRegistered $event)  
    {  
        Mail::to($event->user->email)->send(new WelcomeEmail($event->user));  
    }  
}  

Пример: отправка уведомления при регистрации

Давайте закрепим знания на примере.

Шаг 1: Вызов события

В контроллере регистрации вызовите событие:

php
use App\Events\UserRegistered;  

public function register(Request $request)  
{  
    // ... код регистрации ...  
    $user = User::create($request->validated());  
    event(new UserRegistered($user));  
    return redirect('/home');  
}

Шаг 2: Создание письма

Сгенерируйте mailable-класс:

bash
php artisan make:mail WelcomeEmail

Реализуйте содержимое письма в app/Mail/WelcomeEmail.php:

php
public function build()  
{  
    return $this->view('emails.welcome')  
                ->with(['user' => $this->user]);  
}

Очереди и отложенная обработка

Если задача требует времени (например, отправка тяжелых файлов), ее можно вынести в очередь.

Шаг 1: Настройка очередей

В .env укажите драйвер (например, Redis или database):

env
QUEUE_CONNECTION=database

Создайте таблицу для очередей:

bash
php artisan queue:table  
php artisan migrate

Шаг 2: Отправка в очередь

Измените слушатель SendWelcomeEmail, чтобы он реализовывал интерфейс ShouldQueue:

php
use Illuminate\Contracts\Queue\ShouldQueue;  

class SendWelcomeEmail implements ShouldQueue  
{  
    // ...  
}

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

Шаг 3: Запуск обработчика очередей

bash
php artisan queue:work

Практические задания

  1. Создайте событие ArticlePublished, которое срабатывает при публикации статьи.
  2. Добавьте слушатель для отправки уведомления администратору.
  3. Интегрируйте очередь для отложенной отправки.

Пример кода для задания 1:

php
// Событие  
php artisan make:event ArticlePublished  

// Слушатель  
php artisan make:listener NotifyAdmin --event=ArticlePublished

Итоги 15-го урока

Сегодня мы разобрали, как события и слушатели делают код чище, а приложение гибким. Вы научились:

  • Создавать события.
  • Регистрировать слушатели.
  • Работать с очередями.

Полный курс с уроками по Laravel для начинающих по ссылке https://max-gabov.ru/laravel-dlya-nachinaushih