ルーティング

記事の内容

概要

ルーティングは、HTTPリクエストを特定のコントローラやクロージャに結びつけます。

ルーティング設定を管理

【ファイル先】App\Providers\RouteServiceProvider

<?php

namespace App\Providers;

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * The path to your application's "home" route.
     *
     * Typically, users are redirected here after authentication.
     *
     * @var string
     */
    public const HOME = '/home';

    /**
     * Define your route model bindings, pattern filters, and other route configuration.
     */
    public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
}

リダイレクト先

public const HOME = '/home';

ユーザーが認証された後にリダイレクトされる「ホーム」ルートのパスを定義
この定数は認証後のリダイレクト先を統一して管理

初期化した後の動作

public function boot(): void

Laravelがすべてのサービスプロバイダを初期化した後に呼び出される

APIリクエストに対するレート制限

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});

APIリクエストの回数制限を設定
1分間に60回までリクエストが可能で、制限はユーザーIDまたはIPアドレスごとに適用

ルート定義

$this->routes(function () {
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));

    Route::middleware('web')
        ->group(base_path('routes/web.php'));
});

API用のルートを【routes/api.php】から読み込み、apiミドルウェアを適用
※/apiというプレフィックスを追加
ウェブ用のルートを【routes/web.php】から読み込み、webミドルウェアを適用

route指定

ウェブアプリケーション向けのルート(URLと処理の対応関係)を定義するファイルです。

【ファイル先】routes/web.php

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

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

ドメイン/とURLを入力するとwelcomeビュー(画面)を表示
※表示ファイル先 resources/views/welcome.blade.php

指定一覧

ビュー直接指定

ルートにアクセスすると、指定したビューが直接表示されます。

<?php

use Illuminate\Support\Facades\Route;

// aboutビューを表示(resources/views/about.blade.php)
Route::view('/about', 'about');
<?php

use Illuminate\Support\Facades\Route;

// aboutビューにデータを渡す
Route::view('/about', 'about', ['name' => 'tomoji']);

コントローラーメソッド呼び出し

ルートでコントローラーメソッドを呼び出す標準的な方法です。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;

// HomeControllerのindexメソッド呼び出し
Route::get('/home', [HomeController::class, 'index']);

クロージャを使ったルート

コントローラを使わずに、ルートに直接処理を記述します。
※小さな処理や一時的なルートに便利

<?php

use Illuminate\Support\Facades\Route;

// クロージャ内でビューを返す
Route::get('/', function () {
    return view('welcome');
});

クロージャとは、他の関数やメソッドの外で定義された変数にアクセスできる匿名関数のことです。
PHPでは、クロージャはfunctionキーワードを使って定義され、
通常の関数と同じように引数を取ることができます。

RESTfulリソースコントローラ

一般的なCRUD操作(Create, Read, Update, Delete)をまとめてルート定義します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

// リソースコントローラを定義
Route::resource('posts', PostController::class);

名前付きルート

コントローラーメソッドやビューの呼び出しに名前を付けて、後で簡単に参照できるようにします。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProfileController;

Route::get('/profile', [ProfileController::class, 'show'])->name('profile');

ルートパラメータ

ルートで動的パラメータを使用して、コントローラーメソッドに値を渡します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

// URLの{id}がshowメソッドのパラメータに
Route::get('/user/{id}', [UserController::class, 'show']);

グループ化されたルート

共通のURLプレフィックスやミドルウェアを持つルートをグループ化します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AdminController;

// プレフィックス /admin が付く
Route::prefix('admin')->group(function () {
    Route::get('/dashboard', [AdminController::class, 'dashboard']);
    Route::get('/users', [AdminController::class, 'users']);
});

ミドルウェアグループ

複数のミドルウェアを一度に適用するために、ルートにミドルウェアグループを指定できます。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\DashboardController;

// 'auth' と 'verified' ミドルウェアが適用されたルートグループ
Route::middleware(['auth', 'verified'])->group(function () {
    // 認証されたユーザーのみがアクセス可能
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

任意パラメータ付きルート

URL内のパラメータをオプションにして、存在しない場合はデフォルト値を使用します。

<?php

use Illuminate\Support\Facades\Route;

// '/user/{name?}' にアクセスすると、$name パラメータが渡される
// パラメータが指定されない場合は 'Guest' がデフォルト値として使用される
Route::get('/user/{name?}', function ($name = 'Guest') {
    return 'Hello, ' . $name;
});

ルートグループ内の名前付きルート

ルートグループに名前のプレフィックスを付けて、ルート名を一括管理します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AdminController;

// ルート名に 'admin.' プレフィックスを追加するグループ
Route::name('admin.')->group(function () {
    // nameはadmin.dashboardになる
    Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard');
    // nameはadmin.settingsになる
    Route::get('/settings', [AdminController::class, 'settings'])->name('settings');
});

サブドメインルート

サブドメインに応じたルートを定義します。

<?php

use Illuminate\Support\Facades\Route;

// {account}.example.com というサブドメインに対応するルートグループ
Route::domain('{account}.example.com')->group(function () {
    // サブドメインとユーザーIDに基づいて処理を行うルート
    Route::get('user/{id}', function ($account, $id) {
        return "Account: $account, User ID: $id";
    });
});

HTTPメソッド複数指定ルート

複数のHTTPメソッドに対応するルートを定義します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ContactController;

// GET または POST リクエストに対応するルート
Route::match(['get', 'post'], '/contact', [ContactController::class, 'handle']);

ルートパラメータのバリデーション

ルートパラメータにバリデーションを設定します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

// {id} パラメータが数字であることを強制するルート
Route::get('/user/{id}', [UserController::class, 'show'])
     ->where('id', '[0-9]+');  // ID は数字のみ許可

デフォルトルート

どのルートにも一致しない場合の処理を定義します。

<?php

use Illuminate\Support\Facades\Route;

// 定義されたルートに一致しないリクエストに対するフォールバックルート
Route::fallback(function () {
    return response()->view('errors.404', [], 404);  // 404エラーページを表示
});

シングルアクションコントローラ

コントローラの__invokeメソッドを利用して単一アクションを処理します。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ContactController;

// ContactController の __invoke メソッドを呼び出すルート
Route::get('/contact', ContactController::class);
記事の内容
閉じる