symfony1.1 のYAMLパーサーが動かない件
前に、symfony1.0のYAMLパーサの動作について、チラッと書きましたが、故あってsymfony1.1を触ってるんですが、1.0ので動いていたYAMLファイルが1.1では、何故か旨くパース出来ないというF●●k!!な状態だったの忘れない内にメモッておこうと思う。
Q. そもそも1.0→1.1でなんでYAMLがパースできなくなったの?
A. それはね。YAMLパーサーが別ものになってて、どうやら若干挙動が違うらしいよ
symfony1.0系では、PHPの拡張モジュールで「syck」がインストールされてたらそっちrを優先的に使って、「syck」がなかったら、「Spyc」というライブラリを利用するようになっていたんだよ。
けどね。symfony1.1系では、コアのlib以下に「yaml」とかいうディレクトリがあってね。どうやらオリジナルのパーサを使ってるんだよ。
yaml/以下 sfYaml.class.php sfYamlDumper.class.php sfYamlInline.class.php sfYamlParser.class.php
Q. じゃあどんなケースでダメになるの?
A. こんなケースだよ。
- ケース1: コロン「:」の後ろにスペースがない場合
test:[1, 2, 3] ×コレダメ test: [1, 2, 3] ○コレおk!
- ケース2: なんていっていいか分からない?まぁ↓な場合
×コレダメ test: ~ class: testClass ○コレおk! test: class: testClass
原因は「~」ですね。分かります。これは流石に元々の書き方が悪い気もするけど、Spycでは動いてたので気づかずw
- ケース3: 「-」が入ってるとダメな場合
symfonyはYAMLの中に、PHPコードを書けるんですが、こんな風に書いてたら。。。
×コレダメ testdate: <?php echo date('Y-m-d') ?> #int(1229526000) ○コレおk! testdate: "<?php echo date('Y-m-d') ?>" #string(10) "2008-12-18" ○コレもおk! testdate: <?php echo date('Y/m/d') ?> #string(10) "2008/12/18"
これは一瞬、date関数の挙動がおかしいんじゃないかと思いましたが、どうやら原因は「-」記号なようです。。。。orz
Q. でそこんとこどうなん?
A. うーん。。YAML仕様上はもしかしたら、新しいパーサーの方が挙動的には正しいのかもしれませんが、「ケース1」位は許容してくれても良くね?とか思ってる。