我正在尝试使用包含当前呈现视图的变量“html”中的项目创建一个 JsonModel。我想将此代码添加到事件中:而不是此方法:如何在 JSON 响应中呈现 ZF2 视图?在控制器中,我想通过将其移动到事件来自动化该过程
我的 module.config.php 中有策略:
'strategies' => array(
'ViewJsonStrategy',
)
我在控制器中设置了一个 setEventManager:
$events->attach(MvcEvent::EVENT_RENDER, function ($e) use ($controller) {
$controller->setRenderFormat($e);
}, -20);
这是将其附加到的最佳事件吗?RENDER_EVENT 会更好吗?
现在我想根据 !$this->getRequest()->isXmlHttpRequest() 更改页面的呈现,(为调试而注释掉)
public function setRenderFormat($e)
{
//if(!$this->getRequest()->isXmlHttpRequest())
//{
$controller = $e->getTarget();
$controllerClass = get_class($controller);
//Get routing info
$controllerArr = explode('\\', $controllerClass);
$currentRoute = array(
'module' => strtolower($controllerArr[0]),
'controller' => strtolower(str_replace("Controller", "", $controllerArr[2])),
'action' => strtolower($controller->getEvent()->getRouteMatch()->getParam('action'))
);
$view_template = implode('/',$currentRoute);
$viewmodel = new \Zend\View\Model\ViewModel();
$viewmodel->setTemplate($view_template);
$htmlOutput = $this->getServiceLocator()->get('viewrenderer')->render($viewmodel, $viewmodel);
$jsonModel = new JsonModel();
$jsonModel->setVariables(array(
'html' => $htmlOutput,
'jsonVar1' => 'jsonVal2',
'jsonArray' => array(1,2,3,4,5,6)
));
return $jsonModel;
//}
}
奇怪的是,(或不)这段代码可以工作并生成 $jsonModel,但是不会用 json 覆盖普通的 HTML 视图,但是控制器方法中的相同代码(没有事件)会完美覆盖。
ps 有没有更好的方法来完成整个概念?
pps 如何在不使用 8 行代码的情况下从控制器中获取当前的视图模板?
提前致谢!
阿博格罗夫