【问题标题】:Symfony bundle config parameters not available in listener?Symfony 捆绑配置参数在侦听器中不可用?
【发布时间】:2017-08-05 15:49:52
【问题描述】:

我有一个包含我已配置的侦听器的捆绑包:

class Configuration implements ConfigurationInterface
{

    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder ()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('mybundle_name');

        $rootNode
          ->children()
            ->scalarNode('name')->defaultValue('value')
          ->end()
        ;

        return $treeBuilder;
    }

}

我还有一个监听器,其中注入了一些服务,主要是原则和容器参数:

services:
    app.router_subscriber:
        class: MyBundle\EventSubscriber\RequestSubscriber
        calls:
            - [setEntityManager, ['@doctrine.orm.entity_manager']]
            - [setContainer, ['@service_container']]
        tags:
            - { name: kernel.event_subscriber }

当我转储 $this->容器时,我可以看到除了我自己在上面定义的参数。

当我跑步时

bin/console config:dump-reference MyBundle

我确实看到了我的期望

将我的包参数合并到应用程序参数中我缺少什么?我看到列出了第三方捆绑包,但不是我自己的捆绑包。我尽可能逐字逐句地遵循文档,因此据我所知,已经遵循了约定......

编辑 |我还没有创建 bundle config.yml 文件——我假设 Configuraiton 对象为我做了这些——设置架构和默认值——可以被应用程序配置覆盖(如果需要)。我是否需要指定一个捆绑包 config.yml 并将类似这样的内容导入应用程序 (Merge config files in symfony2)?

想法?

【问题讨论】:

  • 不确定我是否理解您的问题。配置值不会自动成为参数。您需要使用 $container->setParameter(); 在 Extension::load() 方法中显式创建它们;当然,您可能会问一些完全不同的问题。
  • 我不确定我的问题是 TBH。我假设 Configure::getConfigTreeBuilder() 基本上设置了格式和预期值、默认值等,这足以使用默认值初始化容器——然后我的应用程序代码可以使用?
  • 基本上...我如何在内部初始化我的包(通过配置类和/或 config.yml)并分别通过 AppBundle 或 MyBundle 中的服务容器提供这些参数。我已经关注了文档,但我遗漏了一些东西,因为这些参数没有显示出来。我没有注册某些东西或误解了某些东西

标签: symfony symfony-3.2


【解决方案1】:

我写了几篇博文,展示了如何使用set bundle configuration defaults using YAML files,以及如何使用automatically set bundle configuration values as container parameters。这是为 Symfony2 编写的,写于 2014 年,我链接到的 Symfony 文档的特定部分从 Symfony 2.3 开始就消失了,但同样的概念仍然适用。

这些帖子的主要内容是,您可以通过 load() 方法手动将配置值设置为包的 Extension 类中的容器参数,如下所示:

public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $container->setParameter($this->getAlias().'.name', $config['name']);
}

请注意,您可以调用 $this->getAlias() 来获取包的根名称 (mybundle_name)。使用上述调用,您将拥有一个定义为 mybundle_name.name 的参数,如果需要,您可以在应用程序的 config.yml 中覆盖该参数。

【讨论】:

  • 谢谢伙计 - 我刚刚想通了,但感谢您确认我走在正确的轨道上。我希望文档在这方面更清楚一些 - 这让我在最后一个小时里旋转轮胎:o 也非常像 getAlias() 有帮助 - 太棒了
  • 没问题,我不知道为什么文档在 2.2 之后消失了,因为其中一些我认为有用...我认为这是为了简化过程,因为这通常更适用于 3rd-派对捆绑包而不是应用程序中的内部捆绑包。
  • 我相信他们有他们的理由......文档在大多数情况下都令人难以置信,但由于版本差异,我现在已经被蜇了几次。
猜你喜欢
  • 2019-08-01
  • 2019-11-18
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多