为twig模板定义自定义文件系统路径

时间:2013-11-18 14:37:14

标签: symfony twig

我已经阅读了How does Symfony2 detect where to load templates from?以及网上的其他文章

问题与我的问题非常相似,但答案并不全面。

我需要在另一个自定义包中覆盖包定义的模板。换句话说,我想指定symfony在加载模板时查看app / Resources之前必须查看的另一条路径。

工作流程应该是这样的:

首先:/src/My/Bundle/Resources/views/example.html.twig(或/src/My/Bundle/OriginalBundle/views/example.html.twig)

然后:/app/Resources/OriginalBundle/views/example.html.twig

最后:/src/Original/Bundle/Resources/views/example.html.twig

标准应用/资源 - > src / Original / Bundle是不够的。

抱歉,我的英语很差,谢谢你

3 个答案:

答案 0 :(得分:9)

有一个本机功能可以很好地完成您想要的功能。您可以在app / config.yml中的twig配置中添加一个twig命名空间,如下所示:

twig:
    # ...
    paths:
        "%kernel.root_dir%/../vendor/acme/foo-bar/templates": foo_bar

这会为文件夹vendor/acme/foo-bar/templates创建一个别名,然后您可以使用它来从控制器渲染模板:

return $this->render(
    '@foo_bar/template.html.twig',
    $data
);

或其他树枝模板

{% include '@foo_bar/template.html.twig' %}

资料来源:官方食谱http://symfony.com/doc/current/cookbook/templating/namespaced_paths.html

答案 1 :(得分:4)

要为twig模板添加目录,请执行以下操作:

chdir(__DIR__);
$this->container->get('twig.loader')->addPath('../../../../web/templates/', $namespace = '__main__');

这允许我将树枝模板放在名为' templates'的文件夹中。在web文件夹和symfony 2.3加载它们没有问题。

答案 2 :(得分:2)

负责加载twig模板的类存储在服务标识twig.loader中,默认情况下是Symfony\Bundle\TwigBundle\Loader\FilesystemLoader的实例,并存储定位模板的类在服务标识templating.locator,默认情况下是类Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator的实例(它本身作为twig.loader的第一个参数注入)

所以,理论上,您需要做的就是编写自己的类来实现Symfony\Component\Config\FileLocatorInterface(或扩展Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator),然后通知配置使用您的类(我将要使用查找如何为您完成此操作,但Symfony的网站现在已经关闭了)