2017-01-26 2 views
0

Я объединить свои конфиги таким образом:Yii2 переопределить вложенные параметры конфигурации

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

Вот конфиг/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 отличается и ничего не отменяется.

ответ

2

От docs:

Рекурсивного сращивание будет проводиться, если оба массив имеет элемент типа массива и имеющие один и тот же ключ. [...] Вы можете использовать объект yii\helpers\UnsetArrayValue для отмены значения из предыдущего массива или yii\helpers\ReplaceArrayValue, чтобы принудительно заменить прежнее значение вместо рекурсивного слияния.

Таким образом, ваш второй массив должен быть

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

Это работает отлично! –

0

Если вы хотите, чтобы ArrayHelper переопределил что-то, он не может быть массивом в обоих массивах. Так, например, вы можете изменить 'targets' => [] к 'targets' => null

+1

Это не будет работать, потому что результат такого объединения будет в общей сложности подмена всех компонентов, что только компоненты [ «журнал»] остаетс. –

+1

Да, он будет переопределять все компоненты, потому что по умолчанию 'array_merge' объединит только первый уровень массива. Если вы хотите, чтобы ArrayHelper переопределил что-то, он не может быть массивом в обоих массивах. Так, например, вы можете изменить «цели» => [] 'на' 'цели' => null' – sztyvny

+1

+1 Для последнего утверждения. Первая часть неверна и должна быть удалена, поскольку первый массив имеет другие элементы в массиве 'components'. – topher

Смежные вопросы