Symfony2:Twig:自定义位置中的默认模板文件

dnl*_*dnl 7 php symfony twig

我尝试加载一个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_pa​​ths.html


dnl*_*dnl 7

由于亚当的暗示,我能够自己回答这个问题.如果有人有兴趣,我想提供我的答案.

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' %}.


azz*_*y81 5

我设法找到了另一种解决方案,它可以更快地实现.我确实首先尝试了这个问题的接受答案,但仍然有这样的路径问题.

在我的渲染调用模板之前,我添加了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