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: 「-」が入ってるとダメな場合

symfonyYAMLの中に、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」位は許容してくれても良くね?とか思ってる。