如何为symfony捆绑包参数/配置值提供默认值? [英] How to provide default values for Symfony bundle parameters / config values?
本文介绍了如何为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) {
}
问题:如何使用参数的默认值?
paramA
和paramB
在捆绑包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屋!
查看全文