Merge Yii2覆盖嵌套的配置参数

Merge Yii2覆盖嵌套的配置参数,merge,yii2,config,Merge,Yii2,Config,我以以下方式合并我的配置: $config = \yii\helpers\ArrayHelper::merge( (require (__DIR__ . '/../config/web.php')), (require __DIR__ . '/../config/overrides/web.php') ); 下面是config/web.php $config = [ 'components' => [ 'log' => [

我以以下方式合并我的配置:

$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' => ['system@host.com'],
                        'to' => ['support@host.com'],
                        'subject' => 'Message parsing failure',
                    ],
                ],
            ],
        ],
        //....some more components
    ]
];
$config = [
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [],
        ],
    ]
];
下面是我尝试应用的覆盖config/overrides/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' => ['system@host.com'],
                        'to' => ['support@host.com'],
                        'subject' => 'Message parsing failure',
                    ],
                ],
            ],
        ],
        //....some more components
    ]
];
$config = [
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [],
        ],
    ]
];
所以,我的目标是禁用本地配置中的日志记录。
当然,它不起作用,因为array\u merge的行为是不同的,没有任何内容会被覆盖。

如果希望ArrayHelper覆盖某些内容,则它不能在两个数组中都是数组。因此,例如,如果希望ArrayHelper覆盖某些内容,则可以将
'targets'=>[]
更改为
'targets'=>null
,因为它不能同时作为两个数组中的数组。例如,您可以从以下位置将
'targets'=>[]
更改为
'targets'=>null

如果两个数组都具有数组类型的元素并且具有相同的键,则将执行递归合并。[…]您可以使用
yii\helpers\UnsetArrayValue
对象从以前的数组中取消设置值,或
yii\helpers\replaceArayValue
强制替换以前的值,而不是递归合并

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

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

如果两个数组都具有数组类型的元素并且具有相同的键,则将执行递归合并。[…]您可以使用
yii\helpers\UnsetArrayValue
对象从以前的数组中取消设置值,或
yii\helpers\replaceArayValue
强制替换以前的值,而不是递归合并

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

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

它不起作用,因为这种合并的结果将完全覆盖所有组件,只剩下组件['log']。是的,它将覆盖所有组件,因为默认的
array\u merge
将只合并数组的第一级。如果希望ArrayHelper重写某些内容,则它不能同时是两个数组中的数组。例如,您可以将最后一条语句的
'targets'=>[]
更改为
'targets'=>null
+1。第一部分不正确,应删除,因为第一个数组在
组件
数组中有其他元素。如果设置targets=null,则当目标将由记录器在预期为数组的位置进行处理时,将出现错误。它不起作用,因为这种合并的结果将完全覆盖所有组件,只剩下组件['log']。是的,它将覆盖所有组件,因为默认的
array\u merge
将只合并数组的第一级。如果希望ArrayHelper重写某些内容,则它不能同时是两个数组中的数组。例如,您可以将最后一条语句的
'targets'=>[]
更改为
'targets'=>null
+1。第一部分不正确,应删除,因为第一个数组在
组件
数组中有其他元素。如果设置targets=null,则当记录器处理预期为数组的目标时,将发生错误。