如何在ZF2中默认返回JsonModel?

时间:2015-03-13 18:27:14

标签: json zend-framework2 zend-view

默认ViewModel不是必需的,我只能从控制器返回数据数组:

public function someAction()
{
  //...
  return array('result'=>$data);
}

但是我不能和Json一起使用这种方法。我应该在dispatch事件中做什么来将结果包装在JsonModel中(对于相应的accept头)?

4 个答案:

答案 0 :(得分:2)

您必须将ViewJsonStrategy策略添加到module.config.php下的视图管理器中:

'view_manager' => array(
    'template_map'              => array(
    ),
    'template_path_stack'       => array(
        __DIR__ . '/../view',
    ),
    'strategies'                => array(
        'ViewJsonStrategy',
    ),
), 

然后你可以在你的行动中返回一个JsonModel:

public function myAction()
{
    $data = [1, 2, 3, 4];

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

答案 1 :(得分:2)

只需为所有API控制器创建Base Controller,并替换MvcEvent中的模型。

class JsonRestController extends AbstractRestfulController
{

    public function onDispatch(MvcEvent $e)
    {
        $e->setViewModel(new JsonModel());
        return parent::onDispatch($e);
    }
}

答案 2 :(得分:1)

从控制器获取json数据,您可以回显json编码数据并退出。我将它用于jquery ajax。我希望这就是你要找的东西。

public function testAction()
{
    $active = "some data";
    echo json_encode(array('result' => $active));
    exit();
}

然后在jquery你可以得到这样的数据

$.ajax({
              type: 'GET',
              url: '/index/time',
              dataType: 'json',
              error: function() {
                 $('#info').html('<p>Error on time calculation</p>');
              },
              success: function(data) {
                  data.result
              }
 });

答案 3 :(得分:0)

真的很简单

添加如下:

<强> IndexController.php     

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\View\Model\JsonModel; // Add this line

class IndexController extends AbstractActionController {

    public function indexAction() {
        // some index action
        return new ViewModel();
    }

    public function apiAction() {

        $person = array(
            'first_name' => 'John',
            'last_name' => 'Downe',
        );
        // Special attention to the next line
        return new JsonModel(array(
            'data' => $person,
        ));
    }

}

<强> api.phtml

<?php echo $this->json($this->data); ?>

<强>结果:

{"first_name":"John","last_name":"Downe"}