Defining and Processing Configuration Values

Validating Configuration Values

After loading configuration values from all kinds of resources, the values and their structure can be validated using the "Definition" part of the Config Component. Configuration values are usually expected to show some kind of hierarchy. Also, values should be of a certain type, be restricted in number or be one of a given set of values. For example, the following configuration (in YAML) shows a clear hierarchy and some validation rules that should be applied to it (like: "the value for auto_connect must be a boolean value"):

すべての種類のリソースから構成値をロードした後、構成コンポーネントの「定義」部分を使用して、値とその構造を検証できます。通常、構成値はある種の階層を示すことが期待されます。また、値は特定のタイプであるか、数が制限されているか、特定の値のセットの 1 つである必要があります。たとえば、次の構成 (YAML) は、明確な階層とそれに適用する必要があるいくつかの検証規則を示しています (「auto_connect の値はブール値でなければならない」など)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
database:
    auto_connect: true
    default_connection: mysql
    connections:
        mysql:
            host:     localhost
            driver:   mysql
            username: user
            password: pass
        sqlite:
            host:     localhost
            driver:   sqlite
            memory:   true
            username: user
            password: pass

When loading multiple configuration files, it should be possible to merge and overwrite some values. Other values should not be merged and stay as they are when first encountered. Also, some keys are only available when another key has a specific value (in the sample configuration above: the memory key only makes sense when the driver is sqlite).

複数の構成ファイルをロードする場合、いくつかの値をマージして上書きできるはずです。他の値はマージせず、最初に遭遇したときのままにします。また、一部のキーは、別のキーが特定の値を持つ場合にのみ使用できます (上記のサンプル構成では、メモリ キーはドライバーが sqlite の場合にのみ意味があります)。

Defining a Hierarchy of Configuration Values Using the TreeBuilder

All the rules concerning configuration values can be defined using the TreeBuilder.

構成値に関するすべてのルールは、TreeBuilder を使用して定義できます。

A TreeBuilder instance should be returned from a custom Configuration class which implements the ConfigurationInterface:

TreeBuilder インスタンスは、ConfigurationInterface を実装するカスタム Configuration クラスから返される必要があります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace Acme\DatabaseConfiguration;

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

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

        // ... add node definitions to the root of the tree
        // $treeBuilder->getRootNode()->...

        return $treeBuilder;
    }
}

Adding Node Definitions to the Tree

Variable Nodes

A tree contains node definitions which can be laid out in a semantic way. This means, using indentation and the fluent notation, it is possible to reflect the real structure of the configuration values:

ツリーには、セマンティックな方法でレイアウトできるノード定義が含まれています。つまり、インデントと流暢な表記法を使用して、構成値の実際の構造を反映することができます。
1
2
3
4
5
6
7
8
9
10
$rootNode
    ->children()
        ->booleanNode('auto_connect')
            ->defaultTrue()
        ->end()
        ->scalarNode('default_connection')
            ->defaultValue('default')
        ->end()
    ->end()
;

The root node itself is an array node, and has children, like the boolean node auto_connect and the scalar node default_connection. In general: after defining a node, a call to end() takes you one step up in the hierarchy.

ルート ノード自体は配列ノードであり、booleannode auto_connect やスカラー ノード default_connection などの子ノードがあります。一般に、ノードを定義した後、end() を呼び出すと、階層が 1 ステップ上がります。

Node Type

It is possible to validate the type of a provided value by using the appropriate node definition. Node types are available for:

適切なノード定義を使用して、提供された値のタイプを検証することができます。ノード タイプは次の場合に使用できます。
  • scalar (generic type that includes booleans, strings, integers, floats and null)
    スカラー (ブール値、文字列、整数、浮動小数点数、および null を含むジェネリック型)
  • boolean
    ブール値
  • integer
    整数
  • float
    浮く
  • enum (similar to scalar, but it only allows a finite set of values)
    列挙型 (スカラーに似ていますが、値の有限セットのみを許可します)
  • array
    配列
  • variable (no validation)
    変数 (検証なし)

