我尝试加载一个base.html.twig从symfony的默认位置移动app/Resources/views/到自定义位置的简单模板文件theme/.
模板文件包含:
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
控制器Acme\Core\CoreBundle\Controller使用特定于控制器的模板扩展上述模板文件
{% extends '::base.html.twig' %}
{% block body %}
Hello world!
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
导致错误说Unable to find template "::base.html.twig" in "AcmeCoreCoreBundle:Default:index.html.twig"..
如何告诉symfony在全球空间中找到模板文件的位置?
提前致谢.
Mig*_*ias 11
有一个本机功能,可以很好地完成您想要的任务.你可以在app/config.yml中的twig配置中添加一个twig命名空间,如下所示:
twig:
# ...
paths:
"%kernel.root_dir%/../vendor/acme/foo-bar/templates": foo_bar
Run Code Online (Sandbox Code Playgroud)
这vendor/acme/foo-bar/templates将为文件夹创建一个别名,然后您可以使用它来从控制器呈现模板:
return $this->render(
'@foo_bar/template.html.twig',
$data
);
Run Code Online (Sandbox Code Playgroud)
或者来自其他树枝模板
{% include '@foo_bar/template.html.twig' %}
Run Code Online (Sandbox Code Playgroud)
资料来源:官方食谱http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html
由于亚当的暗示,我能够自己回答这个问题.如果有人有兴趣,我想提供我的答案.
在AcmeDemoBundle提供了一个树枝延伸(类Acme\DemoBundle\Twig\Extension\DemoExtension),你根本可以使用.将构造函数更改为
public function __construct(FilesystemLoader $loader)
{
$this->loader = $loader;
$this->loader->addPath('path/to/your/directory');
}
Run Code Online (Sandbox Code Playgroud)
现在告诉symfony注册twig扩展.编辑您的config.yml文件(例如app/config/config.yml)并追加
services:
demo.twig.extension
class: Acme\DemoBundle\Twig\Extension\DemoExtension
tags:
- { name: twig.extension }
arguments:
- @Twig.loader
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的是更改扩展的twig文件并::从默认模板的命名空间中删除:
{% extends 'base.html.twig' %}.
我设法找到了另一种解决方案,它可以更快地实现.我确实首先尝试了这个问题的接受答案,但仍然有这样的路径问题.
在我的渲染调用模板之前,我添加了twig.loader容器的路径,如下所示:
$this->container->get('twig.loader')->addPath('../../../../theme/', $namespace = '__main__');
Run Code Online (Sandbox Code Playgroud)
现在,枝条模板将从根文件夹中名为"theme"的目录中呈现.我发现这个解决方案来自Fabien Pontencier本人(Symfony和Twig的创建者)对这里的枝条错误的回复:https://github.com/symfony/symfony/issues/1912