我知道有很多关于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)
);
},
],
],
答案 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
一起使用时会包含一些预设,即它具有HelperPluginManager
和Resolver
集。因此,它知道从何处获取其他资源(如果需要),并且知道如何解析(即渲染)视图。