Laravelにおけるルーティングからビューにデータを渡すまでの基本的な実装パターンをまとめました。状況に応じて適切なパターンを使い分けましょう。
ルーティング
クロージャによるルーティングはいたって単純です。
Route::get('/', function () {
return view('welcome');
});
ルーティングにクロージャを使用すると、ルートキャッシュは動作しません。ルートキャッシュを使用するには、コントローラルートを定義します。
Route::get('/user', 'UserController@index');
ビュールート
ルートからビューを返すだけの場合は、Route::view
メソッドを使用します。このメソッドを使用しても、ルートキャッシュは動作するようです。
Route::view('/welcome', 'welcome');
ビューにデータを渡す
view
ヘルパ関数を使用して、データを配列でビューに渡せます。
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
with
メソッドでビューに渡すデータを個別に追加することもできます。
Route::get('/', function () {
return view('greeting')->with('name', 'Victoria');
});
ビュールートでデータを渡す
Route::view
メソッドでは、ビューへ渡すデータの配列を第3引数として指定します。
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
ここで、all
やget
のようなメソッドでモデルを取得して渡すのは避けるべきです。モデルはクロージャやコントローラの中で取得しないと、該当ルート以外のリクエストでも、routes/web.php
ファイルが読み込まれる毎にクエリが実行されてしまいます。また、場合によってはユニットテストでIlluminate\Database\QueryException
例外が投げられることがあります。
Route::view('/', 'welcome', ['categories' => Category::all()]);
1) Tests\Feature\ExampleTest::testBasicTest
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: categories (SQL: select * from "categories")
これはテスト実行時、マイグレーションが実行される前に、routes/web.php
ファイルが読み込まれることが原因です。
全ビュー間のデータ共有
アプリケーションの全ビューでデータを共有するには、View::share
メソッドを使います。
View::share('key', 'value');
通常、サービスプロバイダのboot
メソッド内で呼び出しますが、ここでもモデルを取得して渡していると、先ほどの例と同様にエラーの原因になります。
ビューコンポーザ
ビューコンポーザは、ビューがレンダーされる直前に呼び出されます。したがって、ビューにモデルを渡す場合にも使えます。
View::composer('welcome', function ($view) {
$categories = Category::all();
$view->with('categories', $categories);
});
ビューコンポーザを複数のビューに適用するには、View::composer
メソッドの最初の引数を配列で渡します。
View::composer(['welcome', 'home'], function ($view) {
//
});
composer
メソッドに渡しているビュー名には、ワイルドカードとして*
を使用することもできます。
View::composer('*', function ($view) {
//
});