You are browsing the documentation for Symfony 3.3 which is not maintained anymore.
Consider upgrading your projects to Symfony 5.2.
The Container Aware Event Dispatcher
The Container Aware Event Dispatcher¶
New in version 3.3: The ContainerAwareEventDispatcher
class has been deprecated in Symfony 3.3
and it will be removed in Symfony 4.0. Use EventDispatcher
with
closure-proxy injection instead.
Introduction¶
The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher
is a special EventDispatcher
implementation which is coupled to the
service container that is part of
the DependencyInjection component.
It allows services to be specified as event listeners making the EventDispatcher
extremely powerful.
Services are lazy loaded meaning the services attached as listeners will only be created if an event is dispatched that requires those listeners.
Setup¶
Setup is straightforward by injecting a Symfony\Component\DependencyInjection\ContainerInterface
into the Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher
:
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
$container = new ContainerBuilder();
$dispatcher = new ContainerAwareEventDispatcher($container);
Adding Listeners¶
The ContainerAwareEventDispatcher
can either load specified services
directly or services that implement Symfony\Component\EventDispatcher\EventSubscriberInterface
.
The following examples assume the service container has been loaded with any services that are mentioned.
Note
Services must be marked as public in the container.
Adding Services¶
To connect existing service definitions, use the
addListenerService()
method where the $callback
is an array of array($serviceId, $methodName)
:
$dispatcher->addListenerService($eventName, array('foo', 'logListener'));
Adding Subscriber Services¶
Event subscribers can be added using the
addSubscriberService()
method where the first argument is the service ID of the subscriber service,
and the second argument is the service’s class name (which must implement
Symfony\Component\EventDispatcher\EventSubscriberInterface
) as follows:
$dispatcher->addSubscriberService(
'kernel.store_subscriber',
'StoreSubscriber'
);
The EventSubscriberInterface
is exactly as you would expect:
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
// ...
class StoreSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
KernelEvents::RESPONSE => array(
array('onKernelResponsePre', 10),
array('onKernelResponsePost', 0),
),
'store.order' => array('onStoreOrder', 0),
);
}
public function onKernelResponsePre(FilterResponseEvent $event)
{
// ...
}
public function onKernelResponsePost(FilterResponseEvent $event)
{
// ...
}
public function onStoreOrder(FilterOrderEvent $event)
{
// ...
}
}
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.