GenericEventSubscriber.php in Rules 8.3
File
src/EventSubscriber/GenericEventSubscriber.php
View source
<?php
namespace Drupal\rules\EventSubscriber;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\rules\Context\ExecutionState;
use Drupal\rules\Core\RulesConfigurableEventHandlerInterface;
use Drupal\rules\Core\RulesEventManager;
use Drupal\rules\Engine\RulesComponentRepositoryInterface;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class GenericEventSubscriber implements EventSubscriberInterface {
protected $entityTypeManager;
protected $eventManager;
protected $componentRepository;
protected $rulesDebugLogger;
public function __construct(EntityTypeManagerInterface $entity_type_manager, RulesEventManager $event_manager, RulesComponentRepositoryInterface $component_repository, LoggerChannelInterface $logger) {
$this->entityTypeManager = $entity_type_manager;
$this->eventManager = $event_manager;
$this->componentRepository = $component_repository;
$this->rulesDebugLogger = $logger;
}
public static function getSubscribedEvents() {
$events = [];
$callback = [
'onRulesEvent',
100,
];
if (!\Drupal::hasService('state')) {
return [];
}
$state = \Drupal::state();
$registered_event_names = $state
->get('rules.registered_events');
if (!empty($registered_event_names)) {
foreach ($registered_event_names as $event_name) {
$events[$event_name][] = $callback;
}
}
return $events;
}
public function onRulesEvent(Event $event, $event_name) {
$event_definition = $this->eventManager
->getDefinition($event_name);
$handler_class = $event_definition['class'];
$triggered_events = [
$event_name,
];
if (is_subclass_of($handler_class, RulesConfigurableEventHandlerInterface::class)) {
$qualified_event_suffixes = $handler_class::determineQualifiedEvents($event, $event_name, $event_definition);
foreach ($qualified_event_suffixes as $qualified_event_suffix) {
$triggered_events[] = "{$event_name}--{$qualified_event_suffix}";
}
}
$state = ExecutionState::create();
foreach ($event_definition['context_definitions'] as $context_name => $context_definition) {
if ($event instanceof GenericEvent) {
$value = $event
->getArgument($context_name);
}
else {
$value = $event->{$context_name};
}
$state
->setVariable($context_name, $context_definition, $value);
}
$components = $this->componentRepository
->getMultiple($triggered_events, 'rules_event');
foreach ($components as $component) {
$this->rulesDebugLogger
->info('Reacting on event %label.', [
'%label' => $event_definition['label'],
'element' => NULL,
'scope' => TRUE,
]);
$component
->getExpression()
->executeWithState($state);
$this->rulesDebugLogger
->info('Finished reacting on event %label.', [
'%label' => $event_definition['label'],
'element' => NULL,
'scope' => FALSE,
]);
}
$state
->autoSave();
}
}