and are created with node($name, $type) or their associated shortcut xxxxNode($name) method.

node($name, $type) または関連する ShortcutxxxxNode($name) メソッドで作成されます。

Numeric Node Constraints

Numeric nodes (float and integer) provide two extra constraints - min() and max() - allowing to validate the value:

数値ノード (float と integer) は、値を検証できるように、min() と max() という 2 つの追加の制約を提供します。
1
2
3
4
5
6
7
8
9
10
11
12
13
$rootNode
    ->children()
        ->integerNode('positive_value')
            ->min(0)
        ->end()
        ->floatNode('big_value')
            ->max(5E45)
        ->end()
        ->integerNode('value_inside_a_range')
            ->min(-50)->max(50)
        ->end()
    ->end()
;

Enum Nodes

Enum nodes provide a constraint to match the given input against a set of values:

Enum ノードは、指定された入力を一連の値と照合するための制約を提供します。
1
2
3
4
5
6
7
$rootNode
    ->children()
        ->enumNode('delivery')
            ->values(['standard', 'expedited', 'priority'])
        ->end()
    ->end()
;

This will restrict the delivery options to be either standard, expedited or priority.

これにより、配送オプションが標準、速達、優先のいずれかに制限されます。

Array Nodes

It is possible to add a deeper level to the hierarchy, by adding an array node. The array node itself, may have a predefined set of variable nodes:

arraynode を追加することで、階層にさらに深いレベルを追加することができます。配列ノード自体は、定義済みの変数ノードのセットを持つ場合があります。
1
2
3
4
5
6
7
8
9
10
11
12
$rootNode
    ->children()
        ->arrayNode('connection')
            ->children()
                ->scalarNode('driver')->end()
                ->scalarNode('host')->end()
                ->scalarNode('username')->end()
                ->scalarNode('password')->end()
            ->end()
        ->end()
    ->end()
;

Or you may define a prototype for each node inside an array node:

または、配列ノード内の各ノードのプロトタイプを定義することもできます:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$rootNode
    ->children()
        ->arrayNode('connections')
            ->arrayPrototype()
                ->children()
                    ->scalarNode('driver')->end()
                    ->scalarNode('host')->end()
                    ->scalarNode('username')->end()
                    ->scalarNode('password')->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

A prototype can be used to add a definition which may be repeated many times inside the current node. According to the prototype definition in the example above, it is possible to have multiple connection arrays (containing a driver, host, etc.).

プロトタイプを使用して、現在のノード内で何度も繰り返すことができる定義を追加できます。上記の例のプロトタイプ定義によれば、複数の接続配列 (ドライバー、ホストなどを含む) を持つことができます。

Sometimes, to improve the user experience of your application or bundle, you may allow the use of a simple string or numeric value where an array value is required. Use the castToArray() helper to turn those variables into arrays:

場合によっては、アプリケーションまたはバンドルのユーザー エクスペリエンスを向上させるために、配列値が必要な場所で単純な文字列または数値の使用を許可することがあります。castToArray() ヘルパーを使用して、これらの変数を配列に変換します。
1
2
3
4
->arrayNode('hosts')
    ->beforeNormalization()->castToArray()->end()
    // ...
->end()

Array Node Options

Before defining the children of an array node, you can provide options like:

配列ノードの子を定義する前に、次のようなオプションを指定できます。
useAttributeAsKey()
Provide the name of a child node, whose value should be used as the key in the resulting array. This method also defines the way config array keys are treated, as explained in the following example.
子ノードの名前を指定します。その値は、結果の配列でキーとして使用する必要があります。このメソッドは、次の例で説明するように、config 配列キーの処理方法も定義します。
requiresAtLeastOneElement()
There should be at least one element in the array (works only when isRequired() is also called).
配列には少なくとも 1 つの要素が必要です (isRequired() が呼び出された場合にのみ機能します)。
addDefaultsIfNotSet()
If any child nodes have default values, use them if explicit values haven't been provided.
子ノードにデフォルト値がある場合、明示的な値が指定されていない場合はそれらを使用します。
normalizeKeys(false)
If called (with false), keys with dashes are not normalized to underscores. It is recommended to use this with prototype nodes where the user will define a key-value map, to avoid an unnecessary transformation.
(false で) 呼び出された場合、ダッシュ付きのキーはアンダースコアに正規化されません。不必要な変換を避けるために、ユーザーがキーと値のマップを定義するプロトタイプ ノードでこれを使用することをお勧めします。
ignoreExtraKeys()
Allows extra config keys to be specified under an array without throwing an exception.
例外をスローすることなく、追加の構成キーを配列の下に指定できるようにします。

