如何在Symfony2环境中注册另一个(自定义)Twig加载器?

Vil*_*ila 6 templates symfony twig

我想在我的Symfony2应用程序中从数据库加载某些Twig模板,同时仍然保留使用本机加载器在标准文件系统位置呈现模板的可能性.怎么做到这一点?

据我所知,没有可能在Twig环境中注册多个加载器.我一直在想两种方式(现在):

  • 自定义代理类替换默认加载器.当使用标准@Bundle-notation引用模板时,代理会将请求传递给默认加载器.在其他情况下,请求将传递给我的自定义(数据库)加载器; 要么
  • 构建一个全新的Twig环境.此方法需要向两个环境注册自定义Twig扩展,并且不允许来自不同源的交叉引用模板(一些来自@Bundles,一些来自数据库)

更新1:

似乎Twig支持可以在我的第一个选项中使用的Twig_Loader_Chain类.仍然,默认加载器应该是可访问的并作为第一个选项传递给链.

Jub*_*rin 6

要使用Twig_Loader_Chain,您需要Symfony 2.2 https://github.com/symfony/symfony/pull/6131
然后您可以简单地配置您的加载器:

services:
    twig.loader.filesystem:
        class: %twig.loader.filesystem.class%
        arguments:
            - @templating.locator
            - @templating.name_parser
        tags:
            - { name: twig.loader }
    twig.loader.string:
        class: %twig.loader.string.class%
        tags:
            - { name: twig.loader }
Run Code Online (Sandbox Code Playgroud)

更新:
看起来仍然存在一些问题(文件系统加载器无法找到模板)但我发现了这个问题:
http ://forum.symfony-project.org/viewtopic.php? t = 40382&p = 131254

似乎工作得很好!

  • 我意识到这是一个旧线程,但添加上面的配置会阻止显示Web配置文件调试模板 - 在屏幕底部显示以下字符串:@ WebProfiler/Profiler/toolbar_js.html.twig怎么能我修好了吗? (3认同)