Zend FrameworkでどのようにSmartyを組み込むか
先日作ったZend Frameworkウェブアプリだが、実は気になっている部分が一つ。Smartyの使い方というか配置だ。Zend Frameworkのマニュアルには、Smartyを組み込むためのViewスクリプトだけが紹介してある(参照)。しかし、これは単なるスクリプトであって、実際の組み込み方はどこにも書いてない。厳密に言うと、組み込むのはrequireしてオブジェクト生成だが、フレームワーク内での教科書的な組み込み方に関する記述がないのだ。
とりあえず、自分ではZend_Controller_Actionを継承したbaseControllerを作成し、その中でpreDispatchメソッドを定義して、以下のように書いておいた。テンプレートの配置場所とかキャッシュ生成場所とかもルールにのっとって配置するようにした(その他設定はお好み次第で)。
public function preDispatch()
{
$controllerName = ucfirst($this->getRequest()->getControllerName());
$viewDir = dirname(__FILE__).’/../views';
$templates_dir = $viewDir.’/scripts/’.$controllerName;
$extraParams = array();
$extraParams[‘compile_dir’] = $templates_dir.’/templates_c';
$extraParams[‘plugins_dir’] = array(‘plugins’,$viewDir.’/plugins’);
$extraParams[‘left_delimiter’] = ‘<{';
$extraParams[‘right_delimiter’] = ‘}>';
$this->view = new Private_View_Smarty($templates_dir<$extraParams);
$this->view->getEngine()->load_filter(‘pre'<‘convert_encoding’);
}
ただコレだけだと実はNG。例えばVIEWの必要がないアクションを用意した場合、これを組み込んだ基底クラスを継承すると問題が起きる。このメソッドの定義上、該当するテンプレートディレクトリやキャッシュディレクトリが存在しないとおかしなことになるわけだ。
そう考えると、いろいろなエラー制御も含めて、コード自体も設置方法自体も検討しなくてはいけない。悩ましい。
どうせなら、本当に教科書的なものを用意してくれればよかったのにね。