События и слушатели в Laravel представляют собой мощный механизм для реализации шаблона проектирования "Публикация-подписка" (Publish-Subscribe), позволяя вашему приложению реагировать на различные события, происходящие в системе. В этом обзоре мы рассмотрим, как создать и использовать события и слушатели в Laravel.

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

События в Laravel представляют собой классы, которые содержат информацию о событии, которое произошло. Чтобы создать событие, используйте команду make:event:

php artisan make:event OrderShipped

Это создаст класс OrderShipped в директории app/Events. В этом классе вы можете определить данные, которые будут переданы слушателям:

<?php

namespace App\Events;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderShipped
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $order;

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

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

Слушатели в Laravel представляют собой классы, которые содержат логику, реагирующую на события. Чтобы создать слушателя, используйте команду make:listener:

php artisan make:listener SendShipmentNotification --event=OrderShipped

Это создаст класс SendShipmentNotification в директории app/Listeners. В этом классе вы можете определить метод handle, который будет вызван при возникновении события:

<?php

namespace App\Listeners;

use App\Events\OrderShipped;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class SendShipmentNotification implements ShouldQueue
{
    use InteractsWithQueue;

    public function handle(OrderShipped $event)
    {
        // Логика отправки уведомления
    }
}

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

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

protected $listen = [
    \App\Events\OrderShipped::class => [
        \App\Listeners\SendShipmentNotification::class,
    ],
];

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

Чтобы отправить событие, используйте метод event:

event(new OrderShipped($order));

5. Очередь слушателей

Если ваш слушатель реализует интерфейс ShouldQueue, Laravel автоматически поместит его в очередь для асинхронной обработки. Убедитесь, что у вас настроен и запущен очередире, чтобы использовать эту функцию.

Заключение

События и слушатели в Laravel предоставляют мощный и гибкий способ реализации шаблона проектирования "Публикация-подписка", позволяя вашему приложению реагировать на различные события, происходящие в системе. Это позволяет вам легко расширять функциональность вашего приложения, добавляя новые обработчики событий без изменения основного кода.