Laravel のルーティングについて
ルーティング情報は\{Laravelプロジェクト}\routes\web.php
に記述します。
ルーターメソッドの書式
よく使うルーターメソッドは以下のとおりです。第2引数の$callback
は無名関数だったり、コントローラのアクションメソッドだったりします。
このコールバック($callback
)で表示する画面の情報を指定します。
HTTPメソッド | 構文 |
---|---|
GET | Route::get($uri, $callback); |
POST | Route::post($uri, $callback); |
PUT | Route::put($uri, $callback); |
PATCH | Route::patch($uri, $callback); |
DELETE | Route::delete($uri, $callback); |
OPTIONS | Route::options($uri, $callback); |
全て | Route::any($uri, $callback); |
無名関数を使用
Route::get("/hello", function () {
// 処理.
});
コントローラを使用
コントローラクラス内の__invoke()
メソッドが使用されます。
Route::get("/hello", "コントローラクラス名");
コントローラのアクションを使用
コントローラクラス内の任意のアクションメソッドを実行したい場合。
Route::get("/hello", "コントローラクラス名@メソッド名");
パラメータについて
パラメータは$uri
に{パラメータ名}
で記述します。
関数の引数で受け取る
対応する無名関数やアクションメソッドにパラメータ数と同じ数の引数を用意します。パラメータ名と引数の名前は違っていても問題ありません(順番に割り当てられる)。ただし、数は一致しておく必要があります。
Route::get("/hello/{name}", function ($name) {
print("<h1>Laravel " . $name . ".</h1>");
return null;
});
- ブラウザでhttp://localhost/laravel-prj/public/hello/Japanにアクセス
パラメータ名と引数の名称が異なっている例
Route::get("/hello/{name}/{comment}", function ($comment, $name) {
print("<h1>Laravel " . $name . ", " . $comment . ".</h1>");
return null;
});
- ブラウザでhttp://localhost/laravel-prj/public/hello/Japan/beautifulにアクセス
パラメータを任意にする
設定が任意のパラメータはパラメータ名の最後に?
を付けます。
そして、関数定義で引数のデフォルト値を定義します。
Route::get("/show/{id?}", "SampleController@show");
public function show($id=0) {
}
これで/showでのアクセスでは$id
の値が0
になり、/show/1のアクセスでは$id
の値が1
になります。
?
を付けない場合、/show
と/show/{id}
のルーティングが必要です。/show
のルーティングが未定義だとパラメータなしでアクセスしたとき404 Not Foundになります。また、
/show/{id}
のルーティングが未定義だと$id
の値が常に0
(初期値)となるので注意してください。
ビューテンプレートとルーティングのパラメータ割り当てについて
Bladeで指定したパラメータ名(連想配列のキー)とルーティングで指定したパラメータ名など、フレームワークが自動で割り当ててくれる分、しっかり理解しておかないとハマってしまいます。
パラメータ名の割り当て順序
- Blade側で指定したキーと一致するパラメータ名があれば順序に関係なく、そのパラメータに割り当てる
- 残ったキーとパラメータで前から順番に割り当てる
<?= action('SampleController@list', ['pageNo' => $pageNo, 'id' => $id]); ?>
Route::get("/list/{id}/{page_no}", "SampleController@list");
上記の場合、{id}=id
、{page_no}=pageNo
となります。
action()
でURLを生成する際、ルーティングと一致しない場合(パラメータ不足)はaction()
でURLを生成している画面側でエラーとなります。(アクションメソッドが後述のRequestでパラメータを受け取る場合はエラーになりません)
Requestを使ったパラメータの受け取り
アクションメソッドの引数をRequest $request
とすると全てのパラメータを一括で取得できます。
パラメータは$request->パラメータ名
で参照します。パラメータ名はルーティングで指定した名前またはBladeで指定したキー名になります。
Request
の使用には、use Illuminate\Http\Request;
が必要です。use Illuminate\Http\Request;
class SampleController extends Controller {
public function show(Request $request) {
}
}
ルーティングに変数を記述している場合
<?= action('SampleController@show', ['id' => 1]); ?>
Route::get("/show/{myid}", "SampleController@show");
上記の場合、コントローラでは$request->myid
で参照します。
ルーティングに変数を記述していない場合
この方法であれば、action()
でパラメータがルーティングと一致しないエラーは発生しません。
<?= action('SampleController@show', ['id' => 1]); ?>
Route::any("/show", "SampleController@show");
上記の場合、コントローラでは$request->id
で参照します。
リダイレクト
ルーティングでリダイレクトを行う場合は以下のとおり。
Route::redirect("/yahoo", "https://www.yahoo.co.jp/");
上記では、http://localhost/laravel-prj/public/yahooにアクセスすると、https://www.yahoo.co.jp/へリダイレクトされます。