A basic prototyped array configuration can be defined as follows:

基本的なプロトタイプの配列構成は、次のように定義できます。
1
2
3
4
5
6
7
8
$node
    ->fixXmlConfig('driver')
    ->children()
        ->arrayNode('drivers')
            ->scalarPrototype()->end()
        ->end()
    ->end()
;

When using the following YAML configuration:

次の YAML 構成を使用する場合:
1
drivers: ['mysql', 'sqlite']

Or the following XML configuration:

または、次の XML 構成:
1
2
<driver>mysql</driver>
<driver>sqlite</driver>

The processed configuration is:

処理された構成は次のとおりです。
1
2
3
4
Array(
    [0] => 'mysql'
    [1] => 'sqlite'
)

A more complex example would be to define a prototyped array with children:

より複雑な例は、子を持つプロトタイプ配列を定義することです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$node
    ->fixXmlConfig('connection')
    ->children()
        ->arrayNode('connections')
            ->arrayPrototype()
                ->children()
                    ->scalarNode('table')->end()
                    ->scalarNode('user')->end()
                    ->scalarNode('password')->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

When using the following YAML configuration:

次の YAML 構成を使用する場合:
1
2
3
connections:
    - { table: symfony, user: root, password: ~ }
    - { table: foo, user: root, password: pa$$ }

Or the following XML configuration:

または、次の XML 構成:
1
2
<connection table="symfony" user="root" password="null"/>
<connection table="foo" user="root" password="pa$$"/>

The processed configuration is:

処理された構成は次のとおりです。
1
2
3
4
5
6
7
8
9
10
11
12
Array(
    [0] => Array(
        [table] => 'symfony'
        [user] => 'root'
        [password] => null
    )
    [1] => Array(
        [table] => 'foo'
        [user] => 'root'
        [password] => 'pa$$'
    )
)

The previous output matches the expected result. However, given the configuration tree, when using the following YAML configuration:

前の出力は、期待される結果と一致します。ただし、次の YAML 構成を使用する場合、構成ツリーが与えられます。
1
2
3
4
5
6
7
8
9
connections:
    sf_connection:
        table: symfony
        user: root
        password: ~
    default:
        table: foo
        user: root
        password: pa$$

The output configuration will be exactly the same as before. In other words, the sf_connection and default configuration keys are lost. The reason is that the Symfony Config component treats arrays as lists by default.

出力構成は以前とまったく同じになります。つまり、sf_connection とデフォルトの構成キーが失われます。その理由は、Symfony Config コンポーネントがデフォルトで配列をリストとして扱うためです。

Note

ノート

As of writing this, there is an inconsistency: if only one file provides the configuration in question, the keys (i.e. sf_connection and default) are not lost. But if more than one file provides the configuration, the keys are lost as described above.

これを書いている時点では、矛盾があります: 問題の構成を提供するファイルが 1 つだけの場合、キー (つまり、sf_connection と default) は失われません。ただし、複数のファイルが構成を提供する場合、上記のようにキーが失われます。

In order to maintain the array keys use the useAttributeAsKey() method:

配列キーを維持するには、useAttributeAsKey() メソッドを使用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$node
    ->fixXmlConfig('connection')
    ->children()
        ->arrayNode('connections')
            ->useAttributeAsKey('name')
            ->arrayPrototype()
                ->children()
                    ->scalarNode('table')->end()
                    ->scalarNode('user')->end()
                    ->scalarNode('password')->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

