Dwoo を試してみた

PHP5 版 Smarty と言われる Dwoo を試してみた。
Dwoo には Framework Adapter として Zend Framework があるので*1それを使ってみた。


Dwoo をダウンロードして展開すると、dwoo/Dwoo/Dwoo/Adapters/ZendFramework/View に Zend_View_Abstract から継承したクラスがあるので、それを Zend_Controller_Action_Helper_ViewRenderer を使用して、Zend_Controller_Action_HelperBroker に追加する。

<?php
$options = array(
    'engine'   => array(
        'compileDir' => '/path/to/compileDir',
        'cacheDir' => '/path/to/cacheDir'
    ),
    'compiler' => array('autoEscape' =>true)
);

$view  = new Dwoo_Adapters_ZendFramework_View($options);
$view->getCompiler()->setDelimiters('{{', '}}');

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view)->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

ブートストラップとかで上記の様に設定する。
デリミタには{{ と }} を使用するようにし、オートエスケープするようにした。


コントローラでは Smarty を使用するのと同じように assign を呼ぶ。

<?php
public function listAction()
{
    // データを取得するロジック
    // $list にはデータベースからのデータが入ってるとする
    $this->view->assign('list', $list);
}

テンプレート

{{foreach $list val}}
    {{$val.hoge}}
    {{$val.fuga}}
    {{$val.foo}
    {{$val.bar}}
{{/foreach}}

Smarty のテンプレートをそのまま設置したらいけるかと思ったけど、foreach が Smarty の foreach と少し書き方が違う。
ここが少しはまった。


なおレイアウトを使用する場合は、レイアウトのテンプレートに以下の様に書けば良い。

{{layout()->content}}

こう呼べば、 Dwoo がコンパイル時に自動的にレイアウトを呼べる形に変換してくれる。


もとから Zend Framework に対応しているので、わざわざ自分で Zend_View_Abstract を継承して作る必要はなかった。
完全に Smarty と同じ書き方が出来るのかと期待したけど(つまり既存の Smarty テンプレートを修正なしで利用できる)、微妙に異なってるので、移行する場合は修正が必要かも。
良い点としては、 PHP5 で書かれているというのと、オートエスケープが何の修正もなく使える事*2が良かった。
あと Zend Framework だと Zend_View のヘルパも使えるみたい。
# CakePHP とかでもアダプターを使えば CakePHP のヘルパが使えるのかな?


速度はちゃんとベンチを計ってないので、後で計ってみる。