Skip to content

Commit b42394b

Browse files
committed
feature #49918 [DoctrineBridge] Deprecate passing doctrine subscribers to ContainerAwareEventManager (alli83)
This PR was merged into the 6.3 branch. Discussion ---------- [DoctrineBridge] Deprecate passing doctrine subscribers to ContainerAwareEventManager | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | no | New feature? | no | Deprecations? | yes | Tickets | Fix #49586 | License | MIT | Doc PR | Following issue #49586, this PR aims to deprecate passing doctrine subscribers to ContainerAwareEventManager. As mentioned, "[#[AsDoctrineListener]]... is a way better alternative anyway." Following #49387 (comment), in PR #49610 DoctrineSchemaSubscribers have already been deprecated in favor of listeners. Commits ------- c08780e [DoctrineBridge] Deprecate passing Doctrine subscribers to ContainerAwareEventManager, use listeners instead
2 parents 8a36deb + c08780e commit b42394b

File tree

6 files changed

+141
-50
lines changed

6 files changed

+141
-50
lines changed

UPGRADE-6.3.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ DependencyInjection
1818
DoctrineBridge
1919
--------------
2020

21+
* Deprecate passing Doctrine subscribers to `ContainerAwareEventManager` class, use listeners instead
2122
* Deprecate `DoctrineDbalCacheAdapterSchemaSubscriber` in favor of `DoctrineDbalCacheAdapterSchemaListener`
2223
* Deprecate `MessengerTransportDoctrineSchemaSubscriber` in favor of `MessengerTransportDoctrineSchemaListener`
2324
* Deprecate `RememberMeTokenProviderDoctrineSchemaSubscriber` in favor of `RememberMeTokenProviderDoctrineSchemaListener`

src/Symfony/Bridge/Doctrine/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
6.3
55
---
66

7+
* Deprecate passing Doctrine subscribers to `ContainerAwareEventManager` class, use listeners instead
78
* Add `AbstractSchemaListener`, `LockStoreSchemaListener` and `PdoSessionHandlerSchemaListener`
89
* Deprecate `DoctrineDbalCacheAdapterSchemaSubscriber` in favor of `DoctrineDbalCacheAdapterSchemaListener`
910
* Deprecate `MessengerTransportDoctrineSchemaSubscriber` in favor of `MessengerTransportDoctrineSchemaListener`

src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,18 @@ class ContainerAwareEventManager extends EventManager
2929
* <event> => <listeners>
3030
*/
3131
private array $listeners = [];
32-
private array $subscribers;
3332
private array $initialized = [];
3433
private bool $initializedSubscribers = false;
3534
private array $methods = [];
3635
private ContainerInterface $container;
3736

3837
/**
39-
* @param list<string|EventSubscriber|array{string[], string|object}> $subscriberIds List of subscribers, subscriber ids, or [events, listener] tuples
38+
* @param list<array{string[], string|object}> $listeners List of [events, listener] tuples
4039
*/
41-
public function __construct(ContainerInterface $container, array $subscriberIds = [])
40+
public function __construct(ContainerInterface $container, array $listeners = [])
4241
{
4342
$this->container = $container;
44-
$this->subscribers = $subscriberIds;
43+
$this->listeners = $listeners;
4544
}
4645

