Laravelのルーティング(Routing)のまとめ!

Laravel Laravel

Laravelでルーティングを書く方法について、書き方や概念などをまとめてみました。

Laravelのバージョン11で検証しました。
※後述していますが、Laravel7以前では書き方がちょっと違います。

Laravelのルーティングとは?

Laravelでルーティングは特定のURLにアクセスされたときに「どのような処理をするのか」といったことを定義します。

例えば、https://xxxといったサイトがあった場合を考えます。
https://xxx/loginにアクセスされた場合は、ログイン画面を表示するとします。

/loginにアクセスするときに行う処理を書く場合、下記のようにルーティングをroutes/web.phpに記載します。

Route::get('/login', function() {
  return view("login");
});

第1引数にURLを記載して、第2引数に行う処理を書きます。
今回はクロージャでビューを返すようにしましたが、下記のようにコントローラーを指定することもできます。

use App\Http\Controllers\LoginController;

Route::get('/login', [LoginController::class, 'index']);

コントローラーを指定して、カンマで区切ってメソッドを指定しました。
これで/loginにアクセスされると、LoginControllerのindexメソッドの処理をする」という意味になります。

このようにURLを指定したり、フォームからデータ送信する際に「処理先(ルート)」を決めるのがLaravelのルーティングです。

Laravelのルーティングには、2つのファイルが存在します。
1. Webサイトの画面からのアクセスを定義するファイル(routes/web.php)
2. Consoleコマンドの定義・スケジュールするファイル(routes/console.php)

通常はroutes/web.phpを使用して、Webブラウザからのアクセスを定義します。
routes/console.phpにはコマンドを定義したり、スケジュールすることができます。

api.phpは?

Laravel11から初期状態でroutes/api.phpがなくなりました。
SPA(シングルページアプリケーション)などで、APIを使いたい時には、下記のコマンドでAPIルートを追加することができます。

$ php artisan install:api

実行することで、laravel/sanctumのライブラリも追加されます。

ルーティングを書く

画面からのアクセスをルーティングする具体的な方法を確認します。

コントローラーへのルーティング

基本的なコントローラーへのルーティングは、下記のようになります。

Route::get('/test-welcome', [TestController::class, 'welcome']);

`https://xxx/test-welcome`にアクセスされると、`TestController`の`welcome`メソッドで処理されます。
下記のように、スラッシュ(‘/’)で定義して、階層を深くすることも可能です。

Route::get('/test/welcome', [TestController::class, 'welcome']);

第2引数は同じように書いています。
`https://xxx/test/welcome`にアクセスされると、同じように`TestController`の`welcome`メソッドが使われます。

クロージャーで処理を記載する

コントローラーで処理するほどのボリュームがない場合は、第2引数にクロージャーを書いて、定義することが可能です。
とりあえずモックを作成して、画面だけ表示しておきたい場合などに使うことがあります。

Route::get('/test/welcome', function() {
  return view("welcome");
});

`https://xxx/test-welcome`にアクセスされると、`welcome`ビューを表示します。

名前付きルーティング

名前付きルーティングは、作成したルートに名前をつけて使いやすくすることです。
例えば、先ほど定義したルートは、下記のようにnameメソッドを使用することができます。

Route::get('/test/welcome', [TestController::class, 'welcome'])->name('test.welcome');

このように定義することで、このルート名がtest.welcomeになります。
そして、routeヘルパーなどから簡単にルートが指定できます。

例えば、リダイレクトする場合は下記のように記述することができます。

return redirect()->route('test.welcome');

viewのフォームから送信する場合は、routeヘルパーを使用して下記のようにactionを定義することができます。

<form action="{{ route('test.welcome') }}" method="get">
<!-- フォームの内容 -->
</form>

nameメソッドを使って、名前をつけておくことにデメリットはありません。
ルートを作ったらとりあえず付けておくと良いです。

groupルーティング

ルーティングをグループ化することができます。
URLの階層が深くなる場合は、一括して定義することが可能です。

例えば、下記のように定義することができます。

Route::group(['prefix' => 'test'], function(){
    Route::get('hoge', function() {
        echo "hoge";
    });

    Route::get('fuga', function() {
        echo "fuga";
    });
});

Routegroupメソッドを使って、/test以下のURLを一括で定義しています。

これによって/test配下がまとめられます。
/test/hogeにアクセスすると、”hoge”が出力されます。
/test/fugaにアクセスすると、”fuga”が出力されます。

ここではURLをまとめる方法をご紹介しました。
他にもグループのURLに一括してミドルウェアを適用したり、名前付きルーティングを一括でまとめることもできます。

ルーティングのミドルウェアとは?

groupのルーティングでミドルウェアという言葉が出てきました。

LaravelのミドルウェアはURLにアクセスしたら、「処理をする前」や「処理をした後」に何らかの処理を挟むことができる機能です。

例えば「URLにアクセスしたら、ログを出力する」ような機能です。

それぞれのコントローラーでログを出力するよりも、一括して処理したほうが楽ですね。
このようにルートにアクセスしたときに、「共通した処理を行いたい」場合にミドルウェアを使います。

