ZF3:设置没有布局的终端/渲染视图(Zend-Expressive)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZF3:设置没有布局的终端/渲染视图(Zend-Expressive)相关的知识,希望对你有一定的参考价值。
我已经安装了ZF3'zend-expressive'的skelleton应用程序。在路由配置中,我配置了几条路由。其中一些路由应返回没有布局的响应。在ZF2中,我只使用了可以调用“setTerminal”的ViewModel。但是现在ViewModel在Action中并不直接可用,因为它嵌套为ZendViewRenderer的私有属性。我无法弄清楚如何设置终端,因此输出在没有布局的情况下呈现。
我在路由配置中尝试了各种选项,例如添加键'terminal','terminate'和'may_terminate',值为true。也尝试制作一个单独的工厂,但最终遇到了同样的问题,我无法到达ViewModel ..当在setTerminal为true时,它也无法在Action中创建单独的ViewModel,并将对象作为第2个传递ZendViewRenderer对象的'render'方法中的参数,在传递同一对象的'renderModal'时失败:“无法渲染;遇到子标记终端”..
必须有一个我忽略的简单配置,所以我的问题是。有谁知道如何在终端上设置视图?
希望我能很好地解释我的问题。提前谢谢了。
我的解决方案
是!我找到了一个“解决方案”。我没有推入ViewModal的终端设置,而是实现了一个名为“layout / terminal”的新布局。此布局仅输出变量$ content。参考:https://github.com/zendframework/zend-expressive/issues/360
要使用此布局,您应该在配置中添加新Factory。
<?php
namespace Factory;
use InteropContainerContainerInterface;
use ZendExpressiveTemplateTemplateRendererInterface;
use ZendServiceManagerFactoryFactoryInterface;
use ZendViewModelViewModel;
class RenderWithoutTemplate implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$template = $container->has(TemplateRendererInterface::class)
? $container->get(TemplateRendererInterface::class)
: null;
$r = new ReflectionClass($template);
$view = new ViewModel();
$view->setTerminal(true); // Does not affect any render behaviour (?)
$view->setTemplate('layout/terminal');
$prop = $r->getProperty('layout');
$prop->setAccessible(true);
$prop->setValue($template, $view);
return $template;
}
}
public function indexAction(){
return $this->getResponse();
}
以上是关于ZF3:设置没有布局的终端/渲染视图(Zend-Expressive)的主要内容,如果未能解决你的问题,请参考以下文章