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