如何覆盖自己的供应商/捆绑控制器或其他捆绑包中的视图?
Symfony通过在您自己的vendor
或app
目录中添加文件来默认覆盖第三方 src
捆绑包,例如: app/Resources/AcmeBlogBundle/views/Blog/index.html.twig
或src/Acme/BlogBundle/Resources/views/Blog/index.html.twig
。
但我在src
目录中有我自己的自定义核心供应商包(例如src/Gutensite/CmsBundle
),我需要在模板特定包中覆盖控制器,视图(树枝)和资源(图像,css)每当他们需要改变特定设计的平台默认行为时(例如src/Templates/LunarBundle/
),它应该优先。
因此,为了覆盖我的Lunar模板中的CmsBundle视图,我可以将文件放在这里:
Templates/LunarBundle/Resources/GutensiteCmsBundle/views/dash.html.twig
Templates/LunarBundle/Resources/GutensiteCmsBundle/public/css/dash.css
Templates/LunarBundle/Resources/GutensiteCmsBundle/public/images/icon.png
如果我制作自己的dash.html.twig
模板,我可以在本地引用这些文件,例如
{% stylesheets '@TemplatesAdminBundle/Resources/GutensiteCmsBundle/public/css/dash.css' %}
<link rel="stylesheet" href="{{ asset_url }}">
{% endstylesheets %}
但是,如果我只添加了自定义图片或css,则原始Gutensite\CmsBundle\Resources\views\dash.html.twig
模板会在我的TemplatesLunarBundle
中找到自定义css时引用为:
{% stylesheets '@GutensiteCmsBundle/Resources/public/css/dash.css' %}
<link rel="stylesheet" href="{{ asset_url }}">
{% endstylesheets %}
但Symfony默认行为不允许您从自己的捆绑包中覆盖自己的捆绑包。那你怎么做的呢?
我需要与控制器相同的覆盖功能。一个模板包(例如Templates\LunarBundle
可能需要覆盖许多不同的核心供应商包(例如Gutensite\CmsBundle\Controllers\DashController.php
和Gutensite\ArticleBundle\Controllers\ArticleController.php
)。所以this method引用&#34; parent& #34;不会工作,因为它是为OneToOne捆绑包覆盖而设计的。
目前我所知道的唯一方法是告诉Symfony在同一名称空间中查找备用文件,例如在我的主控制器中,我将名称空间Gutensite
注册到其他位置。
$loader = $GLOBALS['loader'];
// path to the user's current template
$loader->add('Gutensite', $template->getPath().'/src', true);
// path to the user's custom client files
$loader->add('Gutensite', \Gutensite\PATH_CLIENT.'/src', true);
然后我会将我的自定义控制器放在我的模板中这样的目录中:
Templates\LunarBundle\src\Gutensite\CmsBundle\Controllers\DashController.php
这有效,但我希望就潜在问题或更好的解决方案提供反馈。
答案 0 :(得分:0)
也许这适合您:https://github.com/liip/LiipThemeBundle
此捆绑包为您提供了向每个捆绑包添加主题的可能性。在您的bundle目录中,如果找不到匹配的文件,它将在Resources / themes /下查找或回退到正常的Resources / views。