Laravelのbladeテンプレートはデータの表示に関しても便利な機能が多くあります。
今回はbladeテンプレートにおけるデータ展開について説明します。
目次
前提
ファイル構成
今回使用するファイルの構成は以下の通りです。
ファイル名 | 説明 |
---|---|
resources/views/layouts/main.blade.php | 親ビュー(レイアウトファイル) |
resources/views/expansion/data_expansion.blade.php | 子ビュー(コンテンツファイル) |
routes/web.php | ルーティングファイル |
ルーティング
ルーティングは以下の通りです。
Route::get('/data_expansion', function () { return view('expansion.data_expansion'); });
変数展開
表示
{{}}を使用すると、変数の内容を表示します。
@extends('layouts.main') @php $value = 'アイウエオ'; @endphp @section('content') {{-- 変数展開します。 --}} <p style="color:#008080">{{$value}}</p> @endsection
クロスサイトスクリプティング(XSS)への対応
自動的にphpのhtmlspecialcharsが使用され変数の内容を表示します。
クロスサイトスクリプティング(XSS)については、クロスサイトスクリプティングを根絶しよう 【説明編】 を参照して下さい。
エンコードなし
先ほどの説明にもありましたが、LaravelのBladeテンプレートはXSSに対応しています。その為、{{ }} で値を表示する場合、Java Scriptのソースコードはエンコードされ、無効化されてしまいます。
JavaScriptを使用したい(エンコードしたくない)場合、{!! !!} を使います。
JavaScriptのエンコードの例
以下の例は、ボタンを押すとアラートを表示します。
エンコードした場合、JavaScriotのソースコードが文字列として画面に表示されます。
@extends('layouts.main') @php $htmlValue = "<input type='button' value='click' onclick='sample()'>"; @endphp @section('content') {{-- 以下は、エスケープなし。 --}} {!!$htmlValue!!} {{-- 以下は、エスケープあり。 --}} {{$htmlValue}} <script> function sample(){ alert('アラート'); } </script> @endsection
実行結果
エンコードしない場合、ボタンが表示されます。
一方で、エンコードした場合JavaScriotのソースコードが文字列として画面に表示されます。
コメント
コメントを記載するには{{– コメント –}} を使います。
今までの例の中でコメントを使用しているので、そちらを参考にして下さい。
jsonエンコード
@jsonディレクティブを使用すると、Jsonエンコードします。
以下は、@jsonディレクティブを使用した例です。php関数のjson_encodeを使用した例も同時に記載しています。
結果は同じになります。
@extends('layouts.main') @php $arrayValue = [ 'data1' => 'さし', 'data2' => 'すせ', ]; @endphp @section('content') <script> var data = @json($arrayValue); console.log(data); var app = <?php echo json_encode($arrayValue); ?>; console.log(app); </script> @endsection
javascriptへデータを渡す
Javascriptへデータを渡す場合、{{}}を'(シングルクォート)で囲います。
@extends('layouts.main') @php $value = 'アイウエオ'; @endphp @section('content') <p id='test' style="color:#808000"></p> <script> var value = '{{$value}}'; document.getElementById("test").innerHTML = value; </script> @endsection
javascriptフレームワークへの対応
変数単位の対応
Vue.jsのようなjavascriptフレームワークでは、{{}}を使用します。
この場合、{{}}はbladeで変数展開したくないです。
@{{}}と記載すればbladeは{{}}の変数展開を行いません。
ディレクティブ単位の対応
@verbatimディレクティブを使用すると、@verbatimディレクティブ内の{{}}は変数展開されません。
Viewのキャッシュ
Viewはキャッシュされます。
LaravelはViewが呼び出されると、bladeファイルがphpへコンパイルされ、その結果をキャッシュとして保持します。
その為、毎回bladeファイルがphpへコンパイルされることはないので高速です。
キャッシュが変更されるタイミングはbladeファイルを更新し、viewを呼び出した時です。
Viewのキャッシュは storage/framework/views にあります。
画面が変わらない場合、キャッシュをクリアしましょう。
まとめ
特にありません。