10000 [EventDispatcher] A compiler pass for aliased userland events. · symfony/symfony@45278e0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 45278e0

Browse files
committed
[EventDispatcher] A compiler pass for aliased userland events.
1 parent 3a1d361 commit 45278e0

File tree

6 files changed

+149
-9
lines changed

6 files changed

+149
-9
lines changed

src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323
<parameter key="Symfony\Component\HttpKernel\Event\ViewEvent">kernel.view</parameter>
2424
<parameter key="Symfony\Component\HttpKernel\Event\ExceptionEvent">kernel.exception</parameter>
2525
<parameter key="Symfony\Component\HttpKernel\Event\TerminateEvent">kernel.terminate</parameter>
26-
<parameter key="Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent">security.authentication.success</parameter>
27-
<parameter key="Symfony\Component\Security\Core\Event\AuthenticationFailureEvent">security.authentication.failure</parameter>
28-
<parameter key="Symfony\Component\Security\Http\Event\InteractiveLoginEvent">security.interactive_login</parameter>
29-
<parameter key="Symfony\Component\Security\Http\Event\SwitchUserEvent">security.switch_user</parameter>
3026
<parameter key="Symfony\Component\Workflow\Event\GuardEvent">workflow.guard</parameter>
3127
<parameter key="Symfony\Component\Workflow\Event\LeaveEvent">workflow.leave</parameter>
3228
<parameter key="Symfony\Component\Workflow\Event\TransitionEvent">workflow.transition</parameter>

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
"symfony/messenger": "<4.3",
7979
"symfony/mime": "<4.4",
8080
"symfony/property-info": "<3.4",
81+
"symfony/security-bundle": "<4.4",
8182
"symfony/serializer": "<4.2",
8283
"symfony/stopwatch": "<3.4",
8384
"symfony/translation": "<4.3",

src/Symfony/Bundle/SecurityBundle/SecurityBundle.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,14 @@
3333
use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\UserProvider\LdapFactory;
3434
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
3535
use Symfony\Component\DependencyInjection\ContainerBuilder;
36+
use Symfony\Component\EventDispatcher\DependencyInjection\EventAliasesPass;
3637
use Symfony\Component\HttpKernel\Bundle\Bundle;
38+
use Symfony\Component\Security\Core\AuthenticationEvents;
39+
use Symfony\Component\Security\Core\Event\AuthenticationFailureEvent;
40+
use Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent;
41+
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
42+
use Symfony\Component\Security\Http\Event\SwitchUserEvent;
43+
use Symfony\Component\Security\Http\SecurityEvents;
3744

3845
/**
3946
* Bundle.
@@ -68,5 +75,12 @@ public function build(ContainerBuilder $container)
6875
$container->addCompilerPass(new AddSessionDomainConstraintPass(), PassConfig::TYPE_BEFORE_REMOVING);
6976
$container->addCompilerPass(new RegisterCsrfTokenClearingLogoutHandlerPass());
7077
$container->addCompilerPass(new RegisterTokenUsageTrackingPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 200);
78+
79+
$container->addCompilerPass(new EventAliasesPass([
80+
AuthenticationSuccessEvent::class => AuthenticationEvents::AUTHENTICATION_SUCCESS,
81+
AuthenticationFailureEvent::class => AuthenticationEvents::AUTHENTICATION_FAILURE,
82+
InteractiveLoginEvent::class => SecurityEvents::INTERACTIVE_LOGIN,
83+
SwitchUserEvent::class => SecurityEvents::SWITCH_USER,
84+
]));
7185
}
7286
}

src/Symfony/Bundle/SecurityBundle/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"ext-xml": "*",
2121
"symfony/config": "^4.2|^5.0",
2222
"symfony/dependency-injection": "^4.2|^5.0",
23+
"symfony/event-dispatcher": "^4.4|^5.0",
2324
"symfony/http-kernel": "^4.4",
2425
"symfony/security-core": "^4.4",
2526
"symfony/security-csrf": "^4.2|^5.0",
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\EventDispatcher\DependencyInjection;
13+
14+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
17+
/**
18+
* This pass allows bundles to extend the list of event aliases.
19+
*/
20+
class EventAliasesPass implements CompilerPassInterface
21+
{
22+
private $eventAliases;
23+
private $eventAliasesParameter;
24+
25+
public function __construct(array $eventAliases, string $eventAliasesParameter = 'event_dispatcher.event_aliases')
26+
{
27+
$this->eventAliases = $eventAliases;
28+
$this->eventAliasesParameter = $eventAliasesParameter;
29+
}
30+
31+
public function process(ContainerBuilder $container): void
32+
{
33+
$eventAliases = $container->hasParameter($this->eventAliasesParameter) ? $container->getParameter($this->eventAliasesParameter) : [];
34+
35+
$container->setParameter(
36+
$this->eventAliasesParameter,
37+
array_merge($eventAliases, $this->eventAliases)
38+
);
39+
}
40+
}

