unoh.github.com

symfonyでよくあるトラブル

Mon Dec 03 04:06:18 -0800 2007

yukiです。

今回はsymfony+MySQLを使って開発していた際に遭遇したトラブルとその対処を紹介したいと思います。

(1) ビルドしたPropelクラスで、DATETIME値が'0000-00-00 00:00:00'の時

SQLとしては問題なくとも、getTimeStampで取得する際にエラーになります。
NULL値を使うのが一番なのですが、外部の設計だったりするなど今回は変更できない場合に該当しました。
symfony側でもtrac で認識はされていますが、Creole の問題として対処しないことになっているようですので、今度はCreoleのtrac を見てみると、対処されているのがわかり、freeze化していれば影響は該当サイトのみにとどまりますので、今回は自作パッチを当てて対処しました。
そのうちsymfony側で対応してくれることを期待しておきます。

(2) カラム名に予約語を使わない

これもありがちですが、カラム名に「count」などの予約語を使うと、自動生成されたPropelのBaseオブジェクトを利用しようとすると、オブジェクト定数として利用しているため二重宣言となり、FATALエラーとなります。(phpNameでエイリアスをつけても駄目)propel-build-modelコマンドは普通に通過しますので見落としますが、注意してください。

(3) redirect での引数の型が違う

これも若干はまりどころですが、redirectする際、'module/action'と文字列で'/'で区切って記述しますが、routingを利用して引数も渡したい場合、素直に書くと'foo/bar/variable'となります。
しかしこのように正直に書いても'variable'が絶ち落とされてしまいます。
この場合はどうするかというと、まずrouting.ymlで下記のように書いてあるものとして、

foo_bar_hoge:
  url:      /foo/bar/:hoge
  param:    { module: home, action: bar }

次に、redirectメソッドの引数は素直に書くのではなく、配列で渡します。

$this->redirect(array('module' => 'foo', 'action' => 'bar', 'hoge' => 'variable'));

これで正しくリダイレクトされ、引数も渡されます。

この様に若干ドキュメントに書いていないトラブルはあるものの、逆に書いていない部分で便利な機能があったりしますので(特にヘルパー)、ぜひ一度ソースを読んでみてはいかがでしょうか。