Часто в проектах Laravel встречаются ситуации, когда код начинает напоминать клубок проводов: одно место меняешь — и где-то ломается. События и слушатели помогают это разрулить. Идея проста: кто-то вызывает событие, а кто-то на него реагирует, при этом не знают друг о друге.

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

Чтобы создать событие, используй команду Artisan make:event. Например, чтобы создать событие OrderShipped, выполни:

php artisan make:event OrderShipped

Это создаст новый класс события в каталоге app/Events.

Определение события

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

class OrderShipped implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }
}

Отправка события

Чтобы отправить событие, используй фасад Event или метод dispatch на экземпляре события.

event(new OrderShipped($order));

или

OrderShipped::dispatch($order);

Создание слушателя

Чтобы создать слушателя события, используй команду Artisan make:listener. Например, чтобы создать слушателя для события OrderShipped, выполни:

php artisan make:listener SendShipmentNotification --event=OrderShipped

Это создаст новый класс слушателя в каталоге app/Listeners.

Определение слушателя

Открой созданный класс слушателя и реализуй метод handle, который будет вызван при отправке события.

public function handle(OrderShipped $event)
{
    // Логика обработки события
}

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

Чтобы зарегистрировать слушателя, добавь его в массив $listen в файле app/Providers/EventServiceProvider.php.

protected $listen = [
    OrderShipped::class => [
        SendShipmentNotification::class,
    ],
];

Заключение

События и слушатели — это способ разделять код и не делать из приложения кашу. Хочешь добавить новый функционал? Создай событие и слушатель, ничего не ломая в остальном коде. Это реально экономит время и нервы, особенно на больших проектах.