0

我想用响应状态和其他数据替换 zend2 中的输出,从 html 到 fullJSON。

例如:当我通过浏览器 /mycontroller/action 输入时,应显示带有视图的布局

当我输入 /mycontroller/action/?ajax 时,应该显示带有来自 ViewModel 的 vars 的 JSON 数组,以及响应状态和标题。

我怎么能用zend2做到这一点?我想在我的模块中的每个控制器上都这样做

class MyController extends AbstractActionController
{
    public function indexAction()
    {
        return array("test"=>"test2")
    }   
    public function redirectAction()
    {
        $this->redirect()->toUrl('http://google.pl');
        return array("test"=>"test5")
    }

}
/*
when i eneter
/MyController/index should display normal layout with html
/MyController/index?ajax should display 
{
    response: 200,
    headers: {} - response headers
    data: {
        "test" => "test2"
    }
}

when i eneter
/MyController/redirect should redirect me to other place
/MyController/redirect?ajax should display 
{
    response: 302,
    headers: {
        'redirect' => 'http://google.pl'
    } - response headers
    data: {
        "test" => "test5"
    }
}
*/
4

2 回答 2

2

这就是我如何做到这一点:

$headers = $request->getHeaders();
$requested_with_header = $headers->get('X-Requested-With');
if($requested_with_header->getFieldValue() == 'XMLHttpRequest') {
     return new Zend\View\Model\JsonModel($data);
}
else{
    return new Zend\View\Model\ViewModel($data);
}
于 2013-09-30T16:41:03.820 回答
0

ZF 将自动处理输出协商,但如果您想手动处理,这里有一种方法:

namespace My\Module;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model;

class MyController extends AbstractActionController
{
    public function indexAction()
    {
        $stuff = array("test" => "foo");
        if ($this->getRequest()->isXmlHttpRequest()) {
            return Model\JsonModel($stuff);
        } else {
            return Model\ViewModel($stuff);
        }
    }
}

另一种方法是在 MVC 事件上注册事件侦听器:调度、完成或渲染。

于 2013-09-30T22:39:52.603 回答