PHP

LaravelのBladeテンプレートで変数の展開をする(バージョン4と5の違い)

何気なく Blade ファイルを触っていたら、Laravel のバージョン 4.2 と 5.1 で定義の仕方や挙動が変わっていることに気付きました。

変数の中身のエスケープ

確か、変数をエスケープするのは中括弧が 3 つだったよなって思っていたのですが、それは 4.2 の時の話で 5.1(5.0から変わったと思われる)では中括弧 2 つでエスケープされます。

バージョン 5.1 で中括弧 2 つの場合、Laravel のフレームワークの中で htmlentities() が実行されて、XSS(クロスサイトスクリプティング)を防いでくれる作りになっています。例えば、以下のような変数が定義されていたとします。

少し話が脱線しますが、ララベルと聞いて、「魔法少女ララベル」を思い出したのですが、魔法の呪文は「ララベル ララベル ルルルル♪」ではなく、「ラミパス ラミパス ルルルル♪」でした。

しかも、それは「ひみつのアッコちゃん」のようです。もう昔のことなんてハッキリ覚えていないものですね。

Laravel5.1のBladeの挙動

Laravel5.1 で以下のように Blade に定義してみます。

前者の方は、html のタグがエスケープされて、そのまま画面にタグの文字列が出力されます。後者の方は、html のタグがエスケープされないので、html としてタグが出力されます。

なので、通常は中括弧 2 つのものを使っておけば事足りるかと思います。

間違って html タグが入った変数を出力してしまっても安心です。

Laravel4.2のBladeの挙動

Laravel4.2 で以下のように Blade に定義してみます。

前者の方は、html のタグがエスケープされて、そのまま画面にタグの文字列が出力されます。

後者の方は、html のタグがエスケープされないので、html としてタグが出力されます。

5.1 とできることは同じなのですが、中括弧 2 つでエスケープされないので、バージョン違いのプロジェクトから安易にコピペしたりするとミスを招きます。

その他の構文と公式ドキュメント

バージョン 5 の方が、タグが明確になってわかりやすくなった気がしますね。その他、よく使うものとして、Blade 内のコメントや条件文などがあります。

また、Blade テンプレートについての公式ドキュメントは以下にあります。

Laravel 5.1 テンプレート

Laravel 4.2 テンプレート