Skip to content

Commit d4eeb05

Browse files
committed
Register listeners instead of subscribers
Symfony 6.3 deprecated the registration of Doctrine subscribers because they cannot be lazy-loaded properly. The CI will ensure that the list of events is in sync with the library.
1 parent 5cfabc7 commit d4eeb05

File tree

3 files changed

+114
-16
lines changed

3 files changed

+114
-16
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"symfony/dependency-injection": "^4.4 || ^5.2 || ^6.0",
1818
"symfony/event-dispatcher": "^4.4 || ^5.2 || ^6.0",
1919
"symfony/http-kernel": "^4.4 || ^5.2 || ^6.0",
20-
"gedmo/doctrine-extensions": "^2.3.4 || ^3.0.0"
20+
"gedmo/doctrine-extensions": "^2.3.12 || ^3.0.0"
2121
},
2222
"require-dev": {
2323
"symfony/mime": "^4.4 || ^5.2 || ^6.0",

src/DependencyInjection/StofDoctrineExtensionsExtension.php

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,69 @@
1111

1212
class StofDoctrineExtensionsExtension extends Extension
1313
{
14+
private const LISTENER_EVENTS = array(
15+
'blameable' => array(
16+
'prePersist',
17+
'onFlush',
18+
'loadClassMetadata',
19+
),
20+
'loggable' => array(
21+
'loadClassMetadata',
22+
'onFlush',
23+
'postPersist',
24+
),
25+
'reference_integrity' => array(
26+
'loadClassMetadata',
27+
'preRemove',
28+
),
29+
'sluggable' => array(
30+
'prePersist',
31+
'onFlush',
32+
'loadClassMetadata',
33+
),
34+
'softdeleteable' => array(
35+
'loadClassMetadata',
36+
'onFlush',
37+
),
38+
'sortable' => array(
39+
'onFlush',
40+
'loadClassMetadata',
41+
'prePersist',
42+
'postPersist',
43+
'preUpdate',
44+
'postRemove',
45+
'postFlush',
46+
),
47+
'timestampable' => array(
48+
'prePersist',
49+
'onFlush',
50+
'loadClassMetadata',
51+
),
52+
'translatable' => array(
53+
'postLoad',
54+
'postPersist',
55+
'preFlush',
56+
'onFlush',
57+
'loadClassMetadata',
58+
),
59+
'tree' => array(
60+
'prePersist',
61+
'preRemove',
62+
'preUpdate',
63+
'onFlush',
64+
'loadClassMetadata',
65+
'postPersist',
66+
'postUpdate',
67+
'postRemove',
68+
),
69+
'uploadable' => array(
70+
'loadClassMetadata',
71+
'preFlush',
72+
'onFlush',
73+
'postFlush',
74+
),
75+
);
76+
1477
private $entityManagers = array();
1578
private $documentManagers = array();
1679

@@ -28,8 +91,8 @@ public function load(array $configs, ContainerBuilder $container)
2891

2992
$loaded = array();
3093

31-
$this->entityManagers = $this->processObjectManagerConfigurations($config['orm'], $container, $loader, $loaded, 'doctrine.event_subscriber');
32-
$this->documentManagers = $this->processObjectManagerConfigurations($config['mongodb'], $container, $loader, $loaded, 'doctrine_mongodb.odm.event_subscriber');
94+
$this->entityManagers = $this->processObjectManagerConfigurations($config['orm'], $container, $loader, $loaded, 'doctrine.event_listener');
95+
$this->documentManagers = $this->processObjectManagerConfigurations($config['mongodb'], $container, $loader, $loaded, 'doctrine_mongodb.odm.event_listener');
3396

3497
$container->setParameter('stof_doctrine_extensions.default_locale', $config['default_locale']);
3598
$container->setParameter('stof_doctrine_extensions.translation_fallback', $config['translation_fallback']);
@@ -94,11 +157,11 @@ public function configValidate(ContainerBuilder $container)
94157
* @param ContainerBuilder $container
95158
* @param LoaderInterface $loader
96159
* @param array $loaded
97-
* @param string $doctrineSubscriberTag
160+
* @param string $doctrineListenerTag
98161
*
99162
* @return array
100163
*/
101-
private function processObjectManagerConfigurations(array $configs, ContainerBuilder $container, LoaderInterface $loader, array &$loaded, $doctrineSubscriberTag)
164+
private function processObjectManagerConfigurations(array $configs, ContainerBuilder $container, LoaderInterface $loader, array &$loaded, string $doctrineListenerTag)
102165
{
103166
$usedManagers = array();
104167

@@ -126,7 +189,11 @@ private function processObjectManagerConfigurations(array $configs, ContainerBui
126189
}
127190

128191
$definition = $container->getDefinition(sprintf('stof_doctrine_extensions.listener.%s', $ext));
129-
$definition->addTag($doctrineSubscriberTag, $attributes);
192+
193+
foreach (self::LISTENER_EVENTS[$ext] as $event) {
194+
$attributes['event'] = $event;
195+
$definition->addTag($doctrineListenerTag, $attributes);
196+
}
130197

131198
$usedManagers[$name] = true;
132199
}

tests/DependencyInjection/StofDoctrineExtensionsExtensionTest.php

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Stof\DoctrineExtensionsBundle\Tests\DependencyInjection;
44

5+
use Doctrine\Common\Annotations\AnnotationReader;
6+
use Doctrine\Common\EventSubscriber;
57
use Stof\DoctrineExtensionsBundle\DependencyInjection\StofDoctrineExtensionsExtension;
68
use PHPUnit\Framework\TestCase;
79
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -43,11 +45,12 @@ public function testLoadORMConfig($listener)
4345

4446
$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);
4547

46-
$this->assertTrue($def->hasTag('doctrine.event_subscriber'));
48+
$this->assertTrue($def->hasTag('doctrine.event_listener'));
4749

48-
$tags = $def->getTag('doctrine.event_subscriber');
50+
$tags = $def->getTag('doctrine.event_listener');
51+
$configuredManagers = array_unique(array_column($tags, 'connection'));
4952

50-
$this->assertCount(2, $tags);
53+
$this->assertCount(2, $configuredManagers);
5154
}
5255

