Skip to content

Commit c87632c

Browse files
committed
[EventDispatcher] Document event name aliases.
1 parent 1995a13 commit c87632c

File tree

2 files changed

+114
-3
lines changed

2 files changed

+114
-3
lines changed

components/event_dispatcher.rst

+47-3
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`` is able to resolve aliased class names which for
224+
instance allows to refer to an event via the fully qualified class name
225+
(FQCN) of the event class. The pass will read the alias mapping from a
226+
dedicated container parameter. This parameter can be extended by registering
227+
another compiler pass, ``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

+67
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,73 @@ there are some minor advantages for each of them:
246246
* **Listeners are more flexible** because bundles can enable or disable each of
247247
them conditionally depending on some configuration value.
248248

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

0 commit comments

Comments
 (0)