CakePHP 3でSmartyを簡単に導入できるプラグインを作った

2017-10-06

タイトルのとおり、CakePHP 3でSmartyを簡単に導入するために、CakePHP 3用のプラグインを作成し、MITライセンスで公開しました。

「今時Smartyかよ!」というツッコミは、ここでは無しにしていただきたい。エンジニアの皆さんならわかると思いますが、こういうものは様々な事情で、致し方なく導入することがあるのです。私もできることならSmartyなんぞ使いたくないというのが本音のところ。

余談はさておき、インターネットでCakePHP 3系にSmartyを導入する方法を探してみると、これまた2017年だというのにも関わらず、Composerを使わずに、やれSmarty本体を公式サイトからダウンロードして配置しろだの、やれSmartyViewクラスを自分で作成しろだのという手順ばかり見つかります。なので、この際コマンドでちょちょいと入れられる方法を作っておこうと思った次第です。

GitHub

「Smarty plugin for CakePHP」ということで、GitHub(node-link/cakephp-smarty)にて公開・配布しています。

とりあえずですごーく適当に作っているので、何かバグや改良点等ありましたら、GitHubの方にIssueかPull requestお願いします。特に、英語が苦手なんでREADME.mdの英語を添削してくれると嬉しかったり……。

個人的に利用する機会はまだありそうなので、メンテナンスはしていくつもりです。

インストール

GitHubのREADME.mdにも利用方法が書いてありますが、一応こちらにも日本語で利用方法記述しておきます。

Composerを使い、以下のようにプラグイン本体をインストールします。

composer require node-link/cakephp-smarty

以下のようにbin/cakeコマンドを使い、プラグインをロードするようにします。

bin/cake plugin load NodeLink/Smarty

もしくは、config/bootstrap.phpへ下記の記述を追加し、手動でプラグインをロードしてください。

<?php
use Cake\Core\Plugin;

Plugin::load('NodeLink/Smarty');

最後に、AppController.phpでプラグインのViewクラスを利用するよう指定すれば完了です。

<?php
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Event\Event;

class AppController extends Controller
{
    public function beforeRender(Event $event)
    {
        $this->viewBuilder()->setClassName('NodeLink/Smarty.App');

        // CakePHP 3.4.0 より前
        $this->viewBuilder()->className('NodeLink/Smarty.App');
    }
}

Smartyの設定

Smartyの各種設定値はconfig/app.phpを読み込むようになっています。以下の記述を追記することにより、Smartyの設定を変更することができます。

<?php
return [
    // …その他の設定

    // 以下を追記
    'Smarty' => [
        'debugging' => true,                            // Default: Configure::read('debug')
        'auto_literal' => true,                         // Default: true
        'escape_html' => true,                          // Default: false
        'left_delimiter' => '<!--{',                    // Default: '{'
        'right_delimiter' => '}-->',                    // Default: '}'
        'error_reporting' => E_ALL & ~E_NOTICE,         // Default: null
        'force_compile' => true,                        // Default: Configure::read('debug')
        'caching' => Smarty::CACHING_LIFETIME_CURRENT,  // Default: false
        'cache_lifetime' => 86400,                      // Default: 3600
        'compile_check' => true,                        // Default: true
        'compile_dir' => null,                          // Default: CACHE . 'views'
        'cache_dir' => null,                            // Default: CACHE . 'smarty'
        'config_dir' => null,                           // Default: CONFIG . 'smarty'
        'plugins_dir' => null,                          // Default: CONFIG . 'smarty' . DS . 'plugins'
        'template_dir' => null,                         // Default: APP . 'Template'
        'use_sub_dirs' => false,                        // Default: false
    ],
];

デフォルトで変数出力時にHTMLエスケープするように'escape_html'を設定したり、デリミタを別の文字列に変更したり、様々な設定変更が行えます。

Smartyの設定値ごとの挙動については、Smartyの公式マニュアルを参照ください。

未指定だったり、nullが設定されている項目は、デフォルトの値が使用されます。

デフォルトでは、Smartyのプラグインディレクトリはconfig/smarty/pluginsに設定されています。テンプレート関数プラグイン(function)や修飾子プラグイン(modifier)等のプラグインを配置したい場合は、config/smarty/pluginsへ配置してください。

Smartyの利用

プラグインを導入すると、src/Template内のコントローラーに対応したディレクトリの中の、.tpl拡張子を持ったファイルをSmartyのテンプレートファイルとして認識するようになります。.ctpでは認識しませんので注意してください。

また、.ctpと同様に$thisオブジェクトの参照は可能となっていますので、ヘルパーを利用する場合は、$this経由で利用してください。

まとめ

もし機会があれば、ぜひこのプラグインを利用してください。多くのレガシーコードを保守する人たちに、幸あれ。

あと、この記事はSmartyの利用を推奨するものではありません。今現在においては、Smartyを使うと縛りが多くなるため、多くの場合において不便になり、開発速度やパフォーマンスが低下することが考えられます。

今一度、本当にSmartyが必要なのかどうかを考え、その上でどうしてもSmartyを利用しなければならないという結論に至った場合に限り、このプラグインを服用してください。用法用量はお守りください。

筆者について

「もりやませーた」として活動している、フリーランスエンジニアです。1992年生まれ、神奈川県在住、既婚。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

PHP OSS