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にアクセス Laravel画面出力例

パラメータ名と引数の名称が異なっている例

Route::get("/hello/{name}/{comment}", function ($comment, $name) {
    print("<h1>Laravel " . $name . ", " . $comment . ".</h1>");
    return null;
});
  • ブラウザでhttp://localhost/laravel-prj/public/hello/Japan/beautifulにアクセス Laravel画面出力例

パラメータを任意にする

設定が任意のパラメータはパラメータ名の最後に?を付けます。
そして、関数定義で引数のデフォルト値を定義します。

ルーティング
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で指定したパラメータ名(連想配列のキー)とルーティングで指定したパラメータ名など、フレームワークが自動で割り当ててくれる分、しっかり理解しておかないとハマってしまいます。

パラメータ名の割り当て順序

  1. Blade側で指定したキーと一致するパラメータ名があれば順序に関係なく、そのパラメータに割り当てる
  2. 残ったキーとパラメータで前から順番に割り当てる
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) {
    }
}

ルーティングに変数を記述している場合

Blade
<?= action('SampleController@show', ['id' => 1]); ?>
ルーティング
Route::get("/show/{myid}", "SampleController@show");

上記の場合、コントローラでは$request->myidで参照します。

ルーティングに変数を記述していない場合

この方法であれば、action()でパラメータがルーティングと一致しないエラーは発生しません。

Blade
<?= 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/へリダイレクトされます。

このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です