2017-01-26 19 views
0

を上書きYii2:ここは、私がこのように私のconfigsをマージ、ネストされた設定パラメータ

$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と異なるため、何も上書きされないため、もちろん動作しません。

答えて

2

'targets' => []を変更することができます。両方の配列は、配列型の要素を持ち、同じキーがある場合

再帰マージが行われます。 [...] yii\helpers\UnsetArrayValueオブジェクトを使用すると、前の配列の値を設定解除するか、またはyii\helpers\ReplaceArrayValueを使用して、再帰的なマージの代わりに元の値を強制的に置き換えることができます。

、このようなマージの結果はコンポーネントのみが[「ログイン」]残っていることを、すべての成分の全最優先となりますので、だからあなたの二番目の配列は、

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

これは完璧に動作します! –

0

ArrayHelperに何かをオーバーライドさせたい場合は、両方の配列の配列にすることはできません。だから、例えば、あなたはdocsから'targets' => null

+1

この文句を言わない仕事でなければなりません。 –

+1

デフォルトの 'array_merge'は最初のレベルの配列だけをマージするので、すべてのコンポーネントをオーバーライドします。 ArrayHelperに何かをオーバーライドさせたい場合は、両方の配列の配列にすることはできません。たとえば、 '' targets '=> [] 'を' 'targets' => null'に変更することができます – sztyvny

+1

+1最後のステートメントです。最初の部分は正しくないので、最初の配列に 'components'配列の他の要素があるので、削除する必要があります。 – topher

関連する問題