前回の記事でルーティングについて解説しました。 今回は画面の表示部分、ビューについて解説していきます。
ビューについて
ビューとは、Model-View-Controller(MVC)アーキテクチャにおいて、画面表示を担当する部分です。 Laravelではこの表示に関する部分を簡単にわかりやすく作れるように、テンプレートという部品が用意されています。
Laravelでは大きく2つのテンプレートが用いられています。 1つはPHPのソースコードをそのままテンプレートとして使用するものです。 もう1つがLaravelが独自に作成した「Blade」と呼ばれるテンプレートです。
PHPテンプレート
では実際にテンプレートを利用してみましょう。
まずはテンプレートファイルの作成です。 テンプレートファイルは、「resources」フォルダ内の「view」フォルダ内に作成します。 ここに「hello」ファルダを、その中に「index.php」という名前でファイルを作成しましょう。 「index.php」は以下のように記述しておきます。
[index.php]
<html> <head> <title>Hello/Index</title> <style> p {font-size:24pt; text-align:center;} </style> </head> <body> <p>サンプルページ</p> </body> </html>
ルート設定
作成したテンプレートを読み込んで表示してみます。 まずはルートを設定しましょう。 「web.php」に以下を記述します。
[web.php]
Route::get('hello', function() { return view('hello.index'); });
前回の記事で解説した通り、第1引数はURI、第2引数はクロージャとなっており、そこでviewメソッドを使用しています。
viewの引数は、view('フォルダ名 . ファイル名')
という形で記述します。
ではブラウザから/helloにアクセスしてみましょう。
用意した「index.php」のHTMLのソースコードが読み込まれ、画面に表示されます。
コントローラからの呼び出し
次に、コントローラからテンプレートを呼び出してみましょう。 まずはルート情報を下記のように修正します。
[web.php]
Route::get('hello', 'HelloController@index');
次にコントローラを作成します。
コンソールで下記コマンドを実行しましょう。
php artisan make:controller HelloController
これでコントローラが自動生成されます。 「HelloController.php」には以下のように記述します。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index() { return view('hello.index'); } }
これで修正は完了です。 ブラウザから/helloにアクセスすると、先ほどと同様に画面が表示されます。
やっていることは先ほどと同じで、Route::getからviewを呼び出すか、Route::getから呼び出されたアクションメソッドからviewを呼び出すかの違いです。
値をテンプレートに渡す
HTMLのソースコードをそのまま表示するだけでは、テンプレートをわざわざ使用する意味がありません。 テンプレートは必要な値を渡して表示したり、必要な処理を実行して結果を表示したりできるからこそ役に立ちます。 ということで、次は値の表示を行ってみましょう。
「index.php」を以下のように修正します。
[index.php]
<html> <head> <title>Hello/Index</title> <style> p {font-size:24pt; text-align:center;} </style> </head> <body> <p><?php echo $msg; ?></p> </body> </html>
今回はphpタグを使って、変数$msgを表示します。 それではコントローラから値を渡してみましょう。 「HelloController.php」のindexアクションメソッドを以下のように書き換えます。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index() { $data = ['msg' => 'コントローラから渡したメッセージ']; return view('hello.index', $data); } }
修正が終わったら、ブラウザから/helloにアクセスしてみましょう。
$msgの値がコントローラからテンプレートに渡され、表示されることが確認できました。
indexアクションのviewメソッドを呼び出しているところで、必要な値をテンプレートに渡しています。 view の呼び出しは、以下のように記述します。
return view(テンプレート, 配列);
第2引数に配列を渡します。この配列にセットした値が、テンプレートに変数として渡されます。 配列なので、必要な値をいくつでも渡して使用することが可能です。
ルートパラメータを渡す
前回解説したルートパラメータをviewに渡すこともできます。 実際にやってみましょう。
まずはテンプレートを修正します。 「index.php」を下記のように書き換えます。
[index.php]
<html> <head> <title>Hello/Index</title> <style> p {font-size:24pt; text-align:center;} </style> </head> <body> <p><?php echo $msg; ?></p> <p>ID = <?php echo $id; ?></p> </body> </html>
$idという変数を追加しました。 これをルートパラメータから渡していきます。
次にコントローラのアクションを修正します。 「HelloController.php」のindexメソッドを下記のように書き換えます。
[HelloController.php]
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function index($id) { $data = [ 'msg' => 'コントローラから渡したメッセージ', 'id' => $id ]; return view('hello.index', $data);; } }
引数に$idを追加して、viewに渡す配列に受け取った値を追加しています。
最後にルート情報を修正します。 「web.php」の/helloルートの情報を、下記のように書き換えます。
[web.php]
Route::get('hello/{id}', 'HelloController@index');
第1引数のアドレスに、{id}という形でルートパラメータを用意します。 この値がコントローラのindexアクションメソッドに引数として渡され、さらにそのままテンプレートに渡されて表示されることになります。
それでは、ブラウザから/helloの後に値を付けてアクセスしてみましょう。
ルートパラメータがちゃんと渡って、表示されることが確認できました。
次回はもう一つのテンプレート、Bladeテンプレートについて解説します。