ZF3 PhpRenderer 找不到模板路径

ZF3 PhpRenderer not finding template path

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

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

项目的大致架构如下:https://imgur.com/UhQ7hgP

ToolsControllerAlertAction() 中,我 return 视图是这样的,而且它有效,这让我觉得模板路径没问题。

$view = new ViewModel();
$view->setTemplate('tools/tools/alert');
return $view;

但是,当我尝试在 exportPDFAction() 中使用相同的路径渲染相同的视图时,它不起作用并出现以下错误。

Zend\View\Renderer\PhpRenderer::render: Unable to render template "tools/tools/alert"; resolver could not resolve to a file

exportPDFAction()中的代码是:

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

我认为最后一行搞砸了,因为它是不同的,但我不明白为什么,有人知道吗?

SO 上关于模板路径的所有主题都在讨论 module.config.php 中的模板映射,但我认为这不是这里的问题,因为它在 AlertAction().[=22 中完美运行=]

编辑

在module.config.php:

中直接在controller中注入PhpRenderer
'controllers' => [
    'factories' => [
        ToolsController::class => function($container) {
            return new ToolsController(
                $container->get(Adapter::class),
                $container->get(\TCPDF::class),
                $container->get(PhpRenderer::class)
            );
        },
    ],
],

编辑 2

这是控制器构造函数:

public function __construct($db, $tcpdf, $renderer)
{
    $this->db = $db;
    $this->tcpdf = $tcpdf;
    $this->renderer = $renderer;
    ...
}

您遇到的错误可能是由于您的渲染器不是通过工厂注入的。

尝试:

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

在Controller中,要求在__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 class 中找到它。提供的 alias 配置如下:

'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 集。所以它知道从哪里获得额外的资源(如果需要的话)并且它知道如何解析(即渲染)一个视图。