2013-02-20 29 views
2

對於Symfony 2.1項目,我試圖創建一個新的註解@Json(),它將註冊一個偵聽器,它將在我返回一個數組時自動創建JsonResponse對象。我有它的工作,但由於某種原因,聆聽者是總是調用,即使在沒有@Json註釋的方法上。我假設我的方法是有效的,因爲Sensio額外的bundle使用@Template註解來執行此操作。Symfony 2.1 - 自定義Json註釋監聽器

這是我的註釋代碼。

<?php 

namespace Company\Bundle\Annotations; 

/** 
* @Annotation 
*/ 
class Json extends \Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationAnnotation 
{ 
    public function getAliasName() 
    { 
     return 'json'; 
    } 
} 

這是我的監聽器代碼。

<?php 

namespace Company\Bundle\Listener\Response\Json; 

class JsonListener 
{ 
    //.. 

    public function onKernelView(GetResponseForControllerResultEvent $event) 
    { 
     $request = $event->getRequest(); 
     $data = $event->getControllerResult(); 

     if(is_array($data) || is_object($data)) { 
      if ($request->attributes->get('_json')) { 
       $event->setResponse(new JsonResponse($data)); 
      } 
     } 
    } 
} 

這是我爲聽衆定義的yaml。

json.listener: 
      class:  Company\Bundle\Listener\Response\Json 
      arguments: [@service_container] 
      tags: 
       - { name: kernel.event_listener, event: kernel.view, method: onKernelView } 

我很明顯缺少這裏的東西,因爲它被註冊爲一個kernel.view偵聽器。我該如何改變它,以便僅在控制器操作中存在@Json()註釋時調用它?

+0

對我來說這似乎是正確的,試着找出'_json'屬性被設置的位置。 – igorw 2013-02-21 02:51:58

+0

@igorw顯然我一直都在糾正 - 我只是以爲我錯了,因爲我很困惑,我應該在聽衆中處理註釋,而不是相反。不過謝謝。 – 2013-02-21 18:25:12

回答

1

並非假裝是確定性答案。

我不確定你爲什麼要延長ConfigurationAnnotation:它的構造函數接受array,但是你不需要你的註解的任何配置。相反,實施ConfigurationInterface

namespace Company\Bundle\Annotations; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface; 

/** 
* @Annotation 
*/ 
class Json implements ConfigurationInterface 
{ 
    public function getAliasName() 
    { 
     return 'json'; 
    } 

    public function allowArray() 
    { 
     return false; 
    } 
} 

Sensio公司ControllerListener從SensionFrameworkExtraBundle將讀取你的註釋(與方法的註釋合併類),並執行這一檢查:

if ($configuration instanceof ConfigurationInterface) { 
    if ($configuration->allowArray()) { 
     $configurations['_'.$configuration->getAliasName()][] = $configuration; 
    } else { 
     $configurations['_'.$configuration->getAliasName()] = $configuration; 
    } 
} 

設置與_前綴請求屬性。你正確地檢查_json,所以它應該工作。嘗試在您的視圖事件偵聽器中傾銷$request->attributes。請確保您的json.listener服務也已正確加載(使用php app/console container:debug >> container.txt轉儲它們)。

如果它不工作,嘗試加入一些調試和打印語句here(發現你的供應商文件夾ControllerListener.php):

var_dump(array_keys($configurations)); // Should contain _json 

記得編輯之前做出的一個副本,否則作曲家將拋出和更新依賴關係時出錯。

+0

這就是我所需要的 - 我沒有正確理解註釋被設置爲請求屬性,我應該在聽衆中檢查它們。 +1 – 2013-02-21 18:17:11

+0

@JarrodNettles然後是什麼問題? – gremo 2013-02-21 21:01:56

+0

「問題」是聽者甚至被叫到。我正在研究註釋應該如何表現不正確。對不起,如果這沒有任何意義 - 無論如何,頓悟。 – 2013-02-21 21:53:21