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 の役割
bootstrap/app.phpを読み込み、アプリケーション実体を作成- HTTPカーネル(
app/Http/Kernel.php)でミドルウェアを設定 - リクエストを受け取り、ルーティング解決 → コントローラ呼び出し → レスポンス返却
つまり index.php は全リクエストの入口で、ここからフレームワークのライフサイクルが始まります。
MVCの物理マッピング
- Model:
app/Models/(EloquentでDBテーブルに対応) - View:
resources/views/(Bladeテンプレート) - Controller:
app/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 などで高速化。
後編で扱う内容
ミドルウェア、HTTP/Consoleカーネル、サービスコンテナ/プロバイダ、依存注入、ファサード、イベント/リスナ、ジョブ/キュー、スケジューラ、通知/メール、例外処理、ロギング、ストレージ、キャッシュ/パフォーマンス、テスト戦略、認証/認可(Gate/Policy, Sanctum/Fortify)など。
→ 後編はこちら:Laravelのファイル徹底図鑑【後編】



コメント