如何将控制器注入 Symfony2 中的 EventDispatcher


How to inject controller into EventDispatcher in Symfony2

我想

在我的Symfony控制器中发送响应对象后进行一些后处理。问题是,后处理需要我的控制器对象中包含的其他方法。我想做这样的事情:

public function testAction() {
    $dispatcher = new EventDispatcher();
    $dispatcher->addListener('kernel.terminate', function (Event $event) {
        $controller->get('logger');
        $logger->info('hello');
    });
    return new Response();
}

如何将$controller变量注入我的内核中。终止后处理?

似乎

您只需要服务中的容器。要将容器注入到事件侦听器中,我更喜欢创建一个单独的 EventListener,您必须在容器中注册该事件侦听器,请参阅代码:

首先创建事件侦听器类:

<?php
namespace Acme'DemoBundle'Listener;
use Symfony'Component'HttpKernel'Event'GetResponseEvent;
use Symfony'Component'DependencyInjection'ContainerInterface;
class RequestListener
{
  protected $container;
  public function __construct(ContainerInterface $container)
  {
    $this->container = $container;
  }
  public function onKernelRequest(GetResponseEvent $event)
  {
    $request = $event->getRequest();
    $logger = $this->container->get('logger')->getToken();
    $logger->info('.....');
  }
}

如您所见,我们现在注入了服务容器,我们可以使用它。

接下来,您必须注册服务并注入服务容器:

services:
  acme.demo.listener.request:
    class: Acme'DemoBundle'Listener'RequestListener
    arguments: [ @service_container ]
    tags:
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

请注意,在您的情况下,您必须选择要注入到的事件。就我而言,我使用了kernel.request事件。您必须选择内核.终止事件。

这也可能会有所帮助:http://symfony.com/doc/current/cookbook/service_container/event_listener.html