2013-08-30 90 views
4

我試圖執行以下操作:ZF2查看策略

簡單的控制器和操作。動作要返回根據請求2種類型的響應:

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

我已經成功地通過了控制器的一個插件來做到這一點,但是這requres寫

return $this->myCallBackFunction($data) 

的每個動作。如果我不想這樣做到整個控制器呢?試圖找出如何通過事件監聽器來實現它,但不能成功。

任何提示或鏈接到一些文章,將不勝感激!

+0

這是一個獨特的方法,但你可以做有條件的工作,你可以嘗試使用JSon模型和Viewmodel有條件地這是我唯一想到的,但這可能是一個壞的方法,但同比可以嘗試它 –

+0

聽起來像是一個很常見的用例。 –

回答

5

ZF2擁有專門用於此目的的acceptable view model selector控制器插件。它將根據您定義的映射通過查看客戶端發送的Accepts頭來選擇適當的ViewModel。

對於你的榜樣,您首先需要將其添加到您的視圖管理器配置(通常在module.config.php),以確保JSON視圖策略:

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

(很可能你已經有一個view_manager關鍵還有,在這種情況下,「戰略」的一部分添加到您當前的配置)

然後在您的控制器調用控制器插件,使用映射作爲參數:

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); 但是我正在尋找解決方案,它允許將此代碼從控制器移出到某個監聽器。所以在控制器中會有簡單的返回數據,而在其他地方的某個地方將會定義控制器\操作,這些操作必須可用於響應。 –

+0

+1,完美答案!!! – SagarPPanchal