【Laravel】 ルーティングとは?書き方などを初心者向けに徹底解説

Laravel

Laravelの基礎となる「ルーティング(routing)」について解説していきたいと思います。
この記事では、ルーティングの概念、基本的な使い方、開発の現場で使える実践的な方法を書いています。
Laravelでのアプリケーション開発において避けられない概念なので、仕組みをしっかり理解していきましょう。

こんな方におすすめです
  • ルーティングをこれから学びたい方
  • ルーティングをより習熟したい方
  • ルーティングの具体的な使い方を知りたい方

Laravelのルーティングとは

URLを特定のアクションやコントローラーにマッピングする仕組みです。
ルーティングを設定することで、ユーザーがアプリケーションにアクセスするためのURLを定義できます。

【Laravelのルーティングとは】
クライアント(フロントエンドなど)からのURLアクセスで、どのような処理を実行するか決めてくれる便利な仕組み

ルーティングの書き方

Laravelのすべてのルーティングは「/routes」ディレクトリにあるルートファイルで定義されています。
ルートファイルは「App\Providers\RouteServiceProvider」によって、自動的に読み込まれ適用されます。

今回は、アプリケーション開発において意識すべき
「api.php」「web.php」について解説していきます。

web.phpとは

Webアプリケーションのためのルートファイルであり、Laravelアプリケーションで最も一般的に使用されます。基本的なHTTPルートを定義するために使用されます。

基本的な使い方は2種類あります。

  • ビュー(画面)を呼び出す
  • コントローラークラスの特定のメソッドを呼び出す

ビュー(画面)を呼び出す

web.php

Route::get('path', クロージャ);

// 使用例
Route::get('/hello', function () {
    return view('helloWorld');
});

「/hello」にアクセス後、テンプレートの「resources/views/helloWorld.blade.php」をブラウザに表示処理を実行します。 クロージャの中のview関数は引数にテンプレート名を指定することでレンダリングされる仕組みになります。

コントローラークラスの特定のメソッドを呼び出す

web.php

Route::get('path', [コントローラークラス名::class, 'メソッド名']);

// 使用例
Route::get('/hello', [HelloController::class, 'index']);

Laravelのバージョンによって、記載方法が異なるので注意してください。
上記はLaravel8以降での書き方です。
※Laravel8以前では以下のように記載します。

Route::get('path', 'コントローラークラス名@メソッド名');

// 使用例
Route::get('/hello', 'HelloController@index']);

HelloController.php

class HelloController extends Controller
{
	public function index()
	{
	    return view('helloWorld');
	}
}

「/hello」にアクセス後、HelloControllerのindexメソッドを呼び出します。

そして、テンプレートの「resources/views/helloWorld.blade.php」をブラウザに表示処理を実行します。

api.phpとは

APIのためのルートファイル。 JSONやXMLなどのデータを返すAPIエンドポイントを定義するために使用されます。

基本的にはweb.phpのapi版と思ってもらえれば大丈夫です。

ここで定義したルートファイルは 「RouteServiceProvider」によってルートグループ内にネストされます。 このグループ内では「/api」URIプレフィックスが自動的に適用されるため、ファイル内のすべてのルートに手作業で適用する必要はありません。

そのため、以下の場合だと 「・・・/api/hello」のアクセスで実行されます。

Route::get('/hello', [HelloController::class, 'index']);

ルーティングHTTPメソッドについて

これまで「Route::get」とgetメソッドで解説してきましたが、 ルーティングにおけるHTTPメソッドは、以下種類があります。

Route::get('path', [コントローラークラス名::class, 'メソッド名']);
Route::post('path', [コントローラークラス名::class, 'メソッド名']);
Route::put('path', [コントローラークラス名::class, 'メソッド名']);
Route::delete('path', [コントローラークラス名::class, 'メソッド名']);
Route::patch('path', [コントローラークラス名::class, 'メソッド名']);
Route::options('path', [コントローラークラス名::class, 'メソッド名']);

同様のpathでも、HTTPメソッドが異なれば、正常にルーティングが通ります。
基本的に使用されるのは「get」と「post」になります。

HTTPの「get」と「post」については以下が参考になるかと思います。https://blog.senseshare.jp/get-post-method.html

簡単にですが、
get:リクエストパラメータがURLに格納(目に見える形)
post:リクエストパラメータがbodyに格納(目に見えない形)

なので使い分けとしましては
リクエストパラメータが見えてもいい検索機能などは「get」
見せてはいけない登録・更新機能などは「post」で定義するのが一般的です。

実践でよく使うルーティング

groupルーティング

pathでグループ化

複数のルーティングの定義に対して、共通のpathを付与することができます。   
それによって可読性の向上が期待できます。

Route::prefix('path')->group(function () {/* ルート一覧 */});

// 使用例
Route::prefix('common')->group(function () {
	Route::get('/hello', [HelloController::class, 'index']);
	Route::get('/world', [HelloController::class, 'index']);
});

middlewareでグループ化

複数のルーティングの定義に対して、特定のmiddlewareを適用することができます。

Route::middleware([class名::class])->group(function () {/* ルート一覧 */});

// 使用例
Route::middleware([\\App\\Http\\Middleware\\Logger::class])->group(function () {
	Route::get('/hello', [HelloController::class, 'index']);
	Route::get('/world', [HelloController::class, 'index']);
});

【middlewareとは?
HTTPリクエストが送られたタイミングで実行される処理を定義できる機能です。
以下のように、コントローラーなどの処理が呼ばれる前に実行されます。

middlewareをグルーピングすることで、共通して複数のアクションで使用したい認証処理やロギング処理などに使用できます。

名前付きルート

ルートに名前をつけ、ビューやコントローラーで名前を指定して使用することができます。 名前をつけることで、URLを変更する際にも変更箇所を限定できるため、保守性の向上が期待できます。

Route::get('path', [コントローラークラス名::class, 'メソッド名'])->name('名前');

// 使用例
Route::get('/hello', [HelloController::class, 'index'])->name('hello');

ビューで使用する場合

<a href="{{ route('hello') }}"></a>

URLにパラメータ埋め込み

URLに動的な要素を含めることができます。これにより、同じURLの異なるバリエーションを処理することができます。例えば、ユーザーIDなどの動的な要素を含めることができます。

Route::get('path/{parameter}', [コントローラークラス名::class, 'メソッド名']);

// 使用例
Route::get('/users/{id}', [UserController::class, 'show']);

この例では、ユーザーIDを含むURLが渡された場合、UserControllerのshowメソッドが呼び出されます。
「/users/1」のようなURLでルーティングが正常に動作します。

また、以下のような複数パラメータでも同様アクセスすることが可能です。

Route::get('/users/{id}/name/{name}', [UserController::class, 'show']);

「/users/1/name/shohei」のようなURLでルーティングが正常に動作します。

Laravelのルーティング解説まとめ

ルーティングはLaravelでアプリケーションを構築するための
根幹になる仕組みだと思いますので、しっかり習熟する必要があります。

この記事が開発のための手助けになれば幸いです。
随時更新していきますので、よろしくお願いします。

良いLaravelライフを!