add EventManager and Subscription

This commit is contained in:
root
2026-01-13 12:08:40 +03:00
parent 3d39c1ba07
commit 3c24c250e5
6 changed files with 785 additions and 0 deletions
+64
View File
@@ -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.