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を利用しなければならないという結論に至った場合に限り、このプラグインを服用してください。用法用量はお守りください。