如何让symfony在非标准目录中查找" best" (自定义)要为捆绑视图加载的Twig模板吗?
Symfony文档默认情况下会在两个位置查找override a Twig template
当呈现AcmeBlogBundle:Blog:index.html.twig时,Symfony 实际上在模板的两个不同位置查看:
应用程序/资源/ AcmeBlogBundle /视图/博客/ index.html.twig 的src / Acme公司/ BlogBundle /资源/视图/博客/ index.html.twig
但这是讨论如何覆盖供应商捆绑包。在我的情况下,我在/ src /中有本机包,我想在每个设计模板或客户端特定的基础上覆盖。它需要查看:
Client: /var/www/vhosts/{ID}/src
Template: /var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/src
Twig Loader 有一个方便的方法来添加路径:
$templatePath = '/var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/Resources/views';
$this->container->get('twig.loader')->prependPath($templatePath, 'template');
这允许我注册模板资源的替代路径,以便我可以像这样渲染模板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
如何注册通用/ src /文件,以便Symfony在那里查找对Vendor Bundle路径的所有引用,例如尝试呈现@GutensiteMenu/Menu.html.twig
将首先查看 1)客户端, 2)模板的自定义目录,3)该名称的默认包目录。
因为我的TemplateBundle / Templates / Admin / Resources /位于非标准位置,资产不会将它们转储到公共目录(或创建符号链接)......所以我不确定动态地使资产找到这些文件。
我也不确定如何加载这些其他位置的资产,例如这不起作用:
{% stylesheets '@GutensiteTemplateBundle/Templates/Admin/Resources/public/css/site.css' %}
<link rel="stylesheet" href="{{ asset_url }}">
{% endstylesheets %}
大概是因为它没有倾倒。
我正在构建一个托管CMS,它是一个核心供应商,其中包含各种带有控制器和模板的软件包,例如: /Gutensite/CmsBundle
,Gutensite/ArticleBundle
。
基于所选的&#34;设计模板&#34;对于站点,在TemplateBundle中引用设计模板,例如/TemplateBundle/Templates/Admin
(一个名为&#34; Admin&#34;的模板)。 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);
注意:我可以将每个模板注册为一个捆绑包,这理论上允许我使用symfony的内置方法覆盖控制器和捆绑包。但这会增加很多&#34;捆绑&#34;这不是真正的传统捆绑。此外,我需要上面的解决方案指向备用模板路径,因为我还需要能够指向位于正常symfony根目录之外的客户端自定义文件(我成功地使用控制器的命名空间自动加载器路径) 的
答案 0 :(得分:1)
您可以在树枝配置中使用path
选项,并为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
然后,使用@templates/Menu.html.twig
将首先在MenuBundle中查找Menu.html.twig
,然后在TemplateBundle中查找。
这就是TwigExtension
注册路径的方式,因此加载器正在查看app/Resources/views
然后在包的视图中。