2013-08-30 3 views
4

다음을 구현하려고합니다.ZF2 전략보기

간단한 컨트롤러와 동작. 조치 요청에 따라 2 종류의 응답을 반환해야합니다 : 나는 컨트롤러에 대한 플러그인을 통해이 작업을 수행하기 위해 관리했습니다

HTML in case of ordinary request (text\html), 
JSON in case of ajax request (application\json) 

을, 그러나 이것은 각 작업에

return $this->myCallBackFunction($data) 

을 쓰기가 필요하기. 그리고 이것을 전체 컨트롤러에 적용하지 않을 경우 어떻게해야합니까? 이벤트 리스너를 통해 구현하는 방법을 알아 내려고했지만 시도 할 수 없었습니다.

어떤 도움말이나 도움말에 대한 링크를 보내 주시면 감사하겠습니다.

+0

이것은 고유 한 접근 방식이지만 조건부 작업을 할 수 있습니다. JSon 모델과 Viewmodel을 사용하여 조건부로 시도해 볼 수 있습니다. 이것은 내가 염두에두고있는 유일한 것입니다. 그러나 이것은 좋지 않은 접근 방식 일 수 있지만, 시도해 볼 수는 있습니다. –

+0

나에게 꽤 일반적인 유스 케이스처럼 들린다. –

답변

5

ZF2에는 특별히이 목적으로 acceptable view model selector 컨트롤러 플러그인이 있습니다. 클라이언트가 보낸 Accepts 헤더를보고 정의한 매핑을 기반으로 적절한 ViewModel을 선택합니다. 이미에 view_manager 키를해야합니다

'view_manager' => array(
    'strategies' => array(
     'ViewJsonStrategy' 
    ) 
), 

(그것은 가능성이 높습니다 :

귀하의 예를 들어

, 먼저 (일반적으로 module.config.php에서)보기 관리자 설정에 추가하여 JSON보기 전략을 활성화해야 거기에, 어떤 경우에 대비하여 현재의 구성에 '전략'부분을 추가)

를 그런 다음 컨트롤러는 컨트롤러 플러그인을 호출 매개 변수로 매핑을 사용 :.

class IndexController extends AbstractActionController 
{ 
    protected $acceptMapping = array(
     'Zend\View\Model\ViewModel' => array(
      'text/html' 
     ), 
     'Zend\View\Model\JsonModel' => array(
      'application/json' 
     ) 
    ); 

    public function indexAction() 
    { 
     $viewModel = $this->acceptableViewModelSelector($this->acceptMapping); 

     return $viewModel; 
    } 
} 

표준 요청의 경우 일반 ViewModel을, JSON 응답을 허용하는 요청의 경우 JsonModel을 반환합니다. AJAX 요청).

JsonModel에 지정한 변수는 JSON 출력에 표시됩니다.

+1

이것은 훌륭하게 작동하지만 컨트롤러 플러그인으로 처리 한 것과 비슷합니다. 플러그인의 코드는 매우 간단합니다 : return ($ this-> controller-> getRequest() -> isXmlHttpRequest() === false? new ViewModel ($ params) : new JsonModel ($ params)); 그리고 컨트롤러에서 다음과 같이 사용할 수 있습니다 : return $ this-> myResponse ($ data); 그러나 나는이 코드를 컨트롤러에서 일부 청취자로 옮길 수있는 솔루션을 찾고있었습니다. 그래서 컨트롤러에는 단순한 return $ 데이터가있을 것이고, 다른 곳의 어딘가에서는 컨트롤러의 동작을 정의 할 것이고, 응답의 swich에서 사용할 수 있어야합니다. –

+0

+1, 완벽한 답변 !!! – SagarPPanchal