如何覆盖您自己的供应商/包控制器或来自另一个包的视图?
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),我需要覆盖模板特定的包中的控制器、视图(twig)和资源(图像、css),当它们需要为特定的设计更改平台的默认行为(例如src/Templates/LunarBundle/)时,应该优先。
意见和资源

因此,为了在我的月球模板中覆盖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)。因此,引用“父”的这种方法不起作用,因为这是为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这是可行的,但我希望对潜在的问题或更好的解决方案提供反馈。
发布于 2015-01-12 15:36:40
也许这是给你的:https://github.com/liip/LiipThemeBundle
这个包为您提供了向每个包添加主题的可能性。在您的bundle目录中,如果没有找到匹配的文件,它将在Resources/themes/下查看,或者返回到普通的Resources/views。
尤其是查看主题级联顺序的配置
https://stackoverflow.com/questions/27746712
复制相似问题