【问题标题】:Symfony 2 loading custom configuration fileSymfony 2 加载自定义配置文件
【发布时间】:2014-05-03 10:25:25
【问题描述】:

我想在 Bundle/Resources/config 中添加一个新的配置文件。我试过关注 http://symfony.com/doc/current/cookbook/bundles/extension.html ,但它不能正常工作,我得到了

没有扩展能够加载配置 "mailbroker_mail_details"

我的文件:

MailbrokerMailDetailsExtension.php

<?php

namespace Mailbroker\MailDetailsBundle\DependencyInjection;

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

class MailbrokerMailDetailsExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
        $loader->load('canonisers.yml');
    }

    public function getAlias()
    {
        return 'mailbroker_mail_details';
    }
}

配置.php

<?php

namespace Mailbroker\MailDetailsBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritDoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('mailbroker_mail_details');

        $rootNode
            ->children()
                ->scalarNode('abc')->end()
            ->end()
        ;

        return $treeBuilder;
    }
}

canonisers.yml

mailbroker_mail_details:
    abc: 123

配置正确(当放置在 app/config/config.yml 中时,它会按原样加载),canonisers.yml 已正确加载,但由于某种原因我无法使其一起工作。感谢您的帮助!

【问题讨论】:

  • 配置对象期望 canonisers.yml 已经加载并在配置中可用。传统上,这将在 app/config 下并使用 imports: resource 来加载。然后,您的扩展程序从 Resources/config 加载默认值并合并到 app/config 值中。我没有很好地解释这一点。看看其他一些框架包,看看它们是如何进行依赖注入的。您捆绑将有两个配置文件。 Bundle\Resource\config 下的一个设置默认值,app/config 下的一个允许用户覆盖。
  • 我明白你的意思,但仍然 - 有没有不涉及 app/config 的方法(至少现在)?我想允许完全默认配置,我不想使用参数。

标签: php symfony configuration


【解决方案1】:

好吧,我还没有尝试过,但是您应该可以使用 Yaml 扩展直接加载 canonisers.yml 文件并将其添加到配置中。不推荐(绕过应用程序缓存的东西),但它可能有效:

use Symfony\Component\Yaml\Yaml;

class MailbrokerMailDetailsExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $file = __DIR__.'/../Resources/config/canonisers.yml';
        $configs = array_merge($configs,Yaml::parse(file_get_contents($file));

        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);
        ....

完全未经测试。您可能需要添加到 app/config/config.yml

mailbroker_mail_details: ~

只是为了克服错误消息。不确定。

让我知道它是否有效。

【讨论】:

  • 我试过了,效果很好。无需在 app/config 中添加数据即可工作。
  • 那么你究竟是如何在你的包或应用程序中实际使用配置设置的?
  • @pthurmond - 一种旧线程。不确定其中有多少仍然适用。至于使用配置设置,最好的办法是查看一些常见捆绑包中的 DependencyInjection 下的一些代码,例如 FrameworkBundle、TwigBundle 等。通常,配置选项用于向容器添加服务。
  • 如果您想通过默认的 app/config.yml 文件覆盖捆绑包“canonisers.yml”,考虑使用array_unshift($configs, Yaml::parse(file_get_contents($file))['mailbroker_mail_details'] 而不是$configs = array_merge($configs,Yaml::parse(file_get_contents($file)); 会很有用
【解决方案2】:

好的,#symfony irc 频道的@Iltar 将我指向食谱:http://symfony.com/doc/current/cookbook/bundles/prepend_extension.html

长话短说,PrependExtensionInterface 和 prepend 方法。

它是在我上次阅读 symfony 书和食谱后添加的,在这种情况下它并不是完全可以用谷歌搜索的,所以我将把链接留给其他人。

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 2010-10-05
    • 2019-10-26
    • 2015-10-28
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多