Обработка событий
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.