このミドルウェアをルートに適用することができます。
例えば、先ほどのログ出力機能がloggerという名前で作成されていた場合は、下記のようにミドルウェアを定義できます。

Route::group(['middleware' => Logger::class], function () {
    Route::get('/test/hoge', function() {
        echo "hoge";
    });

    Route::get('/test/fuga', function() {
        echo "fuga";
    });
});

/test/hoge/test/fuga、それぞれのルートにアクセスされたときにログが出るようになります。

ルーティングするときのHTTPのメソッド

これまでRoutegetメソッドで説明してきましたが、これは「HTTPでGETアクセスされるURL」を定義するときに使います。
他にもHTTPのリクエストメソッドによって、書き方が違うので確認しましょう。

GETメソッド

下記のように書くと、GETメソッドでアクセスできます。
URLを直接ブラウザに入れてアクセスする場合や、HTMLのaタグでリンクするときによく使います。

Route::get('/test/hoge', [TestController::class, 'hoge'])->name('test.hoge');

POSTメソッド

下記のように書くと、POSTメソッドでアクセスできます。

Route::post('/test/hoge', [TestController::class, 'hoge'])->name('test.hoge');

GETと同じ名前のルート(URL)でも、別メソッドなら一緒に定義することができます。
よく使われるのは、フォームから保存する値を送信するときです。

GETで送信すると、URLに出てきてしまうので、ユーザーに登録してもらう内容などはこちらを使用します。
気をつけないといけないのは、使用する場合はフォームに@csrfを入れておく必要があります。(csrf対策のため)

POSTするフォームは下記のように記載します。

<form action="{{ route('test.hoge') }}" method="POST">
    @csrf
    <!-- フォームの項目を記載 --->
    <input type="submit" value="submit" />
</form>

上記のように@csrfを忘れないようにしましょう。
このように定義しておくと、@csrfはフォームの中で下記のようにhidden項目として展開されます。

<input type="hidden" name="_token" value="nWAJhRxOzlNBJhVaEpMrHU7YtgQTgKka7Eh3TR9J">

この項目がない場合は、LaravelでPOSTするとエラーになるので、気を付けましょう。

PUTメソッド

PUTメソッドを使用するときは、このように書きます。

Route::put('/test/hoge', [TestController::class, 'hoge'])->name('test.hoge');

PUTメソッドは、登録されているデータを更新する場合に使用されます。
使用する場合は@csrfに加えて、メソッドの定義が必要です。

<form action="{{ route('test.hoge') }}" method="POST">
    @method("PUT")
    @csrf
    <!-- フォームの項目を記載 --->
    <input type="submit" value="submit" />
</form>

上記のように@methodを使ってメソッド定義が必要です。
これはHTMLのフォームがPUTメソッドに対応していないためです。

定義したメソッドは下記のようにHTMLで展開されます。

<input type="hidden" name="_method" value="PUT">

DELETEメソッド

DELETEメソッドを使う場合も、ルーティングでは下記のようにメソッドを変えるだけです。
DELETEメソッドは、データを削除する場合に使用されます。

Route::delete('/test/hoge', [TestController::class, 'hoge'])->name('test.hoge');

PUTと同様に@methodを使用して、メソッド定義が必要です。

<form action="{{ route('test.hoge') }}" method="POST">
    @method("DELETE")
    @csrf
    <!-- フォームの項目を記載 --->
    <input type="submit" value="submit" />
</form>

ルートにパラメータを含めるには?

作成したルートにパラメータを含める方法を確認します。

URLパラメータをひとつ渡す

URLにパラメータを含めるには下記のように記載します。

Route::get('/test/hoge/{id}', [TestController::class, 'hoge']);

アクセスするときには/test/hoge/1のようなURLからアクセスできます。
取得するコントローラー側で、このように取得します。

public function hoge(int $id) {
    echo "id is {$id}";
}

URLパラメータを複数渡す

複数定義したい場合は、下記のように渡すことが可能です。

Route::get('/test/hoge/{id}/name/{name}', [TestController::class, 'hoge']);

アクセスするときには/test/hoge/1/name/taroのようなURLからアクセスできます。
取得するコントローラーでは、引数を増やすと受け取れます。

public function hoge(int $id, string $name) {
    echo "id is {$id}<br>";
    echo "id is {$name}<br>";
}

APIルーティングについて

apiを使用したルーティングを定義する場合は、routes/api.phpに書きます。
routes/web.phpに書くのと同じように書けます。

上記で書いたように、別途コマンドでAPIルートを作ってSanctumを導入する必要があります。

Route::get('/hello', function () {
    return response()->json(['text' => 'hello, world']);
});

気をつけるところですが
上記のように書いた場合、標準のままだと/api/helloというように/apiから始まるURLになります。

Laravelのバージョン7以前での書き方

Laravelのバージョン8から、標準のルーティングの書き方が変わりました。
7以前では基本的な書き方として、処理先のコントローラーを指定するときは、下記のように書いていましたが…

Route::get('/test/welcome', 'TestController@welcome');

Laravel8から、このようにコントローラーとメソッドを分けて書くようになっています。

Route::get('/test/welcome', [TestController::class, 'welcome']);

コメント

タイトルとURLをコピーしました