src/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
1616
use Symfony\Component\DependencyInjection\ContainerBuilder;
1717
use Symfony\Component\DependencyInjection\Reference;
18+
use Symfony\Component\EventDispatcher\DependencyInjection\EventAliasesPass;
1819
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
20+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1921

2022
class RegisterListenersPassTest extends TestCase
2123
{
@@ -37,10 +39,6 @@ public function testEventSubscriberWithoutInterface()
3739

3840
public function testValidEventSubscriber()
3941
{
40-
$services = [
41-
'my_event_subscriber' => [0 => []],
42-
];
43-
4442
$builder = new ContainerBuilder();
4543
$eventDispatcherDefinition = $builder->register('event_dispatcher');
4644
$builder->register('my_event_subscriber', 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService')
@@ -62,6 +60,41 @@ public function testValidEventSubscriber()
6260
$this->assertEquals($expectedCalls, $eventDispatcherDefinition->getMethodCalls());
6361
}
6462

63+
public function testAliasedEventSubscriber(): void
64+
{
65+
$builder = new ContainerBuilder();
66+
$builder->setParameter('event_dispatcher.event_aliases', [AliasedEvent::class => 'aliased_event']);
67+
$builder->register('event_dispatcher');
68+
$builder->register('my_event_subscriber', AliasedSubscriber::class)
69+
->addTag('kernel.event_subscriber');
70+
71+
$eventAliasPass = new EventAliasesPass([CustomEvent::class => 'custom_event']);
72+
$eventAliasPass->process($builder);
73+
74+
$registerListenersPass = new RegisterListenersPass();
75+
$registerListenersPass->process($builder);
76+
77+
$expectedCalls = [
78+
[
79+
'addListener',
80+
[
81+
'aliased_event',
82+
[new ServiceClosureArgument(new Reference('my_event_subscriber')), 'onAliasedEvent'],
83+
0,
84+
],
85+
],
86+
[
87+
'addListener',
88+
[
89+
'custom_event',
90+
[new ServiceClosureArgument(new Reference('my_event_subscriber')), 'onCustomEvent'],
91+
0,
92+
],
93+
],
94+
];
95+
$this->assertEquals($expectedCalls, $builder->getDefinition('event_dispatcher')->getMethodCalls());
96+
}
97+
6598
public function testAbstractEventListener()
6699
{
67100
$this->expectException('InvalidArgumentException');
@@ -175,9 +208,45 @@ public function testInvokableEventListener()
175208
];
176209
$this->assertEquals($expectedCalls, $definition->getMethodCalls());
177210
}
211+
212+
public function testAliasedEventListener(): void
213+
{
214+
$container = new ContainerBuilder();
215+
$container->setParameter('event_dispatcher.event_aliases', [AliasedEvent::class => 'aliased_event']);
216+
$container->register('foo', InvokableListenerService::class)->addTag('kernel.event_listener', ['event' => AliasedEvent::class, 'method' => 'onEvent']);
217+
$container->register('bar', InvokableListenerService::class)->addTag('kernel.event_listener', ['event' => CustomEvent::class, 'method' => 'onEvent']);
218+
$container->register('event_dispatcher');
219+
220+
$eventAliasPass = new EventAliasesPass([CustomEvent::class => 'custom_event']);
221+
$eventAliasPass->process($container);
222+
223+
$registerListenersPass = new RegisterListenersPass();
224+
$registerListenersPass->process($container);
225+
226+
$definition = $container->getDefinition('event_dispatcher');
227+
$expectedCalls = [
228+
[
229+
'addListener',
230+
[
231+
'aliased_event',
232+
[new ServiceClosureArgument(new Reference('foo')), 'onEvent'],
233+
0,
234+
],
235+
],
236+
[
237+
'addListener',
238+
[
239+
'custom_event',
240+
[new ServiceClosureArgument(new Reference('bar')), 'onEvent'],
241+
0,
242+
],
243+
],
244+
];
245+
$this->assertEquals($expectedCalls, $definition->getMethodCalls());
246+
}
178247
}
179248

180-
class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
249+
class SubscriberService implements EventSubscriberInterface
181250
{
182251
public static function getSubscribedEvents(): array
183252
{
@@ -197,3 +266,22 @@ public function onEvent()
197266
{
198267
}
199268
}
269+
270+
final class AliasedSubscriber implements EventSubscriberInterface
271+
{
272+
public static function getSubscribedEvents(): array
273+
{
274+
return [
275+
AliasedEvent::class => 'onAliasedEvent',
276+
CustomEvent::class => 'onCustomEvent',
277+
];
278+
}
279+
}
280+
281+
final class AliasedEvent
282+
{
283+
}
284+
285+
final class CustomEvent
286+
{
287+
}

0 commit comments

Comments
 (0)
0