> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# ルーティング

> Laravelのルート定義方法、ルートパラメータ、名前付きルートの基本を解説します。

## 基本的なルーティング

Laravelの最も基本的なルートは、URIとクロージャを受け取ります。
複雑な設定ファイルなしに、ルートと動作を簡単に定義できます。

```php theme={null}
use Illuminate\Support\Facades\Route;

Route::get('/greeting', function () {
    return 'Hello World';
});
```

### デフォルトのルートファイル

すべてのLaravelルートは `routes/` ディレクトリのルートファイルに定義します。
これらのファイルは `bootstrap/app.php` の設定に基づいてLaravelが自動的に読み込みます。

```mermaid theme={null}
flowchart LR
    A["受信リクエスト"] --> B{{"リクエストの種類"}}
    B -->|"ブラウザ向け<br>セッション / CSRF"| C["routes/web.php<br>webミドルウェアグループ"]
    B -->|"API向け<br>ステートレス"| D["routes/api.php<br>apiミドルウェアグループ"]
    B -->|"CLIコマンド"| E["routes/console.php<br>Artisanコマンド定義"]
    C --> F["コントローラー / クロージャ"]
    D --> F
    E --> G["コマンドハンドラー"]
```

`routes/web.php` にはブラウザ向けのルートを定義します。
このファイルのルートには `web` ミドルウェアグループが適用され、セッション・CSRF保護・クッキー暗号化が提供されます。

```php theme={null}
use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);
```

### APIルート

アプリケーションがステートレス API を提供する場合、`install:api` Artisanコマンドで API ルーティングを有効にできます。

```shell theme={null}
php artisan install:api
```

`install:api` コマンドは [Laravel Sanctum](/jp/sanctum) をインストールし、`routes/api.php` ファイルを作成します。
Sanctumはサードパーティの API コンシューマ、SPA、モバイルアプリケーション向けのシンプルで堅牢な API トークン認証ガードを提供します。

```php theme={null}
Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');
```

`routes/api.php` のルートはステートレスで `api` [ミドルウェアグループ](/jp/middleware)が適用されます。
また、すべてのルートに自動的に `/api` URI プレフィックスが適用されるため、手動で付与する必要はありません。
プレフィックスを変更する場合は、アプリケーションの `bootstrap/app.php` ファイルを編集します。

```php theme={null}
->withRouting(
    api: __DIR__.'/../routes/api.php',
    apiPrefix: 'api/admin',
    // ...
)
```

### 利用可能なHTTPメソッド

ルーターはすべてのHTTPメソッドに対応したルートを登録できます。

```php theme={null}
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
```

複数のHTTPメソッドに応答するルートは `match` または `any` を使います。

```php theme={null}
Route::match(['get', 'post'], '/', function () {
    // ...
});

Route::any('/', function () {
    // ...
});
```

<Info>
  `web` ルートファイルで `POST`・`PUT`・`PATCH`・`DELETE` を受け取るHTMLフォームには、必ず `@csrf` ディレクティブを含めてください。
  含めない場合、リクエストが拒否されます。
</Info>

## ビューを返すルート

ルートがビューを返すだけの場合は、`Route::view` を使うと簡潔に書けます。

```php theme={null}
Route::view('/welcome', 'welcome');

// ビューにデータを渡す場合
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
```

## ルートパラメータ

### 必須パラメータ

URLの一部を動的に取得するには、ルートパラメータを使います。
パラメータは `{}` で囲み、ルートコールバックの引数として受け取ります。

```php theme={null}
Route::get('/user/{id}', function (string $id) {
    return 'ユーザー ID: ' . $id;
});
```

複数のパラメータも定義できます。

```php theme={null}
Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
    return "投稿 {$postId} のコメント {$commentId}";
});
```

<Warning>
  ルートパラメータには `/` 文字を含めることはできません。
</Warning>

### 任意パラメータ

パラメータを任意にするには、パラメータ名の末尾に `?` を付け、対応する引数にデフォルト値を設定します。

```php theme={null}
Route::get('/user/{name?}', function (?string $name = null) {
    return $name ?? 'ゲスト';
});

Route::get('/user/{name?}', function (?string $name = 'ゲスト') {
    return $name;
});
```

### 正規表現によるパラメータ制約

`where` メソッドを使ってパラメータの形式を正規表現で制約できます。

```php theme={null}
Route::get('/user/{id}', function (string $id) {
    // ...
})->where('id', '[0-9]+');

Route::get('/user/{name}', function (string $name) {
    // ...
})->where('name', '[a-zA-Z]+');
```

よく使うパターンは便利メソッドでも書けます。

```php theme={null}
Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->whereNumber('id')->whereAlpha('name');
```

## 名前付きルート

名前付きルートを使うと、URL生成やリダイレクトを行う際にルート名を使って参照できます。

```php theme={null}
Route::get('/user/profile', function () {
    // ...
})->name('profile');
```

### 名前付きルートへのURL生成

ルート名からURLを生成するには `route` ヘルパーを使います。

```php theme={null}
// URL生成
$url = route('profile');

// パラメータ付きURL生成
$url = route('user.show', ['id' => 1]);
```

### リダイレクト

```php theme={null}
return redirect()->route('profile');
```

## ルートグループ

関連するルートをグループ化して、ミドルウェア・コントローラー・プレフィックスなどを共通設定できます。

```mermaid theme={null}
flowchart TD
    A["HTTPリクエスト"] --> B["ルーター"]
    B --> C{{"マッチするルートが<br>あるか？"}}
    C -->|"なし"| D["404レスポンス"]
    C -->|"あり"| E["ルートのミドルウェアを確認"]
    E --> F{{"ミドルウェアを<br>通過できるか？"}}
    F -->|"拒否"| G["リダイレクト /<br>エラーレスポンス"]
    F -->|"通過"| H["コントローラー /<br>クロージャ実行"]
    H --> I["レスポンス生成"]
    I --> J["クライアントへ送信"]
```

### ミドルウェア

```php theme={null}
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', function () {
        // 認証済みユーザーのみアクセス可能
    });

    Route::get('/account', function () {
        // 認証済みユーザーのみアクセス可能
    });
});
```

### コントローラー

同じコントローラーを使うルートをグループ化できます。

```php theme={null}
use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders', 'index');
    Route::post('/orders', 'store');
    Route::get('/orders/{id}', 'show');
});
```

### プレフィックス

ルートのURIに共通のプレフィックスを付けられます。

```php theme={null}
Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // /admin/users にアクセス可能
    });
    Route::get('/posts', function () {
        // /admin/posts にアクセス可能
    });
});
```

## ルート一覧の確認

定義されたすべてのルートを一覧表示するには、Artisanコマンドを使います。

```shell theme={null}
php artisan route:list
```

ミドルウェア情報も含めて表示する場合は次のようにします。

```shell theme={null}
php artisan route:list -v
```

特定のURIから始まるルートのみを表示する場合は次のようにします。

```shell theme={null}
php artisan route:list --path=user
```

## 次のステップ

<Card title="ビュー" icon="eye" href="/jp/views">
  ビューを作成し、コントローラーからデータを渡す方法を学びます。
</Card>
