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

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::dispatch($event_name, $data); или 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::dispatch('user.register', $user);
    }
}

Для публикации есть две функции: Event::dispatch($event_name, $data); и Event::emit($event_name, $data); — параметры одинаковы. Разница: emit перехватывает исключения внутренне; если одна функция выбросит исключение, остальные всё равно выполнятся. dispatch не перехватывает исключения; при исключении в любой функции выполнение прерывается и исключение пробрасывается выше.

Совет
Параметр $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 для просмотра всех настроенных событий и слушателей.

Область поддержки

Помимо основного проекта, базовые плагины и плагины приложений также поддерживают конфигурацию event.php.
Файл конфигурации базового плагина: config/plugin/поставщик/имя-плагина/event.php
Файл конфигурации плагина приложения: plugin/имя-плагина/config/event.php

Замечания

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