はじめに
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 の流れを押さえると、設計もデバッグも安定する。