Yii2 覆盖嵌套配置参数

问题描述 投票:0回答:2

我以这种方式合并我的配置:

$config = \yii\helpers\ArrayHelper::merge(
    (require (__DIR__ . '/../config/web.php')),
    (require __DIR__ . '/../config/overrides/web.php')
);

这是 config/web.php

$config = [
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
                [
                    'class' => 'yii\log\EmailTarget',
                    'levels' => ['info'],
                    'categories' => ['parsingFailure'],
                    'logVars' => [],
                    'message' => [
                        'from' => ['[email protected]'],
                        'to' => ['[email protected]'],
                        'subject' => 'Message parsing failure',
                    ],
                ],
            ],
        ],
        //....some more components
    ]
];

这是我尝试应用的覆盖config/overrides/web.php

$config = [
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [],
        ],
    ]
];

所以,我的目标是禁用本地配置中的日志记录。 当然它不起作用,因为 array_merge 的行为不同,并且没有任何内容被覆盖。

php merge configuration yii2
2个回答
5
投票

来自文档

如果两个数组都有数组类型的元素并且有相同的键,就会进行递归合并。 [...] 您可以使用

yii\helpers\UnsetArrayValue
对象取消先前数组中的值,或使用
yii\helpers\ReplaceArrayValue
强制替换以前的值,而不是递归合并。

所以你的第二个数组应该是

'targets' =>  new \yii\helpers\ReplaceArrayValue([]),

0
投票

如果您希望 ArrayHelper 覆盖某些内容,则它不能是两个数组中的数组。例如,您可以将

'targets' => []
更改为
'targets' => null

© www.soinside.com 2019 - 2024. All rights reserved.