registerEventListener( LoadSettingsScriptsEvent::class, LoadAdditionalSettingsScriptsListener::class, -100 ); } public function boot(IBootContext $context): void { $context->injectFn(Closure::fromCallable([$this, 'registerRuleListeners'])); } private function registerRuleListeners(IEventDispatcher $dispatcher, ContainerInterface $container, LoggerInterface $logger): void { /** @var Manager $manager */ $manager = $container->get(Manager::class); $configuredEvents = $manager->getAllConfiguredEvents(); foreach ($configuredEvents as $operationClass => $events) { foreach ($events as $entityClass => $eventNames) { array_map(function (string $eventName) use ($manager, $container, $dispatcher, $logger, $operationClass, $entityClass): void { $dispatcher->addListener( $eventName, function ($event) use ($manager, $container, $eventName, $logger, $operationClass, $entityClass): void { $ruleMatcher = $manager->getRuleMatcher(); try { /** @var IEntity $entity */ $entity = $container->get($entityClass); /** @var IOperation $operation */ $operation = $container->get($operationClass); $ruleMatcher->setEventName($eventName); $ruleMatcher->setEntity($entity); $ruleMatcher->setOperation($operation); $ctx = new LogContext(); $ctx ->setOperation($operation) ->setEntity($entity) ->setEventName($eventName); /** @var Logger $flowLogger */ $flowLogger = $container->get(Logger::class); $flowLogger->logEventInit($ctx); if ($event instanceof Event) { $entity->prepareRuleMatcher($ruleMatcher, $eventName, $event); $operation->onEvent($eventName, $event, $ruleMatcher); } else { $logger->debug( 'Cannot handle event {name} of {event} against entity {entity} and operation {operation}', [ 'app' => self::APP_ID, 'name' => $eventName, 'event' => get_class($event), 'entity' => $entityClass, 'operation' => $operationClass, ] ); } $flowLogger->logEventDone($ctx); } catch (ContainerExceptionInterface $e) { // Ignore query exceptions since they might occur when an entity/operation were set up before by an app that is disabled now } } ); }, $eventNames ?? []); } } } }