ZF2查看策略

Ant*_*nin 4 events json response event-listener zend-framework2

我正在尝试实现以下内容:

简单的控制器和动作.Action应根据请求返回2种类型的响应:

HTML in case of ordinary request (text\html),
JSON in case of ajax request (application\json)
Run Code Online (Sandbox Code Playgroud)

我已经设法通过控制器的插件来做到这一点,但这需要写

return $this->myCallBackFunction($data)
Run Code Online (Sandbox Code Playgroud)

在每个行动中.如果我不想对整个控制器做这个怎么办?试图找出如何通过事件监听器实现它,但无法成功.

任何提示或链接到一些文章将不胜感激!

Tim*_*ain 5

ZF2具有专门用于此目的的可接受的视图模型选择器控制器插件.它将根据您通过查看客户端发送的Accepts标头定义的映射来选择适当的ViewModel.

对于您的示例,首先需要通过将JSON视图策略添加到视图管理器配置(通常在module.config.php)中来启用它:

'view_manager' => array(
    'strategies' => array(
        'ViewJsonStrategy'
    )
),
Run Code Online (Sandbox Code Playgroud)

(很可能你已经有了一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将返回标准请求的正常ViewModel,以及接受JSON响应(即AJAX请求)的请求的JsonModel.

您分配给JsonModel的任何变量都将显示在JSON输出中.