如何在 JSON 响应中呈现 ZF2 视图?

到目前为止,我已经弄清楚了如何在Zend Framework 2中返回典型的JSON响应。首先,我将 添加到配置的部分。然后,我不是从控制器操作返回实例,而是返回一个设置了所有变量的实例。ViewJsonStrategystrategiesview_managerViewModelJsonModel

现在我已经弄清楚了这一点,我需要了解如何呈现视图并在该JSON响应中返回它。在ZF1中,我能够使用,它将HTML作为字符串返回。在 ZF2 中,该方法返回 。$this->view->render($scriptName)Zend\View\View::render(...)void

所以。。。如何呈现HTML视图脚本并在一个请求的JSON响应中返回它?

这就是我现在所拥有的:

    if ($this->getRequest()->isXmlHttpRequest()) {
        $jsonModel = new JsonModel(...);

        /* @todo Render HTML script into `$html` variable, and add to `JsonModel` */
        return $jsonModel;
    } else {
        return new ViewModel(...);
    }

答案 1

好吧,我想我终于明白你在做什么了。我找到了一个我认为符合您标准的解决方案。虽然我确信还有改进的余地,因为有一些令人讨厌的手工工作需要完成......

public function indexAction()
{
  if (!$this->getRequest()->isXmlHttpRequest()) {
    return array();
  }

  $htmlViewPart = new ViewModel();
  $htmlViewPart->setTerminal(true)
               ->setTemplate('module/controller/action')
               ->setVariables(array(
                  'key' => 'value'
               ));

  $htmlOutput = $this->getServiceLocator()
                     ->get('viewrenderer')
                     ->render($htmlViewPart);

  $jsonModel = new JsonModel();
  $jsonModel->setVariables(array(
    'html' => $htmlOutput,
    'jsonVar1' => 'jsonVal2',
    'jsonArray' => array(1,2,3,4,5,6)
  ));

  return $jsonModel;
}

如您所见,我创建的模板地图是...讨厌。。。这很烦人,我相信它可以改进很多。这是一个有效的解决方案,但不是一个干净的解决方案。也许以某种方式,人们能够从ServiceLocator中获取可能已经实例化的默认PhpRenderer,它的模板和路径映射,然后它应该更干净。

由于评论@DrBeza需要完成的工作可以减少相当多。现在,正如我最初想要的那样,我们将在所有模板映射完好无损的情况下获取视图呈现器,然后直接呈现ViewModel。唯一重要的因素是您需要指定要呈现的完全限定模板(例如:“$module/$controller/$action”)

我希望这能让你开始,虽然;)

PS:响应如下所示:

Object:
    html: "<h1>Hello World</h1>"
    jsonArray: Array[6]
    jsonVar1: "jsonVal2"

答案 2

您可以使用更简单的方法来呈现 JSON 响应的视图。

public function indexAction() {
    $partial = $this->getServiceLocator()->get('viewhelpermanager')->get('partial');
    $data = array(
            'html' => $partial('MyModule/MyPartView.phtml', array("key" => "value")),
            'jsonVar1' => 'jsonVal2',
            'jsonArray' => array(1, 2, 3, 4, 5, 6));
    $isAjax = $this->getRequest()->isXmlHttpRequest());
    return isAjax?new JsonModel($data):new ViewModel($data);
}

请注意,在使用 JsonModel 类之前,您需要在 module.config 中配置视图管理器.php模块文件。

'view_manager' => array(
        .................
        'strategies' => array(
            'ViewJsonStrategy',
        ),
        .................
    ),

它为我工作,希望它能帮助你。


推荐