8000 Merge branch '4.4' into 5.0 · symfony/symfony-docs@306b68b · GitHub
[go: up one dir, main page]

Skip to content

Commit 306b68b

Browse files
committed
Merge branch '4.4' into 5.0
* 4.4: Minor #12420 [EventDispatcher] Document event name aliases.
2 parents c28acd6 + 7965df4 commit 306b68b

File tree

2 files changed

+112
-3
lines changed

2 files changed

+112
-3
lines changed

components/event_dispatcher.rst

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,55 @@ determine which instance is passed.
220220
$containerBuilder->register('subscriber_service_id', \AcmeSubscriber::class)
221221
->addTag('kernel.event_subscriber');
222222

223+
``RegisterListenersPass`` resolves aliased class names which for instance
224+
allows to refer to an event via the fully qualified class name (FQCN) of the
225+
event class. The pass will read the alias mapping from a dedicated container
226+
parameter. This parameter can be extended by registering another compiler pass,
227+
``AddEventAliasesPass``::
228+
229+
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
230+
use Symfony\Component\DependencyInjection\ContainerBuilder;
231+
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
232+
use Symfony\Component\DependencyInjection\Reference;
233+
use Symfony\Component\EventDispatcher\DependencyInjection\AddEventAliasesPass;
234+
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
235+
use Symfony\Component\EventDispatcher\EventDispatcher;
236+
237+
$containerBuilder = new ContainerBuilder(new ParameterBag());
238+
$containerBuilder->addCompilerPass(new RegisterListenersPass(), PassConfig::TYPE_BEFORE_REMOVING);
239+
$containerBuilder->addCompilerPass(new AddEventAliasesPass([
240+
\AcmeFooActionEvent::class => 'acme.foo.action',
241+
]));
242+
243+
$containerBuilder->register('event_dispatcher', EventDispatcher::class);
244+
245+
// registers an event listener
246+
$containerBuilder->register('listener_service_id', \AcmeListener::class)
247+
->addTag('kernel.event_listener', [
248+
// will be translated to 'acme.foo.action' by RegisterListenersPass.
249+
'event' => \AcmeFooActionEvent::class,
250+
'method' => 'onFooAction',
251+
]);
252+
253+
.. note::
254+
255+
Note that ``AddEventAliasesPass`` has to be processed before ``RegisterListenersPass``.
256+
223257
By default, the listeners pass assumes that the event dispatcher's service
224258
id is ``event_dispatcher``, that event listeners are tagged with the
225-
``kernel.event_listener`` tag and that event subscribers are tagged
226-
with the ``kernel.event_subscriber`` tag. You can change these default
227-
values by passing custom values to the constructor of ``RegisterListenersPass``.
259+
``kernel.event_listener`` tag, that event subscribers are tagged
260+
with the ``kernel.event_subscriber`` tag and that the alias mapping is
261+
stored as parameter ``event_dispatcher.event_aliases``. You can change these
262+
default values by passing custom values to the constructors of
263+
``RegisterListenersPass`` and ``AddEventAliasesPass``.
264+
265+
.. versionadded:: 4.3
266+
267+
Aliasing event names is possible since Symfony 4.3.
268+
269+
.. versionadded:: 4.4
270+
271+
The ``AddEventAliasesPass`` class was introduced in Symfony 4.4.
228272

229273
.. _event_dispatcher-closures-as-listeners:
230274

event_dispatcher.rst

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,71 @@ there are some minor advantages for each of them:
242242
* **Listeners are more flexible** because bundles can enable or disable each of
243243
them conditionally depending on some configuration value.
244244

245+
Event Aliases
246+
-------------
247+
248+
When configuring event listeners and subscribers via dependency injection,
249+
Symfony's core events can also be referred to by the fully qualified class
250+
name (FQCN) of the corresponding event class::
251+
252+
// src/EventSubscriber/RequestSubscriber.php
253+
namespace App\EventSubscriber;
254+
255+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
256+
use Symfony\Component\HttpKernel\Event\RequestEvent;
257+
258+
class RequestSubscriber implements EventSubscriberInterface
259+
{
260+
public static function getSubscribedEvents(): array
261+
{
262+
return [
263+
RequestEvent::class => 'onKernelRequest',
264+
];
265+
}
266+
267+
public function onKernelRequest(RequestEvent $event)
268+
{
269+
// ...
270+
}
271+
}
272+
273+
.. versionadded:: 4.3
274+
275+
Referring Symfony's core events via the FQCN of the event class is possible
276+
since Symfony 4.3.
277+
278+
Internally, the event FQCN are treated as aliases for the original event names.
279+
Since the mapping already happens when compiling the service container, event
280+
listeners and subscribers using FQCN instead of event names will appear under
281+
the original event name when inspecting the event dispatcher.
282+
283+
This alias mapping can be extended for custom events by registering the
284+
compiler pass ``AddEventAliasesPass``::
285+
286+
// src/Kernel.php
287+
use App\Event\MyCustomEvent;
288+
use Symfony\Component\DependencyInjection\ContainerBuilder;
289+
use Symfony\Component\EventDispatcher\DependencyInjection\AddEventAliasesPass;
290+
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
291+
292+
class Kernel extends BaseKernel
293+
{
294+
protected function build(ContainerBuilder $container)
295+
{
296+
$container->addCompilerPass(new AddEventAliasesPass([
297+
MyCustomEvent::class => 'my_custom_event',
298+
]));
299+
}
300+
}
301+
302+
The compiler pass will always extend the existing list of aliases. Because of
303+
that, it is safe to register multiple instances of the pass with different
304+
configurations.
305+
306+
.. versionadded:: 4.4
307+
308+
The ``AddEventAliasesPass`` class was introduced in Symfony 4.4.
309+
245310
Debugging Event Listeners
246311
-------------------------
247312

0 commit comments

Comments
 (0)
0