基本问题
如何让 symfony 在非标准目录中查找“最佳”(自定义)Twig 模板来加载捆绑视图?
Symfony 文档说默认情况下它会在两个位置查找覆盖 Twig 模板 http://symfony.com/doc/current/book/templating.html#overriding-bundle-templates
当呈现 AcmeBlogBundle:Blog:index.html.twig 时,Symfony
实际上在两个不同的位置查找模板:
应用程序/资源/AcmeBlogBundle/views/Blog/index.html.twig
src/Acme/BlogBundle/Resources/views/Blog/index.html.twig
但这正在讨论如何覆盖供应商捆绑包。就我而言,我的 /src/ 中有本机捆绑包,我想根据每个设计模板或特定于客户端的基础来覆盖它们。它需要查看:
Client: /var/www/vhosts/{ID}/src
Template: /var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/src
树枝装载机有一个方便的方法来添加路径:
$templatePath = '/var/www/core/cms/src/Gutensite/TemplateBundle/Templates/Admin/Resources/views';
$this->container->get('twig.loader')->prependPath($templatePath, 'template');
这允许我注册模板资源的替代路径,以便我可以像这样渲染模板 shell:
{% 扩展 '@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/ 位于非标准位置,所以 assetic 不会将它们转储到公共目录(或创建符号链接)...所以我不确定如何动态地使 assetic 找到这些文件。
我也不确定如何加载这些其他位置的资产,例如这不起作用:
{% stylesheets '@GutensiteTemplateBundle/Templates/Admin/Resources/public/css/site.css' %}
<link rel="stylesheet" href="{{ asset_url }}">
{% endstylesheets %}
大概是因为没有被抛弃。
为什么我需要这个?
我正在构建一个托管 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);
注意:我可以将每个模板注册为捆绑包,理论上这将允许我使用 symfony 的内置方法覆盖控制器和捆绑包。但这会增加很多并非真正传统捆绑的“捆绑”。另外,我需要上述解决方案来指向替代模板路径,因为我还需要能够指向位于正常 symfony 根目录之外的客户端自定义文件(我成功地使用控制器的命名空间自动加载器路径做到了这一点)。