Note

ノート

In YAML, the 'name' argument of useAttributeAsKey() has a special meaning and refers to the key of the map (sf_connection and default in this example). If a child node was defined for the connections node with the key name, then that key of the map would be lost.

YAML では、useAttributeAsKey() の 'name' 引数は特別な意味を持ち、マップのキー (この例では sf_connection と default) を参照します。キー名を持つ接続ノードに子ノードが定義されている場合、マップのそのキーは失われます。

The argument of this method (name in the example above) defines the name of the attribute added to each XML node to differentiate them. Now you can use the same YAML configuration shown before or the following XML configuration:

このメソッドの引数 (上記の例では name) は、各 XML ノードを区別するために各 XML ノードに追加される属性の名前を定義します。これで、前に示したものと同じ YAML 構成または次の XML 構成を使用できます。
1
2
3
4
<connection name="sf_connection"
    table="symfony" user="root" password="null"/>
<connection name="default"
    table="foo" user="root" password="pa$$"/>

In both cases, the processed configuration maintains the sf_connection and default keys:

どちらの場合も、処理された構成は sf_connection および default キーを維持します。
1
2
3
4
5
6
7
8
9
10
11
12
Array(
    [sf_connection] => Array(
        [table] => 'symfony'
        [user] => 'root'
        [password] => null
    )
    [default] => Array(
        [table] => 'foo'
        [user] => 'root'
        [password] => 'pa$$'
    )
)

Default and Required Values

For all node types, it is possible to define default values and replacement values in case a node has a certain value:

すべてのノード タイプに対して、ノードに特定の値がある場合に備えて、デフォルト値と置換値を定義できます。
defaultValue()
Set a default value
デフォルト値を設定する
isRequired()
Must be defined (but may be empty)
定義する必要があります (ただし、空にすることもできます)
cannotBeEmpty()
May not contain an empty value
空の値を含めることはできません
default*()
(null, true, false), shortcut for defaultValue()
(null、true、false)、defaultValue() のショートカット
treat*Like()
(null, true, false), provide a replacement value in case the value is *.
(null、true、false)、値が * の場合に置換値を提供します。

The following example shows these methods in practice:

次の例は、実際のこれらの方法を示しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$rootNode
    ->children()
        ->arrayNode('connection')
            ->children()
                ->scalarNode('driver')
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
                ->scalarNode('host')
                    ->defaultValue('localhost')
                ->end()
                ->scalarNode('username')->end()
                ->scalarNode('password')->end()
                ->booleanNode('memory')
                    ->defaultFalse()
                ->end()
            ->end()
        ->end()
        ->arrayNode('settings')
            ->addDefaultsIfNotSet()
            ->children()
                ->scalarNode('name')
                    ->isRequired()
                    ->cannotBeEmpty()
                    ->defaultValue('value')
                ->end()
            ->end()
        ->end()
    ->end()
;

Deprecating the Option

You can deprecate options using the setDeprecated() method:

setDeprecated() メソッドを使用して、オプションを非推奨にすることができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$rootNode
    ->children()
        ->integerNode('old_option')
            // this outputs the following generic deprecation message:
            // Since acme/package 1.2: The child node "old_option" at path "..." is deprecated.
            ->setDeprecated('acme/package', '1.2')

            // you can also pass a custom deprecation message (%node% and %path% placeholders are available):
            ->setDeprecated(
                'acme/package',
                '1.2',
                'The "%node%" option is deprecated. Use "new_config_option" instead.'
            )
        ->end()
    ->end()
;

If you use the Web Debug Toolbar, these deprecation notices are shown when the configuration is rebuilt.

Web デバッグ ツールバーを使用する場合、構成が再構築されると、これらの廃止通知が表示されます。

Documenting the Option

All options can be documented using the info() method:

すべてのオプションは、info() メソッドを使用して文書化できます。
1
2
3
4
5
6
7
8
$rootNode
    ->children()
        ->integerNode('entries_per_page')
            ->info('This value is only used for the search results page.')
            ->defaultValue(25)
        ->end()
    ->end()
