我正在尝试实施以下内容:
简单的控制器和动作。 Action应根据请求返回2种类型的响应:
HTML in case of ordinary request (text\html),
JSON in case of ajax request (application\json)
我已经设法通过控制器的插件来实现这一点,但这需要写入
return $this->myCallBackFunction($data)
在每个动作中。如果我不想对整个控制器做这个怎么办?试图找出如何通过事件监听器实现它,但无法成功。
任何提示或链接到某篇文章都将不胜感激!
答案 0 :(得分:5)
ZF2具有专门用于此目的的acceptable view model selector控制器插件。它将根据您通过查看客户端发送的Accepts标头定义的映射来选择适当的ViewModel。
对于您的示例,首先需要通过将JSON视图策略添加到视图管理器配置(通常在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响应(即AJAX请求)的请求的JsonModel。
您分配给JsonModel的任何变量都将显示在JSON输出中。