diff --git a/core/lib/Drupal/Core/Entity/EntityEvent.php b/core/lib/Drupal/Core/Entity/EntityEvent.php new file mode 100644 index 0000000..539f6d6 --- /dev/null +++ b/core/lib/Drupal/Core/Entity/EntityEvent.php @@ -0,0 +1,33 @@ +entity = $entity; + } + + /** + * @return \Drupal\Core\Entity\EntityInterface + */ + public function getEntity() { + return $this->entity; + } + +} diff --git a/core/lib/Drupal/Core/Entity/EntityEvents.php b/core/lib/Drupal/Core/Entity/EntityEvents.php new file mode 100644 index 0000000..aae0066 --- /dev/null +++ b/core/lib/Drupal/Core/Entity/EntityEvents.php @@ -0,0 +1,64 @@ + EntityEvents::CREATE, + 'insert' => EntityEvents::INSERT, + 'update' => EntityEvents::UPDATE, + 'presave' => EntityEvents::PRESAVE, + 'delete' => EntityEvents::DELETE, + 'predelete' => EntityEvents::PREDELETE, + ]; + if (isset($hook_to_event_map[$hook])) { + \Drupal::service('event_dispatcher')->dispatch($hook_to_event_map[$hook], new EntityEvent($entity)); + } + // Invoke the hook. $this->moduleHandler()->invokeAll($this->entityTypeId . '_' . $hook, array($entity)); // Invoke the respective entity-level hook. diff --git a/core/modules/system/tests/modules/entity_test_event/entity_test_event.info.yml b/core/modules/system/tests/modules/entity_test_event/entity_test_event.info.yml new file mode 100644 index 0000000..5089f4b --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_event/entity_test_event.info.yml @@ -0,0 +1,4 @@ +name: entity_test_event +type: module +package: Testing +core: 8.x diff --git a/core/modules/system/tests/modules/entity_test_event/entity_test_event.services.yml b/core/modules/system/tests/modules/entity_test_event/entity_test_event.services.yml new file mode 100644 index 0000000..e20270c --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_event/entity_test_event.services.yml @@ -0,0 +1,5 @@ +services: + entity_test_event.event_subscriber: + class: \Drupal\entity_test_event\EventSubscriber\TestEventSubscriber + tags: + - { name: event_subscriber } diff --git a/core/modules/system/tests/modules/entity_test_event/src/EventSubscriber/TestEventSubscriber.php b/core/modules/system/tests/modules/entity_test_event/src/EventSubscriber/TestEventSubscriber.php new file mode 100644 index 0000000..8566ba0 --- /dev/null +++ b/core/modules/system/tests/modules/entity_test_event/src/EventSubscriber/TestEventSubscriber.php @@ -0,0 +1,44 @@ +getEntity()->name->value === 'hei') { + $event->getEntity()->name->value .= ' ho'; + } + } + + public function onUpdate(EntityEvent $event) { + if ($event->getEntity()->name->value === 'hei') { + $event->getEntity()->name->value .= ' ho'; + } + } + + public function onDelete(EntityEvent $event) { + if ($event->getEntity()->name->value === 'hei ho') { + EntityTest::create([ + 'name' => 'hei_ho' + ])->save(); + $event->getEntity()->name->value .= ' ho'; + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + $events[EntityEvents::INSERT] = 'onInsert'; + $events[EntityEvents::UPDATE] = 'onUpdate'; + $events[EntityEvents::DELETE] = 'onDelete'; + return $events; + } + + +} diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityEventsTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityEventsTest.php new file mode 100644 index 0000000..99faba98 --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityEventsTest.php @@ -0,0 +1,64 @@ +installEntitySchema('entity_test'); + } + + public function testEventsInsert() { + $entity = EntityTest::create([ + 'name' => 'hei', + ]); + $entity->save(); + $this->assertEquals('hei ho', $entity->name->value); + } + + public function testEventsUpdate() { + $entity = EntityTest::create([ + 'name' => 'meh', + ]); + $entity->save(); + $this->assertEquals('meh', $entity->name->value); + + $entity->name->value = 'hei'; + $entity->save(); + $this->assertEquals('hei ho', $entity->name->value); + } + + public function testEventsDelete() { + $entities = \Drupal::entityTypeManager()->getStorage('entity_test') + ->loadByProperties(['name' => 'hei_ho']); + $this->assertCount(0, $entities); + + $entity = EntityTest::create([ + 'name' => 'hei', + ]); + $entity->save(); + $entity->delete(); + + // Note the delete event creates another entity. + $entities = \Drupal::entityTypeManager()->getStorage('entity_test') + ->loadByProperties(['name' => 'hei_ho']); + $this->assertCount(1, $entities); + } + +} diff --git a/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php index 4fbdba3..ef4a51c 100644 --- a/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/KeyValueStore/KeyValueEntityStorageTest.php @@ -8,6 +8,7 @@ use Drupal\Core\Language\Language; use Drupal\Tests\UnitTestCase; use Drupal\Core\Entity\KeyValueStore\KeyValueEntityStorage; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * @coversDefaultClass \Drupal\Core\Entity\KeyValueStore\KeyValueEntityStorage @@ -119,12 +120,14 @@ protected function setUpKeyValueEntityStorage($uuid_key = 'uuid') { $this->languageManager->expects($this->any()) ->method('getCurrentLanguage') ->will($this->returnValue($language)); + $event_dispatcher = $this->prophesize(EventDispatcherInterface::class); $this->entityStorage = new KeyValueEntityStorage($this->entityType, $this->keyValueStore, $this->uuidService, $this->languageManager); $this->entityStorage->setModuleHandler($this->moduleHandler); $container = new ContainerBuilder(); $container->set('entity.manager', $this->entityManager); + $container->set('event_dispatcher', $event_dispatcher->reveal()); $container->set('language_manager', $this->languageManager); $container->set('cache_tags.invalidator', $this->cacheTagsInvalidator); \Drupal::setContainer($container); diff --git a/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php index 56b4b00..064f61e 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Sql/SqlContentEntityStorageTest.php @@ -14,6 +14,7 @@ use Drupal\Core\Language\Language; use Drupal\Tests\UnitTestCase; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * @coversDefaultClass \Drupal\Core\Entity\Sql\SqlContentEntityStorage @@ -980,10 +981,12 @@ public function testCreate() { $language_manager->expects($this->any()) ->method('getCurrentLanguage') ->will($this->returnValue($language)); + $event_dispatcher = $this->prophesize(EventDispatcherInterface::class); $this->container->set('language_manager', $language_manager); $this->container->set('entity.manager', $this->entityManager); $this->container->set('module_handler', $this->moduleHandler); + $this->container->set('event_dispatcher', $event_dispatcher->reveal()); $entity = $this->getMockBuilder('Drupal\Core\Entity\ContentEntityBase') ->disableOriginalConstructor()