ZendFramework で Smarty を使うために一苦労したのでそのメモ。
アクションコントローラごとに Smarty を使うための何かをするのは嫌なので、最悪フロントコントローラごとでどうにかできないか、という方向で対応策を調べていきました(ちなみに、利用している ZendFramework は 2008/12/14 現在の最新安定板である 1.7.1 です)。
まず、なにかしらのテンプレートエンジンを組み込むためには、ZendFramework 用のインターフェースを実装してしまえば、対応させる事が可能になる事が分かりました。
53.3.2.2. Zend_View_Interface を使用したテンプレート(Zend_View_Smarty)
そして、『自動的にビューオブジェクトをコントローラに登録してくれる』ヘルパが用意されており、これはデフォルトの挙動である事が分かりました。
10.8.4.7. ViewRenderer
これで、やりたい事が簡単にできる事が分かりました。以下は、Smarty を利用するための記述を含んだフロントコントローラのソースです。ここで設定するものなのかよく分かっていませんが、とりあえず簡単に済ませるためにここにしておきました(ZF のドキュメントは必要な部分しか見てません)。
実は、これは、すごく不毛なデバッグ作業を経ての結果だったりします。というのも、当初、Zend_View_Smarty のコンストラクタや、setScriptPath メソッドを使って、Smarty の $tempmlate_dir を設定していたわけですが、どういうわけか "unable to read resource: " なエラーメッセージが出てしまいます。
あれこれとプリントデバッグで Smarty の処理を追いかけてみたところ、$template_dir がこちらで指定したものではないものになっていた事が分かりました。どこでそうなったかまでは調べてません。ZF 側の規約のようなものだと思ったので、素直に、そのパスにテンプレートを移動して対応しました。
標準のビューを使う限りは、コントローラディレクトリと同じ階層の "views/scripts/:controller/:action.phtml" がテンプレートパスになりますが、Smarty を使った場合は、scripts ディレクトリを抜かしたパス("views/:controller/:action.:suffix")になる様な感じらしいです。
さて、正直、Symfony なり CakePHP なり Ethna なりの既製品を使った方が簡単だった気がしています。ZF を使ってしまったせいか、無駄に自作もの(車輪)が増えている様な…。
んー、なんだか、Ruby 好きになってきた。自分の好み的に、読みやすいし書きやすい。というか、半年以上 Ruby メインで働いてきたせいで、Ruby でやれる事を PHP に求めてしまいますね。PHP でのやり方をさっぱり忘れています。
get_called_class って、5.3 からなんですかね。「これだっ!」って小躍りしたら、"(No version information available, might be only in CVS)" って…。
"php -a" でヒストリって使えないんですかね。readline の設定次第とかなのかな。
とまあ、久方ぶりの PHP に想像以上に苦戦している今日この頃です。

