Php 如何避免将响应用“包装”;内容“;在控制器操作中返回ViewModel时?
使用Zend Framework 2和AbstractRestfulController,其中getList操作的实现方式如下:Php 如何避免将响应用“包装”;内容“;在控制器操作中返回ViewModel时?,php,json,viewmodel,zend-framework2,Php,Json,Viewmodel,Zend Framework2,使用Zend Framework 2和AbstractRestfulController,其中getList操作的实现方式如下: public function getList() { return new ViewModel(array( 'entities' = array(1 => array(/*..*/), 2 => array(/*..*/)) )); } class SomeController extends AbstractActi
public function getList() {
return new ViewModel(array(
'entities' = array(1 => array(/*..*/), 2 => array(/*..*/))
));
}
class SomeController extends AbstractActionController
{
protected $acceptCriteria = array(
'Zend\View\Model\JsonModel' => array(
'application/json',
),
'Zend\View\Model\FeedModel' => array(
'application/rss+xml',
),
);
public function apiAction()
{
$viewModel = $this->acceptableViewModelSelector($this->acceptCriteria);
// Potentially vary execution based on model returned
if ($viewModel instanceof JsonModel) {
// ...
}
}
}
我已将JsonStrategy添加到视图管理器中,因此当我的UA发送Accept:text/html
ZF2时,将使用正确的视图格式化数据。当我的UA发送Accept:application/json
ZF2(正确)响应application/json
,json编码数据
但是现在所有实体都被包装在一个“内容”节点中(查看模型::$captureTo属性)
如果动作控制器返回一个JsonModel,我可以避免这种情况。但是JsonStrategy总是用application/json响应,而不检查Accept
在仍然使用ViewModel而不是JsonModel的情况下,有什么方法可以避免这种情况吗?要获得解决方案,我可以这样做:
public function getList() {
return new ViewModel(array(
'entities' = array(1 => array(/*..*/), 2 => array(/*..*/))
));
}
class SomeController extends AbstractActionController
{
protected $acceptCriteria = array(
'Zend\View\Model\JsonModel' => array(
'application/json',
),
'Zend\View\Model\FeedModel' => array(
'application/rss+xml',
),
);
public function apiAction()
{
$viewModel = $this->acceptableViewModelSelector($this->acceptCriteria);
// Potentially vary execution based on model returned
if ($viewModel instanceof JsonModel) {
// ...
}
}
}
1-创建一个新的MasterControllerClass,我的新控制器“扩展MasterControllerClass”
2-在我的控制器中,我将调用$this->json('传递给javascript的值',true或false,true==成功,false==失败)
这解决了我的问题,现在我可以将json传递给我的Java脚本。这个问题已经在中解决了,但不是以一种完美的方式。他们添加了一个名为
acceptableViewModelSelector
的新控制器插件,可以这样使用:
public function getList() {
return new ViewModel(array(
'entities' = array(1 => array(/*..*/), 2 => array(/*..*/))
));
}
class SomeController extends AbstractActionController
{
protected $acceptCriteria = array(
'Zend\View\Model\JsonModel' => array(
'application/json',
),
'Zend\View\Model\FeedModel' => array(
'application/rss+xml',
),
);
public function apiAction()
{
$viewModel = $this->acceptableViewModelSelector($this->acceptCriteria);
// Potentially vary execution based on model returned
if ($viewModel instanceof JsonModel) {
// ...
}
}
}
当它选择创建JsonModel时,响应将在没有“内容”包装的情况下正确呈现。希望有一个更优雅的解决方案,这样可以避免控制器中的视图逻辑,但创建修复程序并不是为了直接解决问题。我希望我的控制器完全不知道响应是如何发送的,由视图层决定是JSON还是HTML。