2014-05-09 120 views
0

我有多語言網站,使用xml爲不同的語言。 (我知道Symfony Translations存在,但是我正在實現我自己的系統來訪問和獲取xml元素值,我想測試它)。Symfony2之前和之後的過濾器不適用於containeraware

我不打算在這裏把整個代碼的可讀性,實現是一樣in this link.

我下一個名字xml_handler有服務。我通過$this->get('xml_handler')在控制器中獲取的服務。但之後,我開始使用Symfony2最佳實踐並開始擴展ContainerAware。之後,下面的代碼被定義爲Before Listener,失敗。

if($controller[0] instanceof LanguageInterface) { 
     $xmlHandler = $controller[0]->get('xml_handler'); 

它提出了一個錯誤,沒有get()方法$controller(索引控制器是一個擴展ContainerAware控制器的名字,但是這並不重要,只是爲了清楚起見)

的問題又出現了之後我停止擴展Controller,但開始擴展ContainerAware,正如我前面所說。

所以,我怎麼得到get()方法,它是保護的,所以很明顯,想:

$controller[0]->container->get('xml_handler') 

不工作。我已經看過API但沒有getContainer()方法。

我想,這個任務是,我如何訪問控制器外的ContainerAware,在我的情況下,在Before過濾器?

感謝您的答案。

回答

2

你必須通過所有必需的依賴關係到您的收聽構造:

在你的聽衆:

<?php 

namespace Acme\MyBundle\EventListener; 

class MyListener 
{ 
    private $xmlHandler; 

    public function __construct($xmlHandler) 
    { 
     $this->xmlHandler = $xmlHandler; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController(); 

     if (!is_array($controller)) { 
      return; 
     } 

     if ($controller[0] instanceof LanguageInterface) { 
      $this->xmlHandler->doSomething(...); 

      // ... 

在配置文件中,你要問的依賴注入組件提供xml_handler服務作爲您的監聽器構造函數的參數(依賴項)。

services: 
    acme_my.listener.action: 
     class: Acme\MyBundle\EventListener\MyListener 

     arguments: 
      - "@xml_handler" 

     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 
相關問題