From c828a3814b410871c935efe7913d8114f7ab2204 Mon Sep 17 00:00:00 2001 From: HypeMC <2445045+HypeMC@users.noreply.github.com> Date: Wed, 26 Oct 2022 10:36:06 +0200 Subject: [PATCH] Automap events in AttachEntityListenersListener (#10122) --- .../Tools/AttachEntityListenersListener.php | 11 +++++--- .../AttachEntityListenersListenerTest.php | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/AttachEntityListenersListener.php b/lib/Doctrine/ORM/Tools/AttachEntityListenersListener.php index d1657367eef..8b3e7977ad4 100644 --- a/lib/Doctrine/ORM/Tools/AttachEntityListenersListener.php +++ b/lib/Doctrine/ORM/Tools/AttachEntityListenersListener.php @@ -5,6 +5,7 @@ namespace Doctrine\ORM\Tools; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; +use Doctrine\ORM\Mapping\Builder\EntityListenerBuilder; use function ltrim; @@ -17,11 +18,11 @@ class AttachEntityListenersListener private $entityListeners = []; /** - * Adds a entity listener for a specific entity. + * Adds an entity listener for a specific entity. * * @param string $entityClass The entity to attach the listener. * @param string $listenerClass The listener class. - * @param string $eventName The entity lifecycle event. + * @param string|null $eventName The entity lifecycle event. * @param string|null $listenerCallback The listener callback method or NULL to use $eventName. * * @return void @@ -49,7 +50,11 @@ public function loadClassMetadata(LoadClassMetadataEventArgs $event) } foreach ($this->entityListeners[$metadata->name] as $listener) { - $metadata->addEntityListener($listener['event'], $listener['class'], $listener['method']); + if ($listener['event'] === null) { + EntityListenerBuilder::bindEntityListener($metadata, $listener['class']); + } else { + $metadata->addEntityListener($listener['event'], $listener['class'], $listener['method']); + } } unset($this->entityListeners[$metadata->name]); diff --git a/tests/Doctrine/Tests/ORM/Tools/AttachEntityListenersListenerTest.php b/tests/Doctrine/Tests/ORM/Tools/AttachEntityListenersListenerTest.php index e26d072212f..485794e331a 100644 --- a/tests/Doctrine/Tests/ORM/Tools/AttachEntityListenersListenerTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/AttachEntityListenersListenerTest.php @@ -112,6 +112,31 @@ public function testDuplicateEntityListenerException(): void $this->factory->getMetadataFor(AttachEntityListenersListenerTestFooEntity::class); } + + public function testAttachWithoutSpecifyingAnEventName(): void + { + $this->listener->addEntityListener( + AttachEntityListenersListenerTestFooEntity::class, + AttachEntityListenersListenerTestListener::class, + null + ); + + $metadata = $this->factory->getMetadataFor(AttachEntityListenersListenerTestFooEntity::class); + + self::assertCount(2, $metadata->entityListeners); + + self::assertArrayHasKey('prePersist', $metadata->entityListeners); + self::assertArrayHasKey('postPersist', $metadata->entityListeners); + + self::assertCount(1, $metadata->entityListeners['prePersist']); + self::assertCount(1, $metadata->entityListeners['postPersist']); + + self::assertEquals('prePersist', $metadata->entityListeners['prePersist'][0]['method']); + self::assertEquals(AttachEntityListenersListenerTestListener::class, $metadata->entityListeners['prePersist'][0]['class']); + + self::assertEquals('postPersist', $metadata->entityListeners['postPersist'][0]['method']); + self::assertEquals(AttachEntityListenersListenerTestListener::class, $metadata->entityListeners['postPersist'][0]['class']); + } } /** @Entity */