0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelの「処理の流れ」を腹落ちさせる — 入口から出口まで(Kernel/Middleware/Route/Controller/Service/Model/Blade)

Posted at

はじめに

Laravelを使い始めると、「ルート → コントローラ → ビュー」 といった断片的な説明はよく見かけますが、実際に「リクエストがどのように流れてレスポンスになるのか」を全体としてイメージできないことが多いと思います。
特に Kernelミドルウェア といった用語は頻出ですが、最初は「何をしているのか」「どこで効いているのか」が分かりにくい部分です。

本記事では、Laravelアプリケーションがリクエストを受けてレスポンスを返すまでの流れを、入口(index.php / bootstrap)から出口(レスポンス返却)まで 俯瞰して整理します。

「Laravelの全体像を押さえたい」「ドキュメントを読んでも断片的にしか理解できない」という方にとって、腹落ちするきっかけになれば幸いです。


この記事でわかること

  • リクエストがどこから入って、どの順序で何を通り、レスポンスになるか
  • Kernel / Middleware / Route / Controller / Service / Model / Blade の役割と関係
  • web/api ミドルウェアグループauth などの名前付きミドルウェア の違い
  • 汎用の最小コードスニペット

全体像(まずは地図)

[ブラウザ]
   ↓  HTTPリクエスト
public/index.php
   ↓  アプリ起動(bootstrap/app.php)/ サービスコンテナ初期化
App\Http\Kernel(HTTPカーネル)
   ↓  グローバルミドルウェア(全件適用)
RouteServiceProvider → ルーティング解決(web/api グループ付与)
   ↓  ルート専用ミドルウェア(auth, throttle など)
Controller
   ↓  Service(任意)/ Repository(任意)
Model(Eloquent / DB)
   ↓
View(Blade) or JSON(API)
   ↓  レスポンス用ミドルウェア(逆順で通過)
[ブラウザへレスポンス]

エントリーポイントと起動処理

public/index.php

  • すべてのHTTPリクエストはここに到達。
  • フレームワークをブートし、アプリケーションを起動。

bootstrap/app.php

  • サービスコンテナ(依存性注入の中枢)を初期化。
  • 以後、必要なクラスはコンテナ経由で自動解決(DI)。

Kernel と Middleware(関所のイメージ)

HTTPカーネル App\Http\Kernel

どのミドルウェアを通すか を束ねる中枢。以下の3層で整理。

  • $middlewareグローバル(全リクエスト強制)
  • $middlewareGroupsセットweb / api
  • $routeMiddleware名前付きauth, verified, throttle など/ルートで明示指定して使う)

例(概念理解用・代表的なエントリ)

// 全件適用(グローバル)
protected $middleware = [
    \Illuminate\Http\Middleware\HandleCors::class,
    \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

// グループ(web/api)
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

// 名前付き(ルートで選んで使う)
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

ルートとグループの自動紐づけ

routes/web.php のルートは 自動で web グループroutes/api.php自動で api グループ が適用される(RouteServiceProvider で設定)。

通常の画面系ルートは web.php に書くだけで「セッション」「CSRF」等が有効。

ミドルウェアの入口/出口

public function handle($request, \Closure $next)
{
    // 入口の前処理(リクエスト側)
    // if (...) return response(...);

    $response = $next($request); // 次へ(コントローラ or 次のMW)

    // 出口の後処理(レスポンス側)
    // $response->headers->set('X-App-Version', '1.0.0');

    return $response;
}
  • $next($request) 前 → 入口処理
  • $next($request) 後 → 出口処理
  • レスポンス時は 同じチェーンを逆順 で通過。

実行順序の固定:$middlewarePriority

  • 順番に依存がある場合のみ順序を固定(セッション開始 → 認証など)。
  • 適用の有無を決める場所ではなく、順序だけの話。

ルーティング:何に結びつく?

ルートは以下のいずれかに結びつく。

1.クロージャ(無名関数/軽い処理・試験向け)

Route::get('/ping', function () {
    return 'pong';
});

2.通常のコントローラ

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index'])
     ->middleware('auth'); // 画面系なら web グループは自動適用

3.リソースコントローラ(RESTの定食7本セット)

Route::resource('users', UserController::class);
// index, create, store, show, edit, update, destroy が一気に定義

クロージャは「付箋メモ」。本格処理はコントローラ/サービスへ。


Controller → Service → Model → View の最小サンプル(汎用)

routes/web.php

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index'])->middleware('auth');
// web.phpにあるため web グループは自動適用(セッション/CSRFなど)

app/Http/Controllers/UserController.php

namespace App\Http\Controllers;

use App\Services\UserService;

class UserController extends Controller
{
    public function __construct(private UserService $service) {}

    public function index()
    {
        $users = $this->service->getAllUsers();
        return view('users.index', compact('users'));
    }
}

app/Services/UserService.php

namespace App\Services;

use App\Models\User;

class UserService
{
    public function getAllUsers()
    {
        return User::query()->orderBy('id')->get();
    }
}

app/Models/User.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // users テーブルと対応(規約で自動推測)
}

resources/views/users/index.blade.php

@extends('layouts.app')

@section('content')
  <h1>ユーザー一覧</h1>
  <ul>
    @foreach($users as $user)
      <li>{{ $user->name }} ({{ $user->email }})</li>
    @endforeach
  </ul>
@endsection

Tips

  • UI系は web.php、APIは api.php に分ける。
  • 認証/権限 はルートで明示(auth, can:admin など)。
  • 共通の前後処理カスタムミドルウェア にまとめる。
  • 複雑なビジネスロジック はコントローラから Service/UseCase に逃がす。

まとめ

  • Kernel は「何を通すか」を決める受付中枢。
  • ミドルウェア は入口/出口の関所(全件・セット・個別の3層)。
  • ルーティング はクロージャ/コントローラ/リソースコントローラに結びつく。
  • Controller→Service→Model→View の流れを押さえると、設計もデバッグも安定する。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?