Php 如何避免将响应用“包装”;内容“;在控制器操作中返回ViewModel时?

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

使用Zend Framework 2和AbstractRestfulController,其中getList操作的实现方式如下:

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。