64 lines
4.1 KiB
Plaintext
64 lines
4.1 KiB
Plaintext
Примеры использования событийной системы
|
||
|
||
Для создания интеграций между модулями, которые должны работать только при наличии активной подписки, используется метод 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. |