使用Zend Framework 2和一个AbsTractrestfulController,其中getList操作的实现如下:
public function getList() {
return new ViewModel(array(
'entities' = array(1 => array(/*..*/), 2 => array(/*..*/))
));
}
我已经将jsonstrategy添加到视图管理器中,因此当我的UA发送Accept: text/html
ZF2时,使用正确的视图来格式化数据。当我的UA发送Accept: application/json
ZF2时(正确)用application/json
响应,JSON编码数据。
但是现在所有实体都包裹在" content"节点( ViewModel::$captureTo
属性)中。
如果操作控制器返回JSONMODEL,则可以避免。但是随后,jSonstrategy总是在没有检查接受的情况下对应用程序/JSON做出响应。
在使用ViewModel而不是JSONMODEL的同时,有什么方法可以避免它?
获得解决方案,我做这样的事情:
1-创建一个新的MasterControllerClass,我的新控制器"扩展了MasterControllerClass"
abstract class MasterControllerClass extends AbstractActionController
private $_jsonFlag = false;
public function onDispatch(MvcEvent $e)
{
$this->preDispatch($e);
$action = parent::onDispatch($this->getEvent());
$this->postDispatch($e);
return $action;
}
public function postDispatch(MvcEvent $e)
{
$this->_jsonFlag ?: $this->viewConfig($e);
}
public function json($value, $sucess = true)
{
$this->_jsonFlag = true;
return new ZendViewModelJsonModel(array(
'data' => $value,
'success' => $sucess,
));
}
2-在我的控制器中,我将调用$ the-> json('to javascript的值',true或false,true ==成功,false ==失败)
它解决了我的问题,现在我可以将json传递给我的javascript。
在Zend Framework 2.0.4中已经解决了此问题,但并非以完美的方式解决。他们添加了一个称为acceptableViewModelSelector
的新控制器插件,可以这样使用:
class SomeController extends AbstractActionController
{
protected $acceptCriteria = array(
'ZendViewModelJsonModel' => array(
'application/json',
),
'ZendViewModelFeedModel' => array(
'application/rss+xml',
),
);
public function apiAction()
{
$viewModel = $this->acceptableViewModelSelector($this->acceptCriteria);
// Potentially vary execution based on model returned
if ($viewModel instanceof JsonModel) {
// ...
}
}
}
当它选择创建JSONMODEL时,将在没有"内容"包装器的情况下正确呈现响应。希望有一个更优雅的解决方案,因此可以避免在控制器中查看逻辑,但是并非为直接解决问题而创建修复程序。