前回の記事(https://www.itd-blog.jp/entry/laravel-5)ではPHPテンプレートを紹介しました。 今回はもう一つのテンプレートであるBladeテンプレートについて解説していきます。
Bladeテンプレートとは
「Blade」とは、Laravelに用意されている独自のテンプレートエンジンです。
前回紹介したPHPテンプレートはわかりやすいのが長所ですが、単に値を表示するだけでも、
<?php echo 〇〇; ?>
と記述する必要があるため、煩雑になってしまう欠点があります。
また、PHPタグはHTMLタグと同じ形式のため、HTML作成ツールなどを使用するとタグの構成が崩れたりすることもあり、ページをいくつかに分割してまとめてレイアウトする機能などもありません。
Laravel独自に用意されている「Blade」テンプレートエンジンは、非常に効率的にレイアウトを作成していくための機能をもっています。
テンプレートを継承して新たなテンプレートを定義したり、レイアウトの一部をセクションとしてはめ込むなどしてレイアウトを作成していくことが可能です。
テンプレート作成
では実際にBladeテンプレートを利用してみましょう。
Bladeテンプレートも、PHPテンプレート度同様に「resources」フォルダ内の「view」フォルダ内に作成します。 「view」フォルダ内に作成した「hello」フォルダの中に、「index.blade.php」という名前でファイルを作成しましょう。これがBladeのテンプレートファイルとなります。 Bladeはこのように「○○.blade.php」という名前でファイルを作成します。 「index.blade.php」には以下のように記述しておきます。
[index.blade.php]
<html> <head> <title>Hello/Index</title> <style> p {font-size:24pt; text-align:center;} </style> </head> <body> <p>{{ $msg }}</p> </body> </html>
基本的な部分は普通のHTMLそのままとなっています。 \
タグの部分に、{{ $msg }}
という記述がありますが、これは変数$msgを埋め込んだものです。
Bladeでは{{ $変数 }}
というようにして、変数をテンプレートに埋め込むことができます。
アクションメソッドの修正
では続いてコントローラのアクションメソッドを修正しましょう。 indexアクションメソッドを、以下のように書き換えます。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index() { $data = [ 'msg' => 'Bladeテンプレートのサンプル', ]; return view('hello.index', $data); } }
これで完成です。 /helloにアクセスすると、index.blade.phpテンプレートを使用して画面が表示されます。
ところで、/helloにアクセスしたときにindex.blade.phpを使用して画面が表示されましたが、これはなぜでしょうか?Bladeテンプレートを読み込むといったような設定の変更などは行っていませんし、前回の記事で作成したindex.phpもそのままです。にも関わらず、view('hello.index'~)を実行すると、index.blade.phpを使用して画面が表示されました。 Laravelでは、Bladeテンプレートが存在する場合は優先的に読み込まれるようになっています。 index.phpとindex.blade.phpが存在する状況でテンプレート名を'index'と指定した場合、index.blade.phpが使用されます。index.blade.phpがない場合は、index.phpが使用されます。
フォームを利用する
基本的なWebページの表示ができるようになったので、次は「フォーム送信」を行ってみましょう。 フォームとは、ユーザからの入力を受けて処理をする際の基本となるものです。 まずはテンプレートの修正をします。 index.blade.phpの\
タグ部分を以下のように修正してください。[index.blade.php]
<html> <head> <title>Hello/Index</title> <style> p {font-size:24pt;} </style> </head> <body> <p>{{ $msg }}</p> <form method="POST" action="/hello"> @csrf <input type="text" name="msg"> <input type="submit"> </form> </body> </html>
ここでは、<form method="POST" action="/hello">
という形でフォームを用意してあります。
/helloにPOST送信された時の処理を用意すれば、そこで送信されたフォームを処理できるようになります。
CSRF対策について
ところで\