add EventManager and Subscription
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
Примеры использования событийной системы
|
||||
|
||||
Для создания интеграций между модулями, которые должны работать только при наличии активной подписки, используется метод moduleOn(). Ниже приведен пример инициализации событий в файле модуля, например в app/Modules/Crm/Config/Events.php:
|
||||
|
||||
php
|
||||
|
||||
<?php
|
||||
|
||||
namespace App\Modules\Crm\Config;
|
||||
|
||||
use service('eventManager');
|
||||
|
||||
/**
|
||||
* Регистрация событий модуля CRM
|
||||
* События будут выполняться только при активной подписке на CRM
|
||||
*/
|
||||
$em = service('eventManager');
|
||||
$em->forModule('crm');
|
||||
|
||||
// При создании нового клиента отправляем приветственное письмо
|
||||
$em->moduleOn('clients.created', function($client) {
|
||||
$emailService = service('email');
|
||||
$emailService->sendWelcomeEmail($client->email, $client->name);
|
||||
});
|
||||
|
||||
// При изменении статуса сделки обновляем метрики
|
||||
$em->moduleOn('deals.status_changed', function($deal, $oldStatus, $newStatus) {
|
||||
service('analytics')->trackDealStatusChange($deal->id, $oldStatus, $newStatus);
|
||||
});
|
||||
|
||||
// Логируем все действия с клиентами
|
||||
$em->moduleOn('clients.*', function($event, $data) {
|
||||
service('audit')->log('crm_client_activity', $data);
|
||||
});
|
||||
|
||||
|
||||
Для системных событий, которые должны выполняться всегда независимо от статуса подписки, используется метод systemOn(). Такие события подходят для сквозной функциональности, например, логирования, аудита или сбора аналитики:
|
||||
|
||||
php
|
||||
|
||||
<?php
|
||||
|
||||
use service('eventManager');
|
||||
|
||||
$em = service('eventManager');
|
||||
|
||||
// Системное событие для логирования всех запросов к базе данных
|
||||
$em->systemOn('DBQuery', function($query) {
|
||||
if (ENVIRONMENT === 'development') {
|
||||
log_message('debug', 'DB Query: ' . $query);
|
||||
}
|
||||
});
|
||||
|
||||
// Системное событие для записи активности пользователя
|
||||
$em->systemOn('user.login', function($user) {
|
||||
service('activityLogger')->logLogin($user->id);
|
||||
});
|
||||
|
||||
|
||||
Архитектурные преимущества решения
|
||||
|
||||
Разделение событий на два типа обеспечивает гибкость при проектировании интеграций между модулями. События типа moduleOn() гарантируют, что бизнес-логика модуля выполняется только для организаций, которые оплатили доступ к этому модулю, что защищает коммерческие интересы и предотвращает несанкционированное использование функциональности. События типа systemOn() позволяют реализовывать сквозную функциональность, которая должна присутствовать в системе независимо от того, какие модули оплачены организацией, например, общие уведомления, аудит безопасности или интеграция с внешними системами мониторинга.
|
||||
|
||||
Кэширование результата проверки статуса модуля в рамках одного запроса обеспечивает высокую производительность событийной системы. При множественных подписках на события одного модуля проверка подписки выполняется только один раз, а затем результат кэшируется в свойстве $moduleActive.
|
||||
Reference in New Issue
Block a user