Примеры использования событийной системы Для создания интеграций между модулями, которые должны работать только при наличии активной подписки, используется метод moduleOn(). Ниже приведен пример инициализации событий в файле модуля, например в app/Modules/Crm/Config/Events.php: php 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 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.