从其他Bundle覆盖您自己的Symfony Bundle中的Controller,Views和Resources

时间:2015-01-02 18:24:15

标签: symfony twig

如何覆盖自己的供应商/捆绑控制器或其他捆绑包中的视图?

Symfony通过在您自己的vendorapp目录中添加文件来默认覆盖第三方 src捆绑包,例如: app/Resources/AcmeBlogBundle/views/Blog/index.html.twigsrc/Acme/BlogBundle/Resources/views/Blog/index.html.twig

  1. Override Any Part of a Symfony Bundle
  2. How to Use Bundle Inheritance to Override Parts of a Bundle
  3. Overriding Bundle Templates
  4. 但我在src目录中有我自己的自定义核心供应商包(例如src/Gutensite/CmsBundle),我需要在模板特定包中覆盖控制器,视图(树枝)和资源(图像,css)每当他们需要改变特定设计的平台默认行为时(例如src/Templates/LunarBundle/),它应该优先。

    视图和资源

    Lunar Dashboard

    因此,为了覆盖我的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.phpGutensite\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
    

    这有效,但我希望就潜在问题或更好的解决方案提供反馈。

1 个答案:

答案 0 :(得分:0)

也许这适合您:https://github.com/liip/LiipThemeBundle

  

此捆绑包为您提供了向每个捆绑包添加主题的可能性。在您的bundle目录中,如果找不到匹配的文件,它将在Resources / themes /下查找或回退到正常的Resources / views。

特别是configuration for Theme Cascading Order