4

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

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

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

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

return $this->myCallBackFunction($data)

在每一个动作中。如果我不想对整个控制器执行此操作怎么办?试图弄清楚如何通过事件监听器来实现它,但未能成功。

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

4

1 回答 1

6

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

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

'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 输出中。

于 2013-08-30T18:10:43.843 回答