Обработка событий

webman/event предоставляет изящный механизм событий, который позволяет выполнять бизнес-логику без вмешательства в код и обеспечивает декупликацию между бизнес-модулями. Типичный сценарий - при успешной регистрации нового пользователя достаточно опубликовать пользовательское событие, такое как user.register, и различные модули смогут получить это событие и выполнить соответствующую бизнес-логику.

Установка

composer require webman/event

Подписка на события

Подписка на события осуществляется через файл config/event.php

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...другие функции обработки событий...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...другие функции обработки событий...
    ]
];

Объяснение:

  • user.register и user.logout - это названия событий, в виде строки, рекомендуется использовать нижний регистр для слов и разделять их точкой (.)
  • Одно событие может иметь несколько функций обработки, вызов происходит в порядке, указанном в конфигурации

Функции обработки событий

Функции обработки событий могут быть любыми методами класса, функциями, замыканиями и т.д.
Например, создание класса обработки событий app/event/User.php (если папки не существуют, их нужно создать)

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

Публикация событий

Для публикации события используйте Event::emit($event_name, $data);, например

<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
    public function register(Request $request)
    {
        $user = [
            'name' => 'webman',
            'age' => 2
        ];
        Event::emit('user.register', $user);
    }
}

Совет
Параметр $data функции Event::emit($event_name, $data); может быть любыми данными, такими как массив, экземпляр класса, строка и так далее

Слушание событий с использованием метасимволов

Регистрация слушателя метасимволов позволяет обрабатывать несколько событий в одном слушателе, например, в config/event.php настроено следующее

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

Мы можем получить конкретное название события через второй параметр функции обработки событий $event_data

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // конкретное название события, например, user.register или user.logout и так далее
        var_export($user);
    }
}

Остановка трансляции события

Когда мы возвращаем false в функции обработки событий, трансляция события будет прекращена

Обработка событий с использованием замыканий

Функции обработки событий могут быть методами класса или замыканиями, например

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

Просмотр событий и слушателей

Используйте команду php webman event:list для просмотра всех событий и слушателей, настроенных в проекте

Замечания

Обработка событий не является асинхронной, поэтому для медленных операций следует использовать очередь сообщений, например webman/redis-queue