4746
public function dispatchEvent($eventName, EventArgs $eventArgs = null): void
@@ -182,17 +181,20 @@ private function initializeListeners(string $eventName): void
182181
private function initializeSubscribers(): void
183182
{
184183
$this->initializedSubscribers = true;
185-
foreach ($this->subscribers as $subscriber) {
186-
if (\is_array($subscriber)) {
187-
$this->addEventListener(...$subscriber);
184+
$listeners = $this->listeners;
185+
$this->listeners = [];
186+
foreach ($listeners as $listener) {
187+
if (\is_array($listener)) {
188+
$this->addEventListener(...$listener);
188189
continue;
189190
}
190-
if (\is_string($subscriber)) {
191-
$subscriber = $this->container->get($subscriber);
191+
if (\is_string($listener)) {
192+
$listener = $this->container->get($listener);
192193
}
193-
parent::addEventSubscriber($subscriber);
194+
// throw new \InvalidArgumentException(sprintf('Using Doctrine subscriber "%s" is not allowed, declare it as a listener instead.', \is_object($listener) ? $listener::class : $listener));
195+
trigger_deprecation('symfony/doctrine-bridge', '6.3', 'Using Doctrine subscribers as services is deprecated, declare listeners instead');
196+
parent::addEventSubscriber($listener);
194197
}
195-
$this->subscribers = [];
196198
}
197199

198200
private function getHash(string|object $listener): string

src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ private function addTaggedServices(ContainerBuilder $container): array
106106
$refs = $managerDef->getArguments()[1] ?? [];
107107
$listenerRefs[$con][$id] = new Reference($id);
108108
if ($subscriberTag === $tagName) {
109+
trigger_deprecation('symfony/doctrine-bridge', '6.3', 'Using Doctrine subscribers as services is deprecated, declare listeners instead');
109110
$refs[] = $id;
110111
} else {
111112
$refs[] = [[$tag['event']], $id];

src/Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php

Lines changed: 110 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,30 @@ protected function setUp(): void
3232

3333
public function testDispatchEventRespectOrder()
3434
{
35-
$this->evm = new ContainerAwareEventManager($this->container, ['sub1', [['foo'], 'list1'], 'sub2']);
35+
$this->evm = new ContainerAwareEventManager($this->container, [[['foo'], 'list1'], [['foo'], 'list2']]);
3636

3737
$this->container->set('list1', $listener1 = new MyListener());
38+
$this->container->set('list2', $listener2 = new MyListener());
39+
40+
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners('foo')));
41+
}
42+
43+
/**
44+
* @group legacy
45+
*/
46+
public function testDispatchEventRespectOrderWithSubscribers()
47+
{
48+
$this->evm = new ContainerAwareEventManager($this->container, ['sub1', 'sub2']);
49+
3850
$this->container->set('sub1', $subscriber1 = new MySubscriber(['foo']));
3951
$this->container->set('sub2', $subscriber2 = new MySubscriber(['foo']));
4052

41-
$this->assertSame([$subscriber1, $listener1, $subscriber2], array_values($this->evm->getListeners('foo')));
53+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
54+
$this->assertSame([$subscriber1, $subscriber2], array_values($this->evm->getListeners('foo')));
4255
}
4356

4457
public function testDispatchEvent()
4558
{
46-
$this->evm = new ContainerAwareEventManager($this->container, ['lazy4']);
47-
48-
$this->container->set('lazy4', $subscriber1 = new MySubscriber(['foo']));
49-
$this->assertSame(0, $subscriber1->calledSubscribedEventsCount);
50-
5159
$this->container->set('lazy1', $listener1 = new MyListener());
5260
$this->evm->addEventListener('foo', 'lazy1');
5361
$this->evm->addEventListener('foo', $listener2 = new MyListener());
@@ -57,16 +65,10 @@ public function testDispatchEvent()
5765
$this->container->set('lazy3', $listener5 = new MyListener());
5866
$this->evm->addEventListener('foo', $listener5 = new MyListener());
5967
$this->evm->addEventListener('bar', $listener5);
60-
$this->evm->addEventSubscriber($subscriber2 = new MySubscriber(['bar']));
61-
62-
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
6368

6469
$this->evm->dispatchEvent('foo');
6570
$this->evm->dispatchEvent('bar');
6671

67-
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
68-
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
69-
7072
$this->assertSame(0, $listener1->calledByInvokeCount);
7173
$this->assertSame(1, $listener1->calledByEventNameCount);
7274
$this->assertSame(0, $listener2->calledByInvokeCount);
@@ -77,40 +79,57 @@ public function testDispatchEvent()
7779
$this->assertSame(0, $listener4->calledByEventNameCount);
7880
$this->assertSame(1, $listener5->calledByInvokeCount);
7981
$this->assertSame(1, $listener5->calledByEventNameCount);
80-
$this->assertSame(0, $subscriber1->calledByInvokeCount);
81-
$this->assertSame(1, $subscriber1->calledByEventNameCount);
82-
$this->assertSame(1, $subscriber2->calledByInvokeCount);
83-
$this->assertSame(0, $subscriber2->calledByEventNameCount);
8482
}
8583

86-
public function testAddEventListenerAndSubscriberAfterDispatchEvent()
84+
/**
85+
* @group legacy
86+
*/
87+
public function testDispatchEventWithSubscribers()
8788
{
88-
$this->evm = new ContainerAwareEventManager($this->container, ['lazy7']);
89+
$this->evm = new ContainerAwareEventManager($this->container, ['lazy4']);
8990

90-
$this->container->set('lazy7', $subscriber1 = new MySubscriber(['foo']));
91+
$this->container->set('lazy4', $subscriber1 = new MySubscriber(['foo']));
9192
$this->assertSame(0, $subscriber1->calledSubscribedEventsCount);
9293

9394
$this->container->set('lazy1', $listener1 = new MyListener());
95+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
9496
$this->evm->addEventListener('foo', 'lazy1');
97+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
98+
$this->evm->addEventSubscriber($subscriber2 = new MySubscriber(['bar']));
99+
100+
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
101+
102+
$this->evm->dispatchEvent('foo');
103+
$this->evm->dispatchEvent('bar');
104+
95105
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
106+
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
107+
108+
$this->assertSame(0, $listener1->calledByInvokeCount);
109+
$this->assertSame(1, $listener1->calledByEventNameCount);
110+
$this->assertSame(0, $listener2->calledByInvokeCount);
111+
$this->assertSame(1, $listener2->calledByEventNameCount);
112+
$this->assertSame(0, $subscriber1->calledByInvokeCount);
113+
$this->assertSame(1, $subscriber1->calledByEventNameCount);
114+
$this->assertSame(1, $subscriber2->calledByInvokeCount);
115+
$this->assertSame(0, $subscriber2->calledByEventNameCount);
116+
}
96117

118+
public function testAddEventListenerAfterDispatchEvent()
119+
{
120+
$this->container->set('lazy1', $listener1 = new MyListener());
121+
$this->evm->addEventListener('foo', 'lazy1');
97122
$this->evm->addEventListener('foo', $listener2 = new MyListener());
98123
$this->container->set('lazy2', $listener3 = new MyListener());
99124
$this->evm->addEventListener('bar', 'lazy2');
100125
$this->evm->addEventListener('bar', $listener4 = new MyListener());
101126
$this->container->set('lazy3', $listener5 = new MyListener());
102127
$this->evm->addEventListener('foo', $listener5 = new MyListener());
103128
$this->evm->addEventListener('bar', $listener5);
104-
$this->evm->addEventSubscriber($subscriber2 = new MySubscriber(['bar']));
105-
106-
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
107129

108130
$this->evm->dispatchEvent('foo');
109131
$this->evm->dispatchEvent('bar');
110132

111-
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
112-
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
113-
114133
$this->container->set('lazy4', $listener6 = new MyListener());
115134
$this->evm->addEventListener('foo', 'lazy4');
116135
$this->evm->addEventListener('foo', $listener7 = new MyListener());
@@ -120,19 +139,10 @@ public function testAddEventListenerAndSubscriberAfterDispatchEvent()
120139
$this->container->set('lazy6', $listener10 = new MyListener());
121140
$this->evm->addEventListener('foo', $listener10 = new MyListener());
122141
$this->evm->addEventListener('bar', $listener10);
123-
$this->evm->addEventSubscriber($subscriber3 = new MySubscriber(['bar']));
124-
125-
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
126-
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
127-
$this->assertSame(1, $subscriber3->calledSubscribedEventsCount);
128142

129143
$this->evm->dispatchEvent('foo');
130144
$this->evm->dispatchEvent('bar');
131145

132-
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
133-
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
134-
$this->assertSame(1, $subscriber3->calledSubscribedEventsCount);
135-
136146
$this->assertSame(0, $listener1->calledByInvokeCount);
137147
$this->assertSame(2, $listener1->calledByEventNameCount);
138148
$this->assertSame(0, $listener2->calledByInvokeCount);
@@ -143,10 +153,6 @@ public function testAddEventListenerAndSubscriberAfterDispatchEvent()
143153
$this->assertSame(0, $listener4->calledByEventNameCount);
144154
$this->assertSame(2, $listener5->calledByInvokeCount);
145155
$this->assertSame(2, $listener5->calledByEventNameCount);
146-
$this->assertSame(0, $subscriber1->calledByInvokeCount);
147-
$this->assertSame(2, $subscriber1->calledByEventNameCount);
148-
$this->assertSame(2, $subscriber2->calledByInvokeCount);
149-
$this->assertSame(0, $subscriber2->calledByEventNameCount);
150156

151157
$this->assertSame(0, $listener6->calledByInvokeCount);
152158
$this->assertSame(1, $listener6->calledByEventNameCount);
@@ -158,16 +164,81 @@ public function testAddEventListenerAndSubscriberAfterDispatchEvent()
158164
$this->assertSame(0, $listener9->calledByEventNameCount);
159165
$this->assertSame(1, $listener10->calledByInvokeCount);
160166
$this->assertSame(1, $listener10->calledByEventNameCount);
167+
}
168+
169+
/**
170+
* @group legacy
171+
*/
172+
public function testAddEventListenerAndSubscriberAfterDispatchEvent()
173+
{
174+
$this->evm = new ContainerAwareEventManager($this->container, ['lazy7']);
175+
176+
$this->container->set('lazy7', $subscriber1 = new MySubscriber(['foo']));
177+
$this->assertSame(0, $subscriber1->calledSubscribedEventsCount);
178+
179+
$this->container->set('lazy1', $listener1 = new MyListener());
180+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
181+
$this->evm->addEventListener('foo', 'lazy1');
182+
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
183+
184+
$this->evm->addEventSubscriber($subscriber2 = new MySubscriber(['bar']));
185+
186+
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
187+
188+
$this->evm->dispatchEvent('foo');
189+
$this->evm->dispatchEvent('bar');
190+
191+
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
192+
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
193+
194+
$this->container->set('lazy6', $listener2 = new MyListener());
195+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
196+
$this->evm->addEventListener('bar', $listener2);
197+
$this->evm->addEventSubscriber($subscriber3 = new MySubscriber(['bar']));
198+
199+
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
200+
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
201+
$this->assertSame(1, $subscriber3->calledSubscribedEventsCount);
202+
203+
$this->evm->dispatchEvent('foo');
204+
$this->evm->dispatchEvent('bar');
205+
206+
$this->assertSame(1, $subscriber1->calledSubscribedEventsCount);
207+
$this->assertSame(1, $subscriber2->calledSubscribedEventsCount);
208+
$this->assertSame(1, $subscriber3->calledSubscribedEventsCount);
209+
210+
$this->assertSame(0, $listener1->calledByInvokeCount);
211+
$this->assertSame(2, $listener1->calledByEventNameCount);
212+
$this->assertSame(0, $subscriber1->calledByInvokeCount);
213+
$this->assertSame(2, $subscriber1->calledByEventNameCount);
214+
$this->assertSame(2, $subscriber2->calledByInvokeCount);
215+
$this->assertSame(0, $subscriber2->calledByEventNameCount);
216+
217+
$this->assertSame(1, $listener2->calledByInvokeCount);
218+
$this->assertSame(1, $listener2->calledByEventNameCount);
161219
$this->assertSame(1, $subscriber3->calledByInvokeCount);
162220
$this->assertSame(0, $subscriber3->calledByEventNameCount);
163221
}
164222

165223
public function testGetListenersForEvent()
224+
{
225+
$this->container->set('lazy', $listener1 = new MyListener());
226+
$this->evm->addEventListener('foo', 'lazy');
227+
$this->evm->addEventListener('foo', $listener2 = new MyListener());
228+
229+
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners('foo')));
230+
}
231+
232+
/**
233+
* @group legacy
234+
*/
235+
public function testGetListenersForEventWhenSubscribersArePresent()
166236
{
167237
$this->evm = new ContainerAwareEventManager($this->container, ['lazy2']);
168238

169239
$this->container->set('lazy', $listener1 = new MyListener());
170240
$this->container->set('lazy2', $subscriber1 = new MySubscriber(['foo']));
241+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
171242
$this->evm->addEventListener('foo', 'lazy');
172243
$this->evm->addEventListener('foo', $listener2 = new MyListener());
173244

src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Bridge\Doctrine\ContainerAwareEventManager;
1616
use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass;
17+
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
1718
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
1819
use Symfony\Component\DependencyInjection\ContainerBuilder;
1920
use Symfony\Component\DependencyInjection\Definition;
@@ -22,6 +23,8 @@
2223

2324
class RegisterEventListenersAndSubscribersPassTest extends TestCase
2425
{
26+
use ExpectDeprecationTrait;
27+
2528
public function testExceptionOnAbstractTaggedSubscriber()
2629
{
2730
$this->expectException(\InvalidArgumentException::class);
@@ -195,6 +198,9 @@ public function testProcessEventListenersWithMultipleConnections()
195198
);
196199
}
197200

201+
/**
202+
* @group legacy
203+
*/
198204
public function testProcessEventSubscribersWithMultipleConnections()
199205
{
200206
$container = $this->createBuilder(true);
@@ -232,6 +238,7 @@ public function testProcessEventSubscribersWithMultipleConnections()
232238
])
233239
;
234240

