Верижни събития в Laravel

Системата за управление на събития Laravel предоставя гъвкав и мощен механизъм за внедряване на управлявана от събития архитектура във вашето приложение. Той насърчава отделяне, модулност, повторна употреба и възможност за тестване, като същевременно позволява лесно разширяване и адаптивност.

В Laravel събитието е клас, който представлява конкретно събитие или действие, което се извършва във вашето приложение.

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

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

Когато дадено събитие се задейства в Laravel, то задейства последователност от действия. Тези действия могат да включват изпълнение на слушатели на събития, изпращане на известия, актуализиране на данни, регистриране или друга логика, която дефинирате.

За да създадете събитие, изпълнете следната команда artisan:

php artisan make:event CableStatusChanged

Тази команда генерира файл с клас на събитие в директорията 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 ще генерира нов файл с клас слушател в директорията app/Listeners. Можете да намерите и модифицирате този файл, за да дефинирате логиката за обработка на събитието. В рамките на класа слушател обикновено ще имплементирате метода 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() или фасадата Event. Ето как можете да задействате събитие с помощта на Eventfacade:

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

И в двата случая вие създавате нов екземпляр на класа на събитието (CableStatusChanged) и предавате всички необходими данни като аргументи на неговия конструктор.

Като обобщение нека подчертая предимствата на системата за управление на събития на Laravel:

  1. Раздвоена архитектура: Събитията позволяват отделена архитектура чрез разделяне на кода, който задейства събитие, от кода, който обработва събитието. Това насърчава хлабавото свързване между различните компоненти на вашето приложение, което улеснява модифицирането или разширяването на функционалността без директно модифициране на съществуващия код.
  2. Модулност и повторно използване: Събитията предоставят модулен и многократно използваем подход за обработка на конкретни събития или действия във вашето приложение. Можете да дефинирате събития и съответните им слушатели, което ви позволява да добавяте или премахвате слушатели, ако е необходимо. Това насърчава организацията на кода и повторната употреба в различни части на вашето приложение.
  3. Гъвкавост: С управляваната от събития архитектура вашето приложение става по-гъвкаво и адаптивно. Чрез задействане на събития и прикачване на слушатели можете лесно да въведете нови функции или да промените съществуващото поведение чрез добавяне или модифициране на слушатели на събития. Това насърчава мащабируемостта и улеснява поддържането и развитието на вашето приложение с течение на времето.
  4. Подобрена възможност за тестване: Събитията улесняват писането на модулни тестове за конкретна функционалност във вашето приложение. Можете да тествате слушателите на събития независимо, като се уверите, че реагират по подходящ начин на събитията и изпълняват очакваните действия. Това подобрява цялостната възможност за тестване и поддръжка на вашата кодова база.
  5. Извличане и регистриране на събития: Събитията на Laravel могат да се използват за източник на събития, където събитията се съхраняват и използват за възстановяване на състоянието на приложението. Това позволява одит, хронологично проследяване и функционалност за отмяна/възвръщане. Събитията могат също да се регистрират, за да се осигури изчерпателен запис на важни събития във вашето приложение, улеснявайки отстраняването на грешки и отстраняването на проблеми.
  6. Асинхронна обработка: Системата за събития на Laravel поддържа асинхронна обработка на събития, което позволява на слушателите да бъдат обработвани асинхронно. Това може да бъде особено полезно, когато се занимавате с отнемащи време или ресурсоемки задачи, тъй като разтоварва обработката на фонова опашка, подобрявайки производителността и отзивчивостта.