設定ファイル

symfonyの設定ファイル(app.yml, module.yml)に関して、多分symfony使ってる人の98%位は当然知ってるのかも知れないが、個人的に結構気付くまでに時間がかかった事がある。

例えば、testモジュールのmodule.ymlに次の様に記述する。

all:
    a: "1階層目"
    b:
        c: "2階層目"

すると当然、

var_dump(sfConfig::get('mod_test_a'));
var_dump(sfConfig::get('mod_test_b_c'));

は、

string '1階層目' (length=10)
string '2階層目' (length=10)

となる。つまり、アンダースコアを挟んで、"mod"、モジュール名、次いでymlに設定した配列のキーの、環境(prod/dev/all等)を除く部分を続けたものが設定名となる。で、ここまでやると、環境を除く3階層目以降についても"mod_test_d_e_f"...といった感じで、どこまでもアンダースコアを挟んで続いていくのだろう、と考えてしまうと思うのだが、そうはならない。

下記の様に設定すると、

all:
    d:
        e:
            f: "3階層目"
            g: "3階層目-2"
    h:
        i:
            j:
                k: "4階層目"
                l: "4階層目-2"

設定は下記の様に取得出来て、

var_dump(sfConfig::get('mod_test_d_e'));
var_dump(sfConfig::get('mod_test_h_i'));

こうなる。

array
  'f' => string '3階層目' (length=10)
  'g' => string '3階層目-2' (length=12)
array
  'j' => 
    array
      'k' => string '4階層目' (length=10)
      'l' => string '4階層目-2' (length=12)

つまり、3階層目以降では、通常yamlをパースした場合と同様、配列として設定値を取得出来る。(sfConfig::get('mod_test_d_e_f')などと取得すると、nullが返る。)

普段2階層目位までしか設定を記述する必要が無かった事もあって、最初これに全く気付かず、app.ymlやmodule.ymlでは配列を設定に記述出来ないものと思い込み、1階層目から配列として設定を取得するための独自設定ファイルとconfig_handlerを用意して対応していたが、設定ファイルが増えるだけで全く無駄だった。

それにしてもこれ、ドキュメントちゃんと読めば書いてあるのかも知れないが、適当に読み流してるとすぐには気付かないような気がする。さっきドキュメントの設定ファイルの部分をざっと眺め返してみたけど、やはり書いてないような。説明するほどの事でもない、って事なのだろうか?