ZF3 PhpRenderer 找不到模板路径
ZF3 PhpRenderer not finding template path
我知道有很多关于 PHPRenderer 找不到模板路径的问题,但我认为这里的问题很不一样。
首先,目标是将视图渲染到变量,以便将其发送到 PDF 渲染器(我使用 ZF3 TCPDF 模块)。如果有更好的方法,请告诉我。
项目的大致架构如下:https://imgur.com/UhQ7hgP
在 ToolsController
的 AlertAction()
中,我 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
一起使用时,它包含一些预设,即它具有 HelperPluginManager
和 Resolver
集。所以它知道从哪里获得额外的资源(如果需要的话)并且它知道如何解析(即渲染)一个视图。
我知道有很多关于 PHPRenderer 找不到模板路径的问题,但我认为这里的问题很不一样。
首先,目标是将视图渲染到变量,以便将其发送到 PDF 渲染器(我使用 ZF3 TCPDF 模块)。如果有更好的方法,请告诉我。
项目的大致架构如下:https://imgur.com/UhQ7hgP
在 ToolsController
的 AlertAction()
中,我 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
一起使用时,它包含一些预设,即它具有 HelperPluginManager
和 Resolver
集。所以它知道从哪里获得额外的资源(如果需要的话)并且它知道如何解析(即渲染)一个视图。