241+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
235242
$this->process($container);
236243

237244
$eventManagerDef = $container->getDefinition('doctrine.dbal.default_connection.event_manager');
@@ -279,6 +286,9 @@ public function testProcessEventSubscribersWithMultipleConnections()
279286
);
280287
}
281288

289+
/**
290+
* @group legacy
291+
*/
282292
public function testProcessEventSubscribersWithPriorities()
283293
{
284294
$container = $this->createBuilder();
@@ -312,6 +322,7 @@ public function testProcessEventSubscribersWithPriorities()
312322
])
313323
;
314324

325+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
315326
$this->process($container);
316327

317328
$eventManagerDef = $container->getDefinition('doctrine.dbal.default_connection.event_manager');
@@ -341,6 +352,9 @@ public function testProcessEventSubscribersWithPriorities()
341352
);
342353
}
343354

355+
/**
356+
* @group legacy
357+
*/
344358
public function testProcessEventSubscribersAndListenersWithPriorities()
345359
{
346360
$container = $this->createBuilder();
@@ -402,6 +416,7 @@ public function testProcessEventSubscribersAndListenersWithPriorities()
402416
])
403417
;
404418

419+
$this->expectDeprecation('Since symfony/doctrine-bridge 6.3: Using Doctrine subscribers as services is deprecated, declare listeners instead');
405420
$this->process($container);
406421

407422
$eventManagerDef = $container->getDefinition('doctrine.dbal.default_connection.event_manager');

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy