I try to implement a before kernel listener (see reference) where I simply set some parameter values (that I have to fetch dynamically and cannot statically declare in my parameters.yml
file).
This is my listener class:
class AcmeListener
{
public function onKernelController(FilterControllerEvent $event)
{
$event->getController()->getContainer()->setParameter('foo', 'bar');
}
}
And in my config.yml
:
services:
kernel.listener.acme_listener:
class: Acme\AcmeBundle\EventListener\AcmeListener
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
But I get a
FatalErrorException: Error: Call to a member function getContainer() on a non-object
How can I access the container, if not via getContainer()
from the $event->getController()
?
Just add the container as an argument into your service definition.
services:
kernel.listener.acme_listener:
class: Acme\AcmeBundle\EventListener\AcmeListener
arguments:
- @service_container
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
Then add a constructor to your AcmeListener class so you can access it.
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
class AcmeListener
{
/**
* @var Container
*/
private $container;
/**
* Constructor
*
* @param Container $container
*/
public function __construct(Container $container)
{
$this->container = $container;
}
public function onKernelController(FilterControllerEvent $event)
{
$this->container->...
}
}