【问题标题】:Symfony2: Is it possible to add configuration for another bundle via DependencyInjection?Symfony2:是否可以通过 DependencyInjection 为另一个包添加配置?
【发布时间】:2012-02-14 23:16:55
【问题描述】:

在 Symfony2 的 config.yml 中你可以添加一个“import”,例如:

imports:
    - { resource: services.yml }

在我的 services.yml 里面我有:

imports:
    security_bundle:
      resource: @AcmeSecurityBundle/Resources/config/services.yml

然而,为捆绑声明服务的另一种方法是使用 DependencyInjection Extension 从而消除手动将任何内容导入 config.yml 的需要,从而解耦代码。

namespace Acme\Bundle\SecurityBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;

class AcmeSecurityExtension extends Extension {

    public function load(array $configs, ContainerBuilder $container) {
        $loader = new YamlFileLoader(
            $container, new FileLocator(__DIR__ . '/../Resources/config')
        );
        $loader->load('services.yml');
    }

}

问题 这适用于服务声明,但例如您希望一个包配置另一个包,例如添加LiipImagineBundle(就像AvalancheImagineBundle)过滤器:

liip_imagine:
    filter_sets:
      security_avatar_thumbnail:
        quality: 75
        filters:
          thumbnail: { size: [140, 140], mode: inset }

Symfony 然后抱怨

没有扩展能够加载“liip_imagine”的配置

那么有谁知道是否有一种方法可以在不触及 config.yml 的情况下从另一个捆绑包中为第三方捆绑包添加配置?

【问题讨论】:

    标签: symfony liipimaginebundle


    【解决方案1】:

    在 Symfony 2.2 中,可以借助 PrependExtensionInterface。

    查看“如何简化多个 Bundles 的配置”食谱条目:

    http://symfony.com/doc/current/cookbook/bundles/prepend_extension.html

    【讨论】:

    • FOSUserBundle 我需要这个!我现在可以在上面创建我的扩展并使用我的配置预加载它。示例: $container->prependExtensionConfig('fos_user', array( 'db_driver' => 'orm' ));
    【解决方案2】:

    我认为这是可能的,在你的包中使用 DependencyInjection\YourBundleExtension 类,然后做一个

    public function load(array $configs, ContainerBuilder $container)
    {
        ...
        $container->setParameter('the_bundle_parameter.you.want.to.override',$itsValue);
        ...
    }
    

    但我真的不知道这是否是最佳做法......

    【讨论】:

    • 这不起作用,因为原始发帖人试图覆盖的不是参数。这只有在您可以说服 liip_imagine 的开发人员重构他们的包以使用一系列参数而不是语义配置时才有效(symfony.com/doc/current/cookbook/bundles/extension.html)。这将是相当多的工作,几乎没有任何好处,而且可能对 liip_imagine 没有任何好处。
    • 我认为答案可能是不可能的。现在我只是将包级别的 config.yml 导入到主 config.yml 中,以便我的 liip_imagine 配置仍然封装在与其相关的包中。
    【解决方案3】:

    我找到了将过滤器放在包中而不是根 config.yml 中的解决方案

    avalanche_imagine:
        web_root:     %kernel.root_dir%/../web
        cache_prefix: media/cache
        driver:       gd
        bundle: PathToYourBundleClass
    

    AvalancheImagineExtension:load 添加这个:

        $bundleClass = $container->getParameter("imagine.bundle");
        if ($bundleClass)
        {
            $bundle = new $bundleClass();
            $bundle->getContainerExtension()->load(array(), $container);
        }
    

    AvalancheImagineExtension/Resources/config/config.xml

    <parameter key="imagine.bundle"></parameter>
    

    最后,在你的包中:

    parameters:
        imagine.filters:
            image_main:
                type:    thumbnail
                options: { size: [490, 310], mode: outbound }
    

    【讨论】:

    • 非常糟糕的主意,ImagineBundle 的扩展类将调用 load() 方法两次 - 一次由容器调用,一次由您的代码调用
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多