Связывание событий в Laravel

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

Для чего нужны события

В Laravel событие - это класс, представляющий конкретное событие или действие, которое происходит в вашем приложении.

События служат способом уведомлять другие части вашего приложения о том, когда происходит что-то важное или значимое.

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

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

Когда событие запускается в Laravel, оно запускает последовательность действий. Эти действия могут включать в себя выполнение прослушивателей событий, отправку уведомлений, обновление данных, ведение журнала или любую другую логику, которую вы определяете.

Чтобы создать событие, запустите следующую команду artisan:

php artisan make:event cablestatus

Эта команда генерирует файл класса event в каталоге app/Events. Затем вы можете определить свойства и методы внутри этого класса, чтобы инкапсулировать данные и поведение, связанные с событием.

Приведенный ниже фрагмент кода является примером события CableStatusChange. Он получает свой параметр через конструктор и сохраняет их как общедоступные свойства.

<?php

namespace App\Events;

use App\Models\Cable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class CableStatusChanged
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(public Cable $cable, public int $cablePairStatusId) {

    }

}

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

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

Прослушиватели событий отвечают за реагирование на события и выполнение действий, основанных на этих событиях.

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

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

php artisan make:listener ChnageCableStatus --event=CableStatusChanged

После выполнения команды Laravel сгенерирует новый файл класса listener в каталоге app/Listeners. Вы можете найти и изменить этот файл, чтобы определить логику обработки события. В классе listener вы обычно реализуете метод handle(), который содержит код, который должен выполняться при запуске события.

После того как вы создали прослушиватель событий, вам необходимо зарегистрировать его в своем приложении. Это можно сделать в классе EventServiceProvider, расположенном в каталоге app/Providers. Внутри свойства listen поставщика услуг вы можете указать события и соответствующие им прослушиватели:

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event to listener mappings for the application.
     *
     * @var array<class-string, array<int, class-string>>
     */
    protected $listen = [
        CableStatusChanged::class => [
            ChangeCableStatus::class,
            RegisterCableStatusChange::class,
        ]
    ];

}

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

Обьеденение в цепочку событий

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

Важно помнить, что порядок слушателей в цепочке имеет значение. Если ChangeCableStatus изменяет данные события или отменяет событие, последующие прослушиватели могут получать другие данные или вообще не выполняться. Поэтому важно учитывать порядок следования слушателей при их объединении в цепочку.

Объединяя прослушиватели в цепочку, вы можете создать модульную и гибкую систему, управляемую событиями, в Laravel, где разные прослушиватели могут обрабатывать определенные аспекты события или выполнять разные задачи в ответ на одно и то же событие.

class ChangeCableStatus {
    /**
     * Handle the event.
     *
     * @param  \App\Events\CableStatusChanged  $event
     * @return void
     */
    public function handle(CableStatusChanged $event) {
        $event->cable->connection_points()
            ->get()
            ->each
            ->update(['cable_pair_status_id' => $event->cablePairStatusId]);
    }

}

Прослушиватель событий в приведенном выше примере получает событие и соответствующим образом обновляет базу данных приложения.

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

В Laravel вы можете запустить событие, используя вспомогательную функцию event() или фасад события. Вот как вы можете запустить событие с помощью Eventfacade:

$cablePairStatusIdIsDirty &&
    CableStatusChanged::dispatch($this->cable, $this->cablePairStatusId);

В обоих случаях вы создаете новый экземпляр класса event (CableStatusChanged) и передаете любые необходимые данные в качестве аргументов его конструктора.

Вывод

В качестве резюме позвольте мне выделить преимущества системы управления событиями Laravel:

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

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

Гибкость: Благодаря архитектуре, управляемой событиями, ваше приложение становится более гибким и адаптируемым. Запуская события и подключая прослушиватели, вы можете легко внедрять новые функции или изменять существующее поведение, добавляя или модифицируя прослушиватели событий. Это способствует масштабируемости и упрощает обслуживание и эволюцию вашего приложения с течением времени.

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

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

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