如何为symfony捆绑包参数/配置值提供默认值? [英] How to provide default values for Symfony bundle parameters / config values?

查看:0
本文介绍了如何为symfony捆绑包参数/配置值提供默认值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经创建了一个symfony 5.3+包,它应该用于将公共代码添加到不同的项目中。该捆绑包包含一些服务,这些服务应该可以使用symfony文档中所述的参数/选项进行配置。

如何为这些选项提供默认值?捆绑包中设置的默认值Configuration.php不起任何作用。


详细信息:

我使用以下结构创建了一个捆绑包项目,并使用Composer将其添加到我的symfony项目中:

path/to/bundles/XYCommonsBundle/
    config/
        services.yaml
    src/
        Service/
            SomeService.php
        DependencyInjection
            Configuration.php
            XYCommensExtension.php
    XYCommensBundle.php
    composer.json
    ...


// src/DependencyInjection/XYCommensExtension.php
<?php

namespace XYCommensBundleDependencyInjection;

use ...

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

        // make config available as parameters. Necessary?
        foreach ($config as $key => $value) {
            $container->setParameter('xy_commons.' . $key, $value);
        }


        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../../config'));
        $loader->load('services.yaml');
    }
}


// src/DependencyInjection/Configuration.php
class Configuration implements ConfigurationInterface {
    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder('xy_commons');
        
        $treeBuilder->getRootNode()
            ->children()
                ->arrayNode('params')
                    ->children()
                        ->integerNode('paramA')->defaultValue(100)->end()
                        ->integerNode('ParamB')->defaultValue(200)->end()
                    ->end()
                ->end()
            ->end()
        ;
        
        return $treeBuilder;
    }
}


// config/services.yaml
services:
    xy_commons.service.some_service:
        class:  XYCommonsBundleServiceSomeService
        arguments:   
            - $paramA: '%xy_commons.params.paramA%'
            - $paramB: '%xy_commons.params.paramB%' 


// src/Service/SomeService.php
<?php

namespace XYCommensBundleService;

use ...

class SomeService {
    public function __construct(LoggerInterface $logger, $paramA, $paramB) {
}    

问题:如何使用参数的默认值?

paramAparamB在捆绑包Configuration.php中定义,默认为100和200。我想在不指定自定义值的情况下在项目中使用这些默认值。但是,如果我没有在项目中创建config/packages/xy_commons.yaml文件并显式指定值,则会出现以下错误:

您请求的参数不存在 XY_COMMONTS PARAMETS PARAME A&Q;。

创建config/packages/xy_commons.yaml文件时,无法使用~使用默认值:

xy_commons:
    params:
        paramA: ~
        paramB: ~
路径&QOOT;XY_COMMONTS PARAMETS PARAMETS";的类型无效。应为INT";,但 已获取空(&Q;NULL)。

仅当显式指定值时才起作用:

xy_commons:
    params:
        paramA: 300
        paramB: 400

如何使用Configuration.php中定义的默认值?

推荐答案

这里有三个问题。第一个课程可能是我在symfony最不喜欢的课程。可怕的配置对象。特别是,在处理数组时需要使用addDefaultsIfNotSet

class Configuration implements ConfigurationInterface 
{
  public function getConfigTreeBuilder() 
  {
      $treeBuilder = new TreeBuilder('my');

      $rootNode = $treeBuilder->getRootNode();

      $rootNode
          ->children()
              ->arrayNode('params')->addDefaultsIfNotSet() # ADD THIS
                  ->children()
                      ->integerNode('paramA')->defaultValue(100)->end()
                      ->integerNode('paramB')->defaultValue(200)->end()
                  ->end()
              ->end()
          ->end()
      ;
      
      return $treeBuilder;
  }
}

第二个问题是您没有正确定义参数。具体地说,这些参数将被分组到一个称为PARAMS的数组中。你差一点就成功了:

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

        foreach($config['params'] as $key => $value) {
           $container->setParameter('xy_commons.params.' . $key, $value);
        }

# Use bin/console dump:container --parameters to verify

最后一件事是使用代字号来表示缺省值。我认为这可能是一个按设计工作的问题。从技术上讲,YAML上的波浪符号表示为空,这取决于处理器对其的理解。ArrayNode按预期工作,但IntegerNode不能。因此,这是可行的:

# config/packages/my.yaml
my:
    params: ~
#        paramA: ~
#        paramB: 666

这篇关于如何为symfony捆绑包参数/配置值提供默认值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