bp/docs/EventManager.txt

64 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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