如何避免在控制器操作中返回 ViewModel 时用 "content" 包装响应?



使用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时,将在没有"内容"包装器的情况下正确呈现响应。希望有一个更优雅的解决方案,因此可以避免在控制器中查看逻辑,但是并非为直接解决问题而创建修复程序。

相关内容

  • 没有找到相关文章

最新更新