ZF3 PhpRenderer找不到模板路径

时间:2018-11-22 08:14:08

标签: php templates zend-framework zend-framework3

我知道有很多关于PHPRenderer找不到模板路径的问题,但是我认为这里的问题大不相同。

首先,目标是将视图呈现给变量,以便将其发送到PDF渲染器(我使用ZF3 TCPDF模块)。如果有更好的方法,请告诉我。

以下是该项目的架构:https://imgur.com/UhQ7hgP

AlertAction()的{​​{1}}中,我返回这样的视图,并且该视图有效,这使我认为模板路径还可以。

ToolsController

但是,当我尝试在$view = new ViewModel(); $view->setTemplate('tools/tools/alert'); return $view; 中使用相同的路径渲染相同的视图时,它不起作用并给出以下错误。

  

Zend \ View \ Renderer \ PhpRenderer :: render:无法渲染模板“ tools / tools / alert”;解析器无法解析为文件

exportPDFAction()中的代码是:

exportPDFAction()

我认为最后一行是它的区别,但是我不明白为什么,有人有任何线索吗?

关于SO上模板路径的所有话题都在讨论$view = new ViewModel(); $renderer = new PhpRenderer(); $view->setTemplate('tools/tools/alert'); $html = $renderer->render($view); 中的模板映射,但是我认为这不是问题,因为它在module.config.php中可以很好地工作。

编辑

PhpRenderer会直接在module.config.php中注入控制器:

AlertAction()

编辑2

这是控制器的构造函数:

'controllers' => [
    'factories' => [
        ToolsController::class => function($container) {
            return new ToolsController(
                $container->get(Adapter::class),
                $container->get(\TCPDF::class),
                $container->get(PhpRenderer::class)
            );
        },
    ],
],

1 个答案:

答案 0 :(得分:2)

您收到的错误可能是由于您的渲染器未通过工厂注入而造成的。

尝试:

class MyCustomControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        /** @var \Zend\View\Renderer\PhpRenderer $renderer */
        $renderer = $container->get('ViewRenderer')

        return new MyCustomController($renderer);
    }
}

在控制器中,要求在__construct()函数中进行设置:

public function __construct(PhpRenderer $renderer)
{
    // ... set it somewhere, e.g.:
    $this->setRenderer($renderer);
}

然后在您的函数中使用它:

$view = new ViewModel();
$renderer = $this->getRenderer();
$view->setTemplate('tools/tools/alert');
$html = $renderer->render($view);

为什么问?

因为渲染器是通过Zend配置进行配置的。您可以在\Zend\Mvc\Service\ServiceManageFactory类中找到它。提供的别名配置如下:

'ViewPhpRenderer'                      => 'Zend\View\Renderer\PhpRenderer',
'ViewRenderer'                         => 'Zend\View\Renderer\PhpRenderer',
'Zend\View\Renderer\RendererInterface' => 'Zend\View\Renderer\PhpRenderer',

别名被映射到 Factory

'Zend\View\Renderer\PhpRenderer' => ViewPhpRendererFactory::class,

那个工厂是:

class ViewPhpRendererFactory implements FactoryInterface
{
    /**
     * @param  ContainerInterface $container
     * @param  string $name
     * @param  null|array $options
     * @return PhpRenderer
     */
    public function __invoke(ContainerInterface $container, $name, array $options = null)
    {
        $renderer = new PhpRenderer();
        $renderer->setHelperPluginManager($container->get('ViewHelperManager'));
        $renderer->setResolver($container->get('ViewResolver'));

        return $renderer;
    }
}

因此,将其与$this->getRenderer一起使用时会包含一些预设,即它具有HelperPluginManagerResolver集。因此,它知道从何处获取其他资源(如果需要),并且知道如何解析(即渲染)视图。