Zend Framework 2 - 从Controller返回JSON

时间:2014-02-11 22:41:03

标签: php json zend-framework2

我有以下Json字符串:

var jsonString = '{"Users":[{"Name":"abc","Value":"test"},{"Name":"def","Value":"test"}]}';

我试图在控制器中使用ZF2的JsonModel类(Zend \ View \ Model \ JsonModel)来使用上面的JSON字符串渲染我的视图。但是,它似乎只采用数组而不是JSON字符串。

如何让控制器返回JSON字符串?

由于

4 个答案:

答案 0 :(得分:5)

您不需要使用JsonModel,因为您的json已经“呈现”了,因此,您可以直接在响应对象中设置它并返回它:

/**
 * @return \Zend\Http\Response
 */
public function indexAction()
{
    $json = '{"Users":[{"Name":"abc","Value":"test"},{"Name":"def","Value":"test"}]}';

    $this->response->setContent($json);

    return $this->response;
}

这会使调度事件短路,因此应用程序将立即返回您的响应,而不会调用视图层来呈现它。

请参阅http://framework.zend.com/manual/2.2/en/modules/zend.mvc.examples.html#returning-early

答案 1 :(得分:2)

您必须使用acceptableViewModelSelector控制器插件

public function listAction()
{
    $acceptCriteria = array(
    'Zend\View\Model\ViewModel' => array(
        'text/html',
    ),
    'Zend\View\Model\JsonModel' => array(
        'application/json',
    ));

    $viewModel = $this->acceptableViewModelSelector($acceptCriteria);

    Json::$useBuiltinEncoderDecoder = true;

    $itemsList = $this->getMyListOfItems();

    return $viewModel->setVariables(array("items" => $itemsList));
}

官方文件:http://framework.zend.com/manual/2.2/en/modules/zend.mvc.plugins.html#zend-mvc-controller-plugins-acceptableviewmodelselector

答案 2 :(得分:1)

另一个好处:解释为什么使用这个插件

JsonStrategy security fix

答案 3 :(得分:1)

添加module.config.php

'strategies' => [
     'ViewJsonStrategy',
 ],

然后您可以返回控制器json响应:

return new JsonModel(['some'=>'data']);