2013-02-20 3 views
2

Symfony 2.1 프로젝트의 경우 배열을 반환 할 때 자동으로 JsonResponse 객체를 만들 청취자를 등록하는 새 주석 @Json()을 작성하려고합니다. 작동 시키려고했는데 어떤 이유로 청취자가 인데 항상이라는 @Json 주석이없는 메소드에서도 호출됩니다. Sensio 엑스트라 번들이 @Template 주석으로이 작업을 수행하기 때문에 내 접근 방식이 작동한다고 가정합니다.Symfony 2.1 - 사용자 정의 Json Annotation Listener

내 주석 코드는 다음과 같습니다.

<?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

+0

@igorw 분명히 나는 ​​모든 것을 따라 잡았습니다. 나는 청취자의 주석을 처리해야한다는 혼란 스러움을 가지고 있었기 때문에 나는 틀렸다고 가정했습니다. 그래도 고마워. –

답변

1

최종 답장을하지 마십시오.

ConfigurationAnnotation 확장 이유가 확실하지 않습니다. 해당 생성자가 array을 허용하지만 특수 효과에 대한 구성이 필요하지 않습니다. 대신, ConfigurationInterface을 구현 : SensionFrameworkExtraBundle에서

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이 주석 (메소드의 주석을 병합 클래스)를 읽고이 검사를 수행합니다

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 –

+0

@ JarrodNettles 그 다음 문제가 무엇입니까? – gremo

+0

"문제"는 청취자가 심지어 불려지라는 것이 었습니다. 특수 효과가 잘못 작동해야하는 방식을 살펴 보았습니다. 죄송합니다. 이해가되지 않는 경우 - 어느 쪽이든, 주현절. –