Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 61fab3e

Browse files
committed
[DoctrineBridge] Allow invokable event listeners
1 parent 25f1804 commit 61fab3e

File tree

3 files changed

+61
-16
lines changed

3 files changed

+61
-16
lines changed

src/Symfony/Bridge/Doctrine/CHANGELOG.md

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

77
* added `DoctrineClearEntityManagerMiddleware`
8+
* added support for invokable event listeners
89

910

1011
4.3.0

src/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ class ContainerAwareEventManager extends EventManager
3030
private $listeners = [];
3131
private $initialized = [];
3232
private $container;
33+
private $methods;
3334

3435
public function __construct(ContainerInterface $container)
3536
{
3637
$this->container = $container;
38+
39+
$this->methods = new \SplObjectStorage();
3740
}
3841

3942
/**
@@ -52,7 +55,7 @@ public function dispatchEvent($eventName, EventArgs $eventArgs = null)
5255
}
5356

5457
foreach ($this->listeners[$eventName] as $hash => $listener) {
55-
$listener->$eventName($eventArgs);
58+
$listener->{$this->methods[$listener]}($eventArgs);
5659
}
5760
}
5861

@@ -105,6 +108,8 @@ public function addEventListener($events, $listener)
105108

106109
if (\is_string($listener)) {
107110
unset($this->initialized[$event]);
111+
} else {
112+
$this->methods[$listener] = $this->getMethod($listener, $event);
108113
}
109114
}
110115
}
@@ -136,9 +141,23 @@ private function initializeListeners($eventName)
136141
{
137142
foreach ($this->listeners[$eventName] as $hash => $listener) {
138143
if (\is_string($listener)) {
139-
$this->listeners[$eventName][$hash] = $this->container->get($listener);
144+
$this->listeners[$eventName][$hash] = $listener = $this->container->get($listener);
145+
146+
$this->methods[$listener] = $this->getMethod($listener, $eventName);
140147
}
141148
}
142149
$this->initialized[$eventName] = true;
143150
}
151+
152+
/**
153+
* @param object $listener
154+
*/
155+
private function getMethod($listener, string $event): string
156+
{
157+
if (!method_exists($listener, $event) && method_exists($listener, '__invoke')) {
158+
return '__invoke';
159+
}
160+
161+
return $event;
162+
}
144163
}

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

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,34 +28,52 @@ protected function setUp()
2828

2929
public function testDispatchEvent()
3030
{
31-
$this->container->set('lazy', $listener1 = new MyListener());
32-
$this->evm->addEventListener('foo', 'lazy');
31+
$this->container->set('lazy1', $listener1 = new MyListener());
32+
$this->evm->addEventListener('foo', 'lazy1');
3333
$this->evm->addEventListener('foo', $listener2 = new MyListener());
34+
$this->container->set('lazy2', $listener3 = new MyListener());
35+
$this->evm->addEventListener('bar', 'lazy2');
36+
$this->evm->addEventListener('bar', $listener4 = new MyListener());
3437

3538
$this->evm->dispatchEvent('foo');
39+
$this->evm->dispatchEvent('bar');
3640

37-
$this->assertTrue($listener1->called);
38-
$this->assertTrue($listener2->called);
41+
$this->assertTrue($listener1->calledByEventName);
42+
$this->assertTrue($listener2->calledByEventName);
43+
$this->assertTrue($listener3->calledByInvoke);
44+
$this->assertTrue($listener4->calledByInvoke);
3945
}
4046

4147
public function testAddEventListenerAfterDispatchEvent()
4248
{
4349
$this->container->set('lazy1', $listener1 = new MyListener());
4450
$this->evm->addEventListener('foo', 'lazy1');
4551
$this->evm->addEventListener('foo', $listener2 = new MyListener());
52+
$this->container->set('lazy2', $listener3 = new MyListener());
53+
$this->evm->addEventListener('bar', 'lazy2');
54+
$this->evm->addEventListener('bar', $listener4 = new MyListener());
4655

4756
$this->evm->dispatchEvent('foo');
57+
$this->evm->dispatchEvent('bar');
4858

49-
$this->container->set('lazy2', $listener3 = new MyListener());
50-
$this->evm->addEventListener('foo', 'lazy2');
51-
$this->evm->addEventListener('foo', $listener4 = new MyListener());
59+
$this->container->set('lazy3', $listener5 = new MyListener());
60+
$this->evm->addEventListener('foo', 'lazy3');
61+
$this->evm->addEventListener('foo', $listener6 = new MyListener());
62+
$this->container->set('lazy4', $listener7 = new MyListener());
63+
$this->evm->addEventListener('bar', 'lazy4');
64+
$this->evm->addEventListener('bar', $listener8 = new MyListener());
5265

5366
$this->evm->dispatchEvent('foo');
54-
55-
$this->assertTrue($listener1->called);
56-
$this->assertTrue($listener2->called);
57-
$this->assertTrue($listener3->called);
58-
$this->assertTrue($listener4->called);
67+
$this->evm->dispatchEvent('bar');
68+
69+
$this->assertTrue($listener1->calledByEventName);
70+
$this->assertTrue($listener2->calledByEventName);
71+
$this->assertTrue($listener3->calledByInvoke);
72+
$this->assertTrue($listener4->calledByInvoke);
73+
$this->assertTrue($listener5->calledByEventName);
74+
$this->assertTrue($listener6->calledByEventName);
75+
$this->assertTrue($listener7->calledByInvoke);
76+
$this->assertTrue($listener8->calledByInvoke);
5977
}
6078

6179
public function testGetListenersForEvent()
@@ -107,10 +125,17 @@ public function testRemoveEventListenerAfterDispatchEvent()
107125

108126
class MyListener
109127
{
110-
public $called = false;
128+
public $calledByInvoke = false;
129+
130+
public $calledByEventName = false;
131+
132+
public function __invoke(): void
133+
{
134+
$this->calledByInvoke = true;
135+
}
111136

112137
public function foo()
113138
{
114-
$this->called = true;
139+
$this->calledByEventName = true;
115140
}
116141
}

0 commit comments

Comments
 (0)