ZF3:设置没有布局的终端/渲染视图(Zend-Expressive)

ZF3: set terminal / render view without layout (Zend-Expressive)

我已经从 ZF3 'zend-expressive' 安装了 skeleton 应用程序。在路由配置中,我配置了一些路由。其中一些路线应该 return 没有布局的响应。在 ZF2 中,我只是使用了可以调用 "setTerminal" 的 ViewModel。但是现在 ViewModel 在 Action 中不直接可用,因为它嵌套为 ZendViewRenderer 的私有 属性。我不知道如何设置终端,所以输出没有布局。

我在路由配置中尝试了各种选项,例如添加值为 true 的键 'terminal'、'terminate' 和 'may_terminate'。也曾尝试创建一个单独的工厂,但最终遇到了我无法访问 ViewModel 的相同问题。当我将终端设置为 true 并将对象作为第二个传递时,在 Action 中创建一个单独的 ViewModel 也没有用ZendViewRenderer 对象的 'render' 方法中的参数,在传递同一对象的 'renderModal' 时失败:"Cannot render; encountered a child marked terminal"..

肯定有一个简单的配置被我忽略了,所以我的问题是。有谁知道如何在终端上设置视图?

希望我能很好地解释我的问题。非常感谢。

我的解决方法!

是的!我找到了 "solution"。我没有进入 ViewModal 的终端设置,而是实现了一个名为 "layout/terminal" 的新布局。此布局仅输出变量 $content。参考:https://github.com/zendframework/zend-expressive/issues/360

要使用此布局,您应该在配置中添加一个新工厂。

<?php
namespace Factory;

use Interop\Container\ContainerInterface;
use Zend\Expressive\Template\TemplateRendererInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Zend\View\Model\ViewModel;

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();
}