;

The info will be printed as a comment when dumping the configuration tree with the config:dump-reference command.

config:dump-reference コマンドを使用して構成ツリーをダンプすると、情報がコメントとして出力されます。

In YAML you may have:

YAML には、次のものがある場合があります。
1
2
# This value is only used for the search results page.
entries_per_page: 25

and in XML:

そしてXMLで:
1
2
<!-- entries-per-page: This value is only used for the search results page. -->
<config entries-per-page="25"/>

Optional Sections

If you have entire sections which are optional and can be enabled/disabled, you can take advantage of the shortcut canBeEnabled() and canBeDisabled() methods:

オプションで有効/無効にできるセクション全体がある場合は、ショートカットcanBeEnabled()およびcanBeDisabled()メソッドを利用できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$arrayNode
    ->canBeEnabled()
;

// is equivalent to

$arrayNode
    ->treatFalseLike(['enabled' => false])
    ->treatTrueLike(['enabled' => true])
    ->treatNullLike(['enabled' => true])
    ->children()
        ->booleanNode('enabled')
            ->defaultFalse()
;

The canBeDisabled() method looks about the same except that the section would be enabled by default.

canBeDisabled() メソッドは、セクションがデフォルトで有効になることを除いて、ほぼ同じように見えます。

Merging Options

Extra options concerning the merge process may be provided. For arrays:

マージ プロセスに関する追加のオプションが提供される場合があります。配列の場合:
performNoDeepMerging()
When the value is also defined in a second configuration array, don't try to merge an array, but overwrite it entirely
値が 2 番目の構成配列でも定義されている場合、配列をマージしようとせず、完全に上書きします

For all nodes:

すべてのノードの場合:
cannotBeOverwritten()
don't let other configuration arrays overwrite an existing value for this node
他の構成配列がこのノードの既存の値を上書きしないようにする

Appending Sections

If you have a complex configuration to validate, then the tree can grow to be large and you may want to split it up into sections. You can do this by making a section a separate node and then appending it into the main tree with append():

検証する構成が複雑な場合は、ツリーが大きくなる可能性があるため、ツリーをセクションに分割することをお勧めします。これを行うには、セクションを別のノードにしてから、append() を使用してメインツリーに追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public function getConfigTreeBuilder()
{
    $treeBuilder = new TreeBuilder('database');

    $treeBuilder->getRootNode()
        ->children()
            ->arrayNode('connection')
                ->children()
                    ->scalarNode('driver')
                        ->isRequired()
                        ->cannotBeEmpty()
                    ->end()
                    ->scalarNode('host')
                        ->defaultValue('localhost')
                    ->end()
                    ->scalarNode('username')->end()
                    ->scalarNode('password')->end()
                    ->booleanNode('memory')
                        ->defaultFalse()
                    ->end()
                ->end()
                ->append($this->addParametersNode())
            ->end()
        ->end()
    ;

    return $treeBuilder;
}

public function addParametersNode()
{
    $treeBuilder = new TreeBuilder('parameters');

    $node = $treeBuilder->getRootNode()
        ->isRequired()
        ->requiresAtLeastOneElement()
        ->useAttributeAsKey('name')
        ->arrayPrototype()
            ->children()
                ->scalarNode('value')->isRequired()->end()
            ->end()
        ->end()
    ;

    return $node;
}

This is also useful to help you avoid repeating yourself if you have sections of the config that are repeated in different places.

これは、構成のセクションが異なる場所で繰り返される場合に、繰り返しを避けるのにも役立ちます。

The example results in the following:

この例の結果は次のとおりです。
  • YAML
    YAML
  • XML
1
2
3
4
5
6
7
8
9
10
11
12
database:
    connection:
        driver:               ~ # Required
        host:                 localhost
        username:             ~
        password:             ~
        memory:               false
        parameters:           # Required

            # Prototype
            name:
                value:                ~ # Required

Normalization

When the config files are processed they are first normalized, then merged and finally the tree is used to validate the resulting array. The normalization process is used to remove some of the differences that result from different configuration formats, mainly the differences between YAML and XML.

