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

时间:2016-07-05 21:39:18

标签: zend-framework zend-expressive zf3

我已经安装了来自ZF3' zend-expressive'的skelleton应用程序。在路由配置中,我配置了几条路由。其中一些路由应返回没有布局的响应。在ZF2中,我只使用了ViewModel,您可以在其上调用" setTerminal"。但是现在ViewModel在Action中并不直接可用,因为它嵌套为ZendViewRenderer的私有属性。我无法弄清楚如何设置终端,因此输出的呈现没有布局。

我在路由配置中尝试了各种选项,例如添加密钥'终端'终止'和' may_terminate'值为true。也尝试制作一个单独的工厂,但最终遇到了同样的问题,我无法到达ViewModel ..当在setTerminal为true时,它也无法在Action中创建单独的ViewModel,并将对象作为第2个传递'渲染'中的参数ZendViewRenderer对象的方法,传递' renderModal'相同的对象:"无法渲染;遇到一个标有终端的孩子" ..

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

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

2 个答案:

答案 0 :(得分:2)

我的解决方案!

是的!我发现了一个"解决方案"。我没有进入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;
    }
}

答案 1 :(得分:0)

public function indexAction(){

  return $this->getResponse();
}