Phalcon PHPのテンプレートエンジンVoltのメモ
こんにちは、株式会社ライオンハートの鵜飼です。
引き続きPhalcon PHPの調査とPhalconを利用したプロジェクトの制作を進めています。
今回はPhalcon謹製のテンプレートエンジンVoltについてのメモです。
Voltについて
Python用のテンプレートエンジンであるJinjaの影響を受け、記法も似ているようです。
他のPHPのテンプレートでいうと、Twigも同様にJinjaの影響を受けているので、Twigを触ったことがあるかたであれば、すんなり触れると思います。
また、他のPhalconのコンポーネントも同様なのですが、Voltは単体でも動作することが出来るので、テンプレートエンジンはVoltを利用することでZephirの高速性にあやかる、みたいな事も出来るようです。
Voltの有効化
devtoolsのcreate-project
でプロジェクトを作成している場合は、既にapp/config/services.php
の中で有効化されていますが、下記のように記述することでVoltが使えるようになります。
<?php $di->setShared( 'view', function () { $view = new \Phalcon\Mvc\View(); $view->setViewsDir( '../app/views/' ); $view->registerEngines( array( '.volt' => 'Phalcon\Mvc\View\Engine\Volt' ) ); return $view; } );
フィルタの追加
Voltにはdate
メソッドは存在してるのですが、strtotime
メソッドは用意されていないので、コントローラ側やモデル側で変換しておく等ちょっと面倒な書き方をする必要があります。
そこで、strtotime
をフィルタに追加することで記述を簡略化することが可能です。
フィルタを追加するために、services.php
の記述を変更します。
<?php $di->setShared( 'view', function () { $view = new \Phalcon\Mvc\View(); $view->setViewsDir( '../app/views/' ); $view->registerEngines( array( '.volt' => function ($view, $di) { $volt = new VoltEngine($view, $di); // strtotimeのフィルタを追加 $volt->getCompiler()->addFilter('fl_strtotime', 'strtotime'); return $volt; } ) ); return $view; });
これでfl_strtotime
というフィルタ名でstrtotime
が実行できるようになりました。
{{ date( 'Y/n/d H:i:s', updated_at|fl_strtotime ) }}
関数の追加
フィルタとは別に関数としても追加することも可能です。
先ほどの例と同様に、strtotime
の関数を追加してみましょう。
<?php $di->setShared( 'view', function () { $view = new \Phalcon\Mvc\View(); $view->setViewsDir( '../app/views/' ); $view->registerEngines( array( '.volt' => function ($view, $di) { $volt = new VoltEngine($view, $di); // strtotimeのフィルタを追加 $volt->getCompiler()->addFunction('fx_strtotime', 'strtotime'); return $volt; } ) ); return $view; });
これで、fx_strtotime
という関数名で、strtotime
が呼ばれるようになります。
{{ date( 'Y/n/d H:i:s', fx_strtotime( updated_at ) ) }}
今回の例ではフィルタの方がスッキリ見えますが、使い方によって拡張をしていくと便利になりそうな気がしますね。
注意点
仕様なのかバグなのか判断に迷うところですが、テンプレートの継承やインクルードを利用した場合、継承先やインクルード先を変更しただけでは更新されません。
継承元やインクルード元のファイルも変更(更新日時を新しくするだけでもOK)しないと再度コンパイルされないようなので、何故か変わらない、と思った時は注意です。