構成ファイルが処理されると、最初に正規化され、次にマージされ、最後にツリーを使用して結果の配列が検証されます。正規化プロセスは、主に YAML と XML の違いなど、異なる構成形式から生じる違いの一部を取り除くために使用されます。

The separator used in keys is typically _ in YAML and - in XML. For example, auto_connect in YAML and auto-connect in XML. The normalization would make both of these auto_connect.

キーで使用される区切り記号は通常、YAML では _ で、XML では - です。たとえば、YAML では auto_connect で、XML では auto-connect です。正規化により、これらの両方が auto_connect になります。

Caution

注意

The target key will not be altered if it's mixed like foo-bar_moo or if it already exists.

ターゲット キーは、foo-bar_moo のように混在している場合や、既に存在する場合は変更されません。

Another difference between YAML and XML is in the way arrays of values may be represented. In YAML you may have:

YAML と XML のもう 1 つの違いは、値の配列を表す方法にあります。 YAML には、次のものがある場合があります。
1
2
twig:
    extensions: ['twig.extension.foo', 'twig.extension.bar']

and in XML:

そしてXMLで:
1
2
3
4
<twig:config>
    <twig:extension>twig.extension.foo</twig:extension>
    <twig:extension>twig.extension.bar</twig:extension>
</twig:config>

This difference can be removed in normalization by pluralizing the key used in XML. You can specify that you want a key to be pluralized in this way with fixXmlConfig():

この違いは、XML で使用されるキーを複数形にすることで、正規化で取り除くことができます。 fixXmlConfig() を使用して、この方法でキーを複数形にするように指定できます。
1
2
3
4
5
6
7
8
$rootNode
    ->fixXmlConfig('extension')
    ->children()
        ->arrayNode('extensions')
            ->scalarPrototype()->end()
        ->end()
    ->end()
;

If it is an irregular pluralization you can specify the plural to use as a second argument:

不規則な複数形の場合は、2 番目の引数として使用する複数形を指定できます。
1
2
3
4
5
6
7
8
$rootNode
    ->fixXmlConfig('child', 'children')
    ->children()
        ->arrayNode('children')
            // ...
        ->end()
    ->end()
;

As well as fixing this, fixXmlConfig() ensures that single XML elements are still turned into an array. So you may have:

これを修正するだけでなく、fixXmlConfig() は、単一の XML 要素が引き続き配列に変換されることを保証します。だからあなたは持っているかもしれません:
1
2
<connection>default</connection>
<connection>extra</connection>

and sometimes only:

そして時々だけ:
1
<connection>default</connection>

By default, connection would be an array in the first case and a string in the second, making it difficult to validate. You can ensure it is always an array with fixXmlConfig().

デフォルトでは、connection は最初のケースでは配列になり、2 番目のケースでは文字列になるため、検証が難しくなります。 fixXmlConfig() を使用して、常に配列であることを確認できます。

You can further control the normalization process if you need to. For example, you may want to allow a string to be set and used as a particular key or several keys to be set explicitly. So that, if everything apart from name is optional in this config:

必要に応じて、正規化プロセスをさらに制御できます。たとえば、文字列を設定して特定のキーとして使用したり、複数のキーを明示的に設定したりできます。そのため、この構成で name 以外のすべてがオプションの場合:
1
2
3
4
5
6
connection:
    name:     my_mysql_connection
    host:     localhost
    driver:   mysql
    username: user
    password: pass

you can allow the following as well:

以下も許可できます。
1
connection: my_mysql_connection

By changing a string value into an associative array with name as the key:

名前をキーとして文字列値を連想配列に変更する方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$rootNode
    ->children()
        ->arrayNode('connection')
            ->beforeNormalization()
                ->ifString()
                ->then(function ($v) { return ['name' => $v]; })
            ->end()
            ->children()
                ->scalarNode('name')->isRequired()->end()
                // ...
            ->end()
        ->end()
    ->end()
;

Validation Rules

