默认ViewModel不是必需的,我只能从控制器返回数据数组:
public function someAction()
{
//...
return array('result'=>$data);
}
但是我不能和Json一起使用这种方法。我应该在dispatch事件中做什么来将结果包装在JsonModel中(对于相应的accept头)?
答案 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"}