diff --git a/core/core.services.yml b/core/core.services.yml index a4327bda9b..6effc96f54 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -585,6 +585,11 @@ services: arguments: ['@entity_type.manager'] tags: - { name: event_subscriber } + entity_events_subscriber: + class: Drupal\Core\EventSubscriber\EntityEventsSubscriber + arguments: ['@module_handler'] + tags: + - { name: event_subscriber } entity.definition_update_manager: class: Drupal\Core\Entity\EntityDefinitionUpdateManager arguments: ['@entity_type.manager', '@entity.last_installed_schema.repository', '@entity_field.manager', '@entity_type.listener', '@field_storage_definition.listener'] diff --git a/core/lib/Drupal/Core/Entity/EntityStorageBase.php b/core/lib/Drupal/Core/Entity/EntityStorageBase.php index ac6d582c5e..e3b95d406b 100644 --- a/core/lib/Drupal/Core/Entity/EntityStorageBase.php +++ b/core/lib/Drupal/Core/Entity/EntityStorageBase.php @@ -202,8 +202,6 @@ protected function setStaticCache(array $entities) { protected function invokeHook($hook, EntityInterface $entity) { // Invoke the hook. $this->moduleHandler()->invokeAll($this->entityTypeId . '_' . $hook, [$entity]); - // Invoke the respective entity-level hook. - $this->moduleHandler()->invokeAll('entity_' . $hook, [$entity]); // Dispatch events for the invoked hook. /** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher */ diff --git a/core/lib/Drupal/Core/EventSubscriber/EntityEventsSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/EntityEventsSubscriber.php new file mode 100644 index 0000000000..74d02ff9f1 --- /dev/null +++ b/core/lib/Drupal/Core/EventSubscriber/EntityEventsSubscriber.php @@ -0,0 +1,64 @@ +moduleHandler = $module_handler; + } + + /** + * Provides hooks for entity specific events. + * + * @param \Drupal\Core\Entity\EntityEvent $event + * The entity event. + * @param string $event_name + * The related entity event name. + */ + public function onEntityEvent(EntityEvent $event, $event_name) { + $hook = array_search($event_name, EntityEvents::$hookToEventMap); + if ($hook) { + $this->moduleHandler->invokeAll('entity_' . $hook, [$event->getEntity()]); + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + // Hooks should be executed before other subscribers for BC. + $priority = -1000; + $events[EntityEvents::CREATE][] = ['onEntityEvent', $priority]; + $events[EntityEvents::PRESAVE][] = ['onEntityEvent', $priority]; + $events[EntityEvents::INSERT][] = ['onEntityEvent', $priority]; + $events[EntityEvents::UPDATE][] = ['onEntityEvent', $priority]; + $events[EntityEvents::PREDELETE][] = ['onEntityEvent', $priority]; + $events[EntityEvents::DELETE][] = ['onEntityEvent', $priority]; + return $events; + } + +}