2013-09-24 32 views
1

我想在我的Symfony控制器中發送響應對象後進行一些後處理。問題是,後處理需要包含在我的控制器對象中的其他方法。我想這樣做:如何將控制器注入到Symfony2中的EventDispatcher中

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

如何注入$控制器變量到我的kernel.terminate後期處理?

回答

1

看來你只需要在你的服務中的容器。爲了得到容器注入到你的事件監聽器,我更喜歡創造,你必須在你的容器註冊看代碼的單獨事件監聽:

首先創建事件監聽器類:

<?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事件。你必須選擇kernel.terminate事件。

這也可以是有益的:http://symfony.com/doc/current/cookbook/service_container/event_listener.html

+3

爲什麼注入整個'service_container'如果你只使用記錄器?注入'service_container'時可以避免**,因爲它會在應用程序和框架之間建立緊密的耦合。你應該考慮只注入'@ logger' –

+1

是的,這是正確的,更好的解決方案只注入記錄器。它應該只是一個演示如何解決CaptainStiggz問題。 – sensi

相關問題