Smarty5 呼び出し・設定のお作法

Smarty4系(Ver.4.3.4)から5系(Ver.5.3.1 / 2024年7月現在)にアップデートしたところ、クラスの呼び出し・設定のお作法が変わっておりましたので、ここにまとめておきます。

もっと細かい変更点があるかと思いますが、Smarty5系公式ドキュメント(英語)を読んでいただけると幸せになれるかもしれません。

namespace (名前空間)

Smarty5系では namespace (名前空間) が採用されました。

Smartyクラスを呼び出す際には名前解決が必要になります。

<エラー例> Smarty4系までの旧来の書き方ではエラー

$smarty = new Smarty();
// Fatal error: Uncaught Error: Class "Smarty" not found

<例1> use キーワードを使った名前解決

use Smarty\Smarty;
$smarty = new Smarty();

<例2> use キーワードを使わない名前解決

$smarty = new \Smarty\Smarty();

一部プロパティの属性が protected に変更

一部プロパティの属性が protected に変更され、Smarty4系までのように直接プロパティにアクセスすることができなくなりました。

各種設定用のメソッド(Smarty4系から実装)を使用します。

主要なメソッドは以下の通りです。

// テンプレートディレクトリ
$smarty->setTemplateDir('./template');

// コンパイルディレクトリ
$smarty->setCompileDir('./t_compile');

// キャッシュディレクトリ
$smarty->setCacheDir('./t_cache');

なお、従来通り直接アクセスして設定可能なプロパティもあるようです。

// キャッシュ設定
$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;

自動エスケープ処理

アサインした変数のデータを自動的にエスケープ処理する設定が追加されました。

// 自動エスケープ処理を有効にする。
$smarty->setEscapeHtml(true);

// この例ではHTMLタグ部分が適切にエスケープ処理される。
#smarty->assign('text', 'テキスト <div>要素</div>');

テンプレート側でエスケープ処理をする必要が無くなるので便利な機能だと思います。エスケープ忘れも無くなりますし。

ただし、この設定を有効にしてテンプレート側でエスケープ処理を行うと二重エスケープとなるので注意が必要です。

したがって既存のシステムでSmarty4系以前から5系にアップデートする場合はすぐに有効にしないほうがいいと思います。

// 自動エスケープを有効にして escape 修飾子を使うと二重エスケープ
{$text|escape}

参考サイト

スポンサードリンク