設定ファイルやサンプルデータの作成に重宝しているYAMLファイルですが、YAMLファイルにはPHPのコードも書けます。app.ymlに定義されているフラグ値などをダミーデータとして使いたいなどに便利ですね。
flag: "<?php echo sfConfig::get('app_some_flag_var') ?>"
と書けます。
しかし、上のコードをよく見てみてください。< ?php と ?>タグ全体を”で囲っています。YAMLでは>は Folded scalar indicatorとして認識されてしまいますので、次の行も同じキーの値と認識されてしまいます。”をなしで書くには次のキーとの間に改行を入れないといけません。その他の指示子はyamlのリファレンスにも出ています。
symfony BookのYAMLの説明ではそのまま書けるような表記が出ていますが、1.0-beta2の時点ではダブルクオートで囲まないと期待するデータ構造としては認識してくれません。 symfonyのバグかと思いましたが、YAMLの仕様とぶつかっているためなので、”を使わずにそのまま書けるほうが便利なんですが、それが正解かどうかは判断つきかねますね。 ちなみに、YAMLのパースにはSpycを使っています。syckではどうなるかは試していませんので、試した奇特な方がいましたらご一報ください。
User:
user01:
email: sample@example.com
firstname: sample
password: "< ?php echo sha1('sample'); ?>"
status: "< ?php echo sfConfig::get('app_user_status_pending') ?>"
template_id: "< ?php echo sfConfig::get('app_template_default_id') ?>"
user02: email: sample2@example.com firstname: sample2 password: < ?php echo sha1('sample'); ?> status: < ?php echo sfConfig::get('app_user_status_pending') ?> template_id: < ?php echo sfConfig::get('app_template_default_id') ?> のようなファイルをパースしてprint_rすると以下のようになります。user01とuser02でpassword移行が違っているのが分かるでしょう。
Array ( [User] => Array ( [user01] => Array ( [email] => sample@example.com [firstname] => sample [password] => 8151325dcdbae9e0ff95f9f9658432dbedfdb209 [status] => [template_id] => 1 ) [user02] => Array ( [email] => sample2@example.com [firstname] => sample2 [password] => Array ( [8151325dcdbae9e0ff95f9f9658432dbedfdb209 status] => Array ( [template_id] => 1 ) ) ) )
上記yaml内で<と?phpが空いてしまっているのはこのブログの仕様のようで実際はつなげて書いています。
ともあれ、YAML内にPHPコードが書けるのは非常に便利なので上記の点に気をつけてみなさんお使いください。

