LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

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)しないと再度コンパイルされないようなので、何故か変わらない、と思った時は注意です。

参考