Smartyといえば、言うまでもなくPHPの中ではとても有名なテンプレートエンジンです。自分でも長い事使ってきたんだけども、使い方が分からなくて困るほど難しい事をしてこなかったせいか全然深いところまで調べてませんでした。
ところが、今日配列(というかデータオブジェクト)の中身を確認しようと思って(要するに変数をvar_dumpしたかっただけなんだけど)調べてたら、色々方法があるみたいなのでメモっておきます。
※PHP初心者向きの情報かもしれません。オレ今日知ったけど(…)
1)デバッギングコンソールを使う
Smartyにはもともとデバッグ用の仕組みが用意されています。
http://www.smarty.net/manual/ja/chapter.debugging.console.php
require_once 'Smarty.class.php'; $smarty = new Smarty; $smarty->debugging = true;
こんな感じで $debugging を有効にしておくと Smarty に assign された全ての変数を表示するでデバッキングコンソールが常に別ウィンドウで表示されるようになります。
特定のテンプレートだけで変数を確認したい場合は $debugging の代わりに、テンプレート変数{debug}を使用する事もできます。
この辺りは、下記ページに非常に丁寧にまとまっています。
・cl.pocari.org – Smarty を使った開発でデバッグを行う 4 つの方法
2)debug_print_var modifier を使う
これも、上で紹介したcl.pocari.orgさんのエントリーで知りましたが、まさにvar_dump(というかprint_rに近いのかな?)みたいな modifier があるみたいです(なぜかマニュアルにのってない…)。
{$hoge|@debug_print_var}
modifier なので変数の後ろに「|」パイプで繋げるだけでOK。
$hogeが配列の場合は「@」を付けないと配列の内部まで表示しないので注意が必要。
(「@」の件は、この辺を参考にするとよさそう)
3)PHP関数のvar_dumpを暗黙の修飾子として使う
環境にもよりますが、SmartyからでもPHP関数を使う事ができます。
全ての PHP 関数は暗黙で修飾子として使用する事ができます。
via: Smarty
{$hoge|@var_dump}
「@」を付けているのは配列をダンプするためで、debug_print_varの時と同じです。
このように、別になにも悩まずにいつものvar_dumpが使えるのですね。
ただ、この「暗黙の修飾子」がセキュリティ上の理由で禁止されているかもしれません。
・$securityがtrueになっている
・$security_settings の MODIFIER_FUNCS に関数が登録せれていない
また、var_dumpと同じ様に@var_export、@print_rなんかも使えますので出力形式のお好みに合わせて使う事ができます。
4){php}関数でvar_dumpを実行する
Smarty内でPHPコードが実行できる{php}関数というのがあるのですが、これを使えばそれこそPHPと同じようにvar_dumpできます。
(テンプレートにロジックを持ち込む事自体よろしくない事とされてますのであんまり良い方法ではありませんが…)
ただ、PHP側の変数を扱うにはちょっとしたコツが必要で、
{php} ブロック内の PHP 変数にアクセスするには、PHP の global キーワードを使う必要があります。
via: Smarty
ということなので、
{php} global $hoge; var_dump($hoge); {/php}
のように一旦global宣言する必要があります。
5)dump用のプラグインを使う
実際プラグインを作って自分好みのデバッグを行っている人もいるようです。
・ダンプ用Smartyプラグインで快適デバッグ – Lism.in * blog
何度も見るのですから見易い方がいいですよね。
preprint_rみたいにちゃんとPREタグで整形したり、
こだわりがある人は自作してみるものいいかもしれません。
カスタム関数の勉強にもなるし。
まとめ
邪魔じゃなければ{debug}で一通り変数だしちゃうのが手っ取り早いかも。
「暗黙の修飾子」でvar_dump使うのは環境によってはNGなので(まあデバッグするような開発環境だったら $security = false でいいと思うけど)、変数ごとにやるなら debug_print_var を使うかなぁ。
こんなに方法があってもしょうがないんだけど、まあ知識として持っておいても損はしないでしょ。