Laravelのファイル徹底図鑑【前編】|プロジェクト構成とMVC・リクエストの流れを完全理解

Laravel

Laravelのファイル徹底図鑑【前編】|プロジェクト構成とMVC・リクエストの流れを完全理解

このフォルダは何をしている?」「MVCはどこにある?」「リクエストはどのファイルを通る?」—— 前編では、Laravelのディレクトリと主要ファイルの役割を丁寧に解説し、リクエストの流れ〜MVCまでを地図化します。後編(サービスコンテナ/ミドルウェア/キュー/スケジューラ等)はこちら

この記事のゴール

  • Laravelプロジェクトの全体マップを頭に入れる
  • MVCが物理的にどこにあるかを把握する
  • リクエストがどのファイルを通って応答されるか流れで理解する

※本記事は Laravel 10〜12 の標準構成を前提に記述しています(マイナー差分は注釈に記載)。

プロジェクトの標準ディレクトリ構成と役割

.
├─ app/                  ← アプリケーション本体(Model, Controller, ジョブ、イベント等)
│  ├─ Console/           ← Artisanコマンド / スケジューラ(Console Kernel)
│  ├─ Exceptions/        ← 例外ハンドリング(Handler)
│  ├─ Http/
│  │  ├─ Controllers/    ← Controller(C)
│  │  ├─ Middleware/     ← ミドルウェア
│  │  └─ Kernel.php      ← HTTPカーネル(ミドルウェア登録)
│  ├─ Models/            ← Model(M)(Eloquent)
│  ├─ Policies/          ← 認可(ポリシー)
│  ├─ Providers/         ← サービスプロバイダ(アプリ起動時の登録)
│  └─ ...                ← Jobs, Events, Listeners, Notifications など
├─ bootstrap/
│  ├─ app.php            ← フレームワーク起動(アプリ実体生成)
│  └─ cache/             ← ルート/設定/サービスキャッシュ
├─ config/               ← 設定(app.php, database.php, queue.php ...)
├─ database/
│  ├─ factories/         ← テストデータ生成
│  ├─ migrations/        ← スキーマ変更(DDL)
│  └─ seeders/           ← 初期データ投入
├─ public/
│  ├─ index.php          ← フロントコントローラ(エントリポイント)
│  └─ assets/...         ← 公開リソース
├─ resources/
│  ├─ views/             ← View(V)(Blade)
│  ├─ lang/              ← 多言語
│  └─ js, css            ← Viteビルド対象
├─ routes/
│  ├─ web.php            ← Webルート(セッション/CSRF対象)
│  ├─ api.php            ← APIルート(ステートレス)
│  ├─ console.php        ← Artisanコマンドの定義
│  └─ channels.php       ← Broadcastチャンネル認可
├─ storage/
│  ├─ app, logs, framework/cache ... ← 生成物・ログ
├─ tests/                ← PHPUnit / Pest テスト
├─ vendor/               ← Composer依存
├─ .env                  ← 環境変数
├─ artisan               ← CLIエントリ
├─ composer.json         ← 依存/PSR-4/スクリプト
└─ phpunit.xml           ← テスト設定

このツリーを「地図」として覚えておくと、エラーの原因や修正箇所に素早くアクセスできます。

フロントコントローラ public/index.php の役割

  1. bootstrap/app.php を読み込み、アプリケーション実体を作成
  2. HTTPカーネル(app/Http/Kernel.php)でミドルウェアを設定
  3. リクエストを受け取り、ルーティング解決 → コントローラ呼び出し → レスポンス返却

つまり index.php全リクエストの入口で、ここからフレームワークのライフサイクルが始まります。

MVCの物理マッピング

  • Modelapp/Models/(EloquentでDBテーブルに対応)
  • Viewresources/views/(Bladeテンプレート)
  • Controllerapp/Http/Controllers/(リクエスト処理の司令塔)

加えて、ルーティングroutes/web.php / api.php が担当。ミドルウェアapp/Http/Middleware/HTTPカーネルで束ねます。

ルーティング:routes/web.php と routes/api.php

// routes/web.php(セッション/CSRFあり)
use App\Http\Controllers\PostController;
Route::get('/', fn() => view('welcome'));
Route::resource('posts', PostController::class);

// routes/api.php(ステートレス、/api プレフィックス)
use App\Http\Controllers\Api\PostApiController;
Route::get('posts', [PostApiController::class, 'index']);

ポイント:Webは状態管理前提、APIはトークン認証(例:Sanctum)でステートレス。

コントローラ:app/Http/Controllers/

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
  public function index() {
    $posts = Post::latest()->paginate(10);
    return view('posts.index', compact('posts'));
  }

  public function store(Request $request) {
    $validated = $request->validate([
      'title' => 'required|string|max:255',
      'body'  => 'required|string',
    ]);
    Post::create($validated);
    return redirect()->route('posts.index')->with('ok', '作成しました');
  }
}

バリデーションはFormRequestクラスに分離するのがベター(php artisan make:request)。

モデル(Eloquent):app/Models/

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
  protected $fillable = ['title', 'body'];
  // リレーション例
  public function user() { return $this->belongsTo(User::class); }
}
  • $fillable / $guarded:ホワイト/ブラックリスト
  • リレーション:hasOne, hasMany, belongsTo, belongsToMany, morph*

ビュー(Blade):resources/views/

<!-- resources/views/posts/index.blade.php -->
@extends('layouts.app')

@section('content')
  <h1>記事一覧</h1>
  @foreach($posts as $post)
    <article>
      <h2>{{ $post->title }}</h2>
      <p>{{ Str::limit($post->body, 160) }}</p>
    </article>
  @endforeach

  {{ $posts->links() }}
@endsection

Bladeは継承・コンポーネント・セクションでスケールしやすい設計が可能。

設定・環境ファイル:config/*.php と .env

  • config/app.php:アプリ名・タイムゾーン・ロケール・プロバイダ等
  • config/database.php:DB接続(MySQL, SQLite, etc.)
  • config/cache.php, config/session.php, config/queue.php, config/logging.php
  • .env:機密値(APP_KEY/DB_*/MAIL_*/QUEUE_CONNECTION 等)

キャッシュ関連:bootstrap/cache/ に設定・ルート等のキャッシュが保存。デプロイ後は php artisan config:cache などで高速化。

後編で扱う内容

コメント

タイトルとURLをコピーしました