5356
/**
@@ -69,11 +72,12 @@ public function testLoadMongodbConfig($listener)
6972

7073
$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);
7174

72-
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_subscriber'));
75+
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_listener'));
7376

74-
$tags = $def->getTag('doctrine_mongodb.odm.event_subscriber');
77+
$tags = $def->getTag('doctrine_mongodb.odm.event_listener');
78+
$configuredManagers = array_unique(array_column($tags, 'connection'));
7579

76-
$this->assertCount(2, $tags);
80+
$this->assertCount(2, $configuredManagers);
7781
}
7882

7983
/**
@@ -95,10 +99,37 @@ public function testLoadBothConfig($listener)
9599

96100
$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);
97101

98-
$this->assertTrue($def->hasTag('doctrine.event_subscriber'));
99-
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_subscriber'));
102+
$this->assertTrue($def->hasTag('doctrine.event_listener'));
103+
$this->assertTrue($def->hasTag('doctrine_mongodb.odm.event_listener'));
100104

101-
$this->assertCount(1, $def->getTag('doctrine.event_subscriber'));
102-
$this->assertCount(1, $def->getTag('doctrine_mongodb.odm.event_subscriber'));
105+
$this->assertCount(1, array_unique(array_column($def->getTag('doctrine.event_listener'), 'connection')));
106+
$this->assertCount(1, array_unique(array_column($def->getTag('doctrine_mongodb.odm.event_listener'), 'connection')));
107+
}
108+
109+
/**
110+
* @dataProvider provideExtensions
111+
*/
112+
public function testEventConsistency(string $listener)
113+
{
114+
$extension = new StofDoctrineExtensionsExtension();
115+
$container = new ContainerBuilder();
116+
$container->register('annotation_reader', AnnotationReader::class);
117+
118+
$config = array('orm' => array(
119+
'default' => array($listener => true),
120+
));
121+
122+
$extension->load(array($config), $container);
123+
124+
$def = $container->getDefinition('stof_doctrine_extensions.listener.'.$listener);
125+
$configuredEvents = array_column($def->getTag('doctrine.event_listener'), 'event');
126+
127+
$listenerInstance = $container->get('stof_doctrine_extensions.listener.'.$listener);
128+
129+
if (!$listenerInstance instanceof EventSubscriber) {
130+
$this->markTestSkipped(sprintf('The listener for "%s" is not a Doctrine event subscriber.', $listener));
131+
}
132+
133+
$this->assertEqualsCanonicalizing($listenerInstance->getSubscribedEvents(), $configuredEvents);
103134
}
104135
}

0 commit comments

Comments
 (0)