More advanced validation rules can be provided using the ExprBuilder. This builder implements a fluent interface for a well-known control structure. The builder is used for adding advanced validation rules to node definitions, like:

ExprBuilder を使用して、より高度な検証ルールを提供できます。 Thisbuilder は、よく知られている制御構造の流暢なインターフェイスを実装します。このビルダーは、次のような高度な検証ルールをノード定義に追加するために使用されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$rootNode
    ->children()
        ->arrayNode('connection')
            ->children()
                ->scalarNode('driver')
                    ->isRequired()
                    ->validate()
                        ->ifNotInArray(['mysql', 'sqlite', 'mssql'])
                        ->thenInvalid('Invalid database driver %s')
                    ->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

A validation rule always has an "if" part. You can specify this part in the following ways:

入力規則には常に「if」部分があります。この部分は、次の方法で指定できます。
  • ifTrue()
    真であれば()
  • ifString()
    ifString()
  • ifNull()
    ifNull()
  • ifEmpty()
    ifEmpty()
  • ifArray()
    ifArray()
  • ifInArray()
    ifInArray()
  • ifNotInArray()
    ifNotInArray()
  • always()
    いつも()

A validation rule also requires a "then" part:

検証ルールには、「then」部分も必要です。
  • then()
    それから()
  • thenEmptyArray()
    thenEmptyArray()
  • thenInvalid()
    その後無効()
  • thenUnset()
    その後Unset()

Usually, "then" is a closure. Its return value will be used as a new value for the node, instead of the node's original value.

通常、「then」はクロージャです。その戻り値は、ノードの元の値ではなく、ノードの新しい値として使用されます。

Configuring the Node Path Separator

Consider the following config builder example:

次の構成ビルダーの例を検討してください。
1
2
3
4
5
6
7
8
9
10
11
$treeBuilder = new TreeBuilder('database');

$treeBuilder->getRootNode()
    ->children()
        ->arrayNode('connection')
            ->children()
                ->scalarNode('driver')->end()
            ->end()
        ->end()
    ->end()
;

By default, the hierarchy of nodes in a config path is defined with a dot character (.):

デフォルトでは、構成パス内のノードの階層はドット文字 (.) で定義されます。
1
2
3
4
5
6
7
// ...

$node = $treeBuilder->buildTree();
$children = $node->getChildren();
$childChildren = $children['connection']->getChildren();
$path = $childChildren['driver']->getPath();
// $path = 'database.connection.driver'

Use the setPathSeparator() method on the config builder to change the path separator:

構成ビルダーで setPathSeparator() メソッドを使用して、パスセパレーターを変更します。
1
2
3
4
5
6
7
8
// ...

$treeBuilder->setPathSeparator('/');
$node = $treeBuilder->buildTree();
$children = $node->getChildren();
$childChildren = $children['connection']->getChildren();
$path = $childChildren['driver']->getPath();
// $path = 'database/connection/driver'

Processing Configuration Values

The Processor uses the tree as it was built using the TreeBuilder to process multiple arrays of configuration values that should be merged. If any value is not of the expected type, is mandatory and yet undefined, or could not be validated in some other way, an exception will be thrown. Otherwise the result is a clean array of configuration values:

プロセッサは、TreeBuilder を使用して構築されたツリーを使用して、マージする必要がある構成値の複数の配列を処理します。いずれかの値が予期されたタイプではない場合、必須でありながら未定義である場合、または他の方法で検証できなかった場合、例外がスローされます。それ以外の場合、結果は構成値のクリーンな配列になります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Acme\DatabaseConfiguration;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Yaml\Yaml;

$config = Yaml::parse(
    file_get_contents(__DIR__.'/src/Matthias/config/config.yaml')
);
$extraConfig = Yaml::parse(
    file_get_contents(__DIR__.'/src/Matthias/config/config_extra.yaml')
);

$configs = [$config, $extraConfig];

$processor = new Processor();
$databaseConfiguration = new DatabaseConfiguration();
$processedConfiguration = $processor->processConfiguration(
    $databaseConfiguration,
    $configs
);