[英]How to render ZF2 view within JSON response?
到目前为止,我已经弄清楚了如何在Zend Framework 2中返回典型的JSON响应。首先,我将ViewJsonStrategy
添加到view_manager
配置的“ strategies
部分。 然后,我返回一个JsonModel
了所有变量的JsonModel
实例,而不是从控制器操作中返回ViewModel
实例。
现在,我已经弄清楚了这一点,我需要了解如何呈现视图并在该JSON响应中返回它。 在ZF1中,我可以使用$this->view->render($scriptName)
,它以字符串形式返回HTML。 在ZF2中, 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(...);
}
好吧,我想我终于明白了你在做什么。 我找到了符合您条件的解决方案。 尽管我确信仍有改进的空间,但仍有一些麻烦的工作要做...
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;
}
如您所见,我创建的templateMap令人讨厌……令人讨厌,我敢肯定它可以进行很多改进。
这是一个可行的解决方案,但不是一个干净的解决方案。
也许可以通过某种方式能够从ServiceLocator中获取其可能已经实例化的默认PhpRenderer及其模板和路径映射,然后它应该会更干净。
由于@DrBeza的评论,需要做的工作可以减少很多。 现在,正如我最初想要的那样,我们将在所有模板映射完好无损的情况下抓取viewrenderer,然后直接渲染ViewModel。 唯一重要的因素是您需要指定要渲染的完全合格的模板(例如:“ $ module / $ controller / $ action”)
我希望这会让您入门;)
PS:响应如下所示:
Object:
html: "<h1>Hello World</h1>"
jsonArray: Array[6]
jsonVar1: "jsonVal2"
您可以使用更简单的方法来呈现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。
'view_manager' => array(
.................
'strategies' => array(
'ViewJsonStrategy',
),
.................
),
这对我来说是工作,希望对您有所帮助。
在ZF 3中,您可以使用此代码获得相同的结果
MyControllerFactory.php
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$renderer = $container->get('ViewRenderer');
return new MyController(
$renderer
);
}
MyController.php
private $renderer;
public function __construct($renderer) {
$this->renderer = $renderer;
}
public function indexAction() {
$htmlViewPart = new ViewModel();
$htmlViewPart
->setTerminal(true)
->setTemplate('module/controller/action')
->setVariables(array('key' => 'value'));
$htmlOutput = $this->renderer->render($htmlViewPart);
$json = \Zend\Json\Json::encode(
array(
'html' => $htmlOutput,
'jsonVar1' => 'jsonVal2',
'jsonArray' => array(1, 2, 3, 4, 5, 6)
)
);
$response = $this->getResponse();
$response->setContent($json);
$response->getHeaders()->addHeaders(array(
'Content-Type' => 'application/json',
));
return $this->response;
}
像往常一样,框架开发人员会遵循以下规则来解释AJAX:为什么简单,如果可能很复杂,这是控制器脚本中的简单解决方案
public function checkloginAction()
{
// some hosts need to this some not
//header ("Content-type: application/json"); // this work
// prepare json aray ....
$arr = $array("some" => .....);
echo json_encode($arr); // this works
exit;
}
这同样适用于ZF1和ZF2
如果您使用ZF2创建者的建议
use Zend\View\Model\JsonModel;
....
$result = new JsonModel($arr);
return $result;
至少在zf 2.0.0中,AJAX的响应为null
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.