为Symfony指定备用回退路径以查找捆绑包的枝条模板

Cha*_*yer 6 symfony twig

基本问题

如何在非标准目录中查找symfony以查找要为捆绑视图加载的"最佳"(自定义)Twig模板?

Symfony文档默认情况下会在两个位置查看覆盖Twig模板

呈现AcmeBlogBu​​ndle:Blog:index.html.twig时,Symfony实际上在模板的两个不同位置查找:

app/Resources/AcmeBlogBu​​ndle/views/Blog/index.html.twig src/Acme/BlogBu​​ndle/Resources/views/Blog/index.html.twig

但这是讨论如何覆盖供应商包.在我的情况下,我在/ src /中有本机包,我想在每个设计模板或客户端特定的基础上覆盖.它需要查看:

Client:    /var/www/vhosts/{ID}/src 
Template:  /var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/src
Run Code Online (Sandbox Code Playgroud)

Twig Loader有一个方便的方法来添加路径:

$templatePath = '/var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/Resources/views';
$this->container->get('twig.loader')->prependPath($templatePath, 'template');
Run Code Online (Sandbox Code Playgroud)

这允许我注册模板资源的替代路径,以便我可以像这样渲染模板shell:

{%extends'@ template/shell/shell.html.twig'%}

但是当我想要覆盖一个包模板时,例如

Original: /var/www/core/cms/src/Gutensite/MenuBundle/Resources/views/Menu.html.twig
Custom:   /var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/src/Gutensite/MenuBundle/Resources/views/Menu.html.twig
Run Code Online (Sandbox Code Playgroud)

如何注册通用/ src /文件,以便Symfony在那里查找对供应商包路径的所有引用,例如,尝试呈现@GutensiteMenu/Menu.html.twig将首先在自定义目录中查找1)客户端,2)模板,3)默认包目录那个名字.

需要资产

因为我的TemplateBundle/Templates/Admin/Resources /位于非标准位置,所以assetic不会将它们转储到公共目录(或创建符号链接)...所以我不确定如何动态地使资产找到这些文件.

我也不确定如何加载这些其他位置的资产,例如这不起作用:

{% stylesheets '@GutensiteTemplateBundle/Templates/Admin/Resources/public/css/site.css' %}
<link rel="stylesheet" href="{{ asset_url }}">
{% endstylesheets %}
Run Code Online (Sandbox Code Playgroud)

大概是因为它没有倾倒.

我为什么需要这个?

我建立一个托管的CMS是包含与控制器和模板,如各种束核心供应商/Gutensite/CmsBundle,Gutensite/ArticleBundle.

基于为站点选择的"设计模板",在TemplateBundle中引用设计模板,例如/TemplateBundle/Templates/Admin(称为"Admin"的模板).TemplateBundle需要能够覆盖核心控制器或视图.

我已经注册了Gutensite/TemplateBundle/Templates/Admin/src /文件夹作为Composer app/autoload.php的替代命名空间,因此只要控制器具有相同的Gutensite命名空间(并且效果很好),就可以覆盖控制器:

// in my primary controller:
$loader = $GLOBALS['loader'];
$loader->add('Gutensite', '/var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/src', true);
Run Code Online (Sandbox Code Playgroud)

注意:我可以将每个模板注册为一个包,理论上这将允许我使用symfony的内置方法覆盖控制器和包.但这会增加许多不是真正传统捆绑的"捆绑".此外,我需要上面的解决方案指向备用模板路径,因为我还需要能够指向位于正常symfony根目录之外的客户端自定义文件(我成功地使用控制器的命名空间自动加载器路径).

Ala*_*blo 1

您可以path在 twig 配置中使用该选项,为 2 个路径使用相同的命名空间。

twig:
    # ...
    paths:
        "%kernel.root_dir%/../src/Gutensite/MenuBundle/Resources/views": templates
        "%kernel.root_dir%/../src/Gutensite/TemplateBundle/Templates/Admin/src/Gutensite/MenuBundle/Resources/views": templates
Run Code Online (Sandbox Code Playgroud)

然后,使用@templates/Menu.html.twig将首先在MenuBundle中查找Menu.html.twig,然后在TemplateBundle中查找。

这就是TwigExtension注册路径的方式,以便加载程序先查看app/Resources/views然后再查看包的视图。