Laravelのディレクトリ構成を図解で解説!初心者でも迷わないプロジェクト構造

Webアプリケーションフレームワークとして世界中で高い人気を誇るLaravelですが、いざ学習を始めると、多くの人が最初の関門として「ディレクトリ構成」に戸惑います。ファイルやフォルダが多すぎて、「どのフォルダに何を置けばいいのか?」「自分の書くべきコードはどのファイルに書けばいいのか?」といった疑問で、手が止まってしまうことは珍しくありません。

しかし、このディレクトリ構成こそが、Laravelの設計思想と開発効率の高さを支える土台であり、一度そのルールを理解してしまえば、学習スピードと開発効率は飛躍的に向上します。

この記事では、Laravelのプロジェクト構造を、初心者の方でも「どこに何があるか」が一目で、そして明確に理解できるよう、図解を多用してわかりやすく徹底的に解説します。単なるフォルダ名の羅列ではなく、「なぜここに置くのか」「実務ではどう使い分けるのか」という理由まで掘り下げて説明します。このガイドを読み終える頃には、あなたはLaravelプロジェクトの地図を手に入れ、迷うことなく開発を進められるようになるでしょう。

Laravelプロジェクトの全体像

Laravelをインストールすると、最初に多数のフォルダとファイルが生成されます。これらは役割ごとに整理されており、MVC(Model・View・Controller)構造に基づいてアプリケーションが設計されています。まずは全体像を俯瞰してみましょう。

ディレクトリ 主な役割
/app アプリケーションの中心となるロジックを管理。ModelやControllerなどを配置。
/bootstrap Laravelの初期設定を行うスクリプトを格納。起動処理のエントリーポイント。
/config データベース接続やキャッシュ設定など、全体設定ファイルを配置。
/database マイグレーション・シーディングなど、データベース関連のファイルを管理。
/public ブラウザからアクセス可能な唯一のディレクトリ。index.phpやCSS・JSを配置。
/resources ビュー(Bladeテンプレート)や言語ファイルなど、ユーザー向けリソースを格納。
/routes ルーティング定義ファイル。アプリ全体のURLルートをここで管理。
/storage キャッシュ・ログ・アップロードファイルなどを保存。
/tests PHPUnitやPestで使うテストコードを配置。
/vendor Composerでインストールされた外部ライブラリ群を保持。

上記のフォルダがLaravelプロジェクトの土台です。特に「/app」「/routes」「/resources」「/config」は開発者が頻繁に触れる部分になります。

appディレクトリの中身を詳解

Laravelで最も頻繁に触るのが /app ディレクトリです。アプリケーションのコアロジック(コントローラ、モデル、サービスなど)が集まっており、ここを理解すれば開発の流れがつかみやすくなります。以下では主要なサブディレクトリとその役割をわかりやすく整理します。

パス 役割
/app/Http コントローラやミドルウェア、フォームリクエストを格納。HTTPリクエストに関する処理の中心。
/app/Models Eloquentのモデルを配置するのが一般的。ビジネスロジックの一部もここに置く。
/app/Console Artisanコマンドを定義するディレクトリ。定期処理や独自CLIを作る。
/app/Providers サービスコンテナへのバインディングやイベントリスナーの登録など、アプリ起動時に実行する処理。
/app/Exceptions 例外ハンドリングをカスタマイズする場所。エラーレスポンスの統一に使う。

Laravel Debugbar完全ガイド|初心者でもわかる導入・使い方・活…

Laravel Debugbar完全ガイド|初心者でもわかる導入・使い方・活…

Laravel Debugbarの導入から使い方、活用シーンまでを初心者向けに丁寧に解説。SQLクエリや処理時間を可視化し、開発効率とパフォーマンスを向上させる方法を紹介します。

Laravel Debugbarの導入から使い方、活用シーンまでを初心者向けに丁寧に解説。SQLクエリや処理時間を可視化し、開発効率とパフォーマンスを向上させる方法を紹介します。

/app Http (Controllers, Middleware) Models (Eloquent) Console (Artisan) Providers (Service Bindings) Exceptions (Handler)

よく使うファイルの実例(コード)

ここでは、基本的なController、Model、ルート定義、マイグレーションのサンプルを示します。実際にコピーして使える形で掲載しています。コード内の記号はHTMLエスケープしてあるので、そのままWordPressのカスタムHTMLに貼ると表示されます(エスケープ済みのままなら記事内にソースコードとして出ます)。

サンプル:シンプルなコントローラ

<?php

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', ['posts' => $posts]);
    }

    public function show($id) {
        $post = Post::findOrFail($id);
        return view('posts.show', ['post' => $post]);
    }
}

サンプル:モデル(Eloquent)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model {
    protected $fillable = [
        'title',
        'body',
        'published_at',
    ];

    protected $dates = [
        'published_at',
    ];

    public function author() {
        return $this->belongsTo(User::class);
    }
}

サンプル:routes/web.php の一部

<?php

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

Route::get('/', [PostController::class, 'index'])−>name('home');
Route::get('/posts/{id}', [PostController::class, 'show'])
    −>where('id', '[0-9]+')
    −>name('posts.show');

サンプル:マイグレーション

まずはArtisanでマイグレーションを作成します。

$ php artisan make:migration create_posts_table --create=posts

生成されたマイグレーションの中身(一部):

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration {
    public function up() {
        Schema::create('posts', function (Blueprint $table) {
            $table−>bigIncrements('id');
            $table−>unsignedBigInteger('user_id');
            $table−>string('title');
            $table−>text('body');
            $table−>timestamp('published_at')−>nullable();
            $table−>timestamps();

            $table->foreign('user_id')
                −>references('id')
                &munus;>on('users')
                −>onDelete('cascade');
      });
    }

    public function down() {
        Schema::dropIfExists('posts');
    }
}

開発ワークフローのスニペット

ローカルでよく使うコマンドをまとめます。

$ composer install
$ cp .env.example .env
$ php artisan key:generate
$ php artisan migrate
$ php artisan serve --host=0.0.0.0 --port=8000

以上で /app 周りの基礎が把握できます。次のブロックでは /routes/resources/public/config 周りの詳解と、実践で役に立つディレクトリ運用のベストプラクティス(命名規則・ファイル配置のコツ)を図解つきで解説します。

 

routesディレクトリ:アプリの入り口

Laravelのルーティングは /routes ディレクトリで定義します。アプリケーションのURL構造を決定する重要な部分です。 主に以下の4つのファイルが存在します。

ファイル名 説明
web.php ブラウザ経由でアクセスされるルート。BladeビューやHTMLレスポンスに対応。
api.php APIエンドポイント用。JSONレスポンスやAPIトークン認証などを扱う。
console.php Artisanコマンドなどのルート定義。
channels.php Broadcast(リアルタイム通信)で使用するチャネルの定義。

実例:APIルートの定義

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\PostController;

Route::middleware('auth:sanctum')−>group(function () {
    Route::get('/posts', [PostController::class, 'index']);
    Route::post('/posts', [PostController::class, 'store']);
});

このように、middleware() メソッドを使ってグループ化すると、認証や権限などの処理を一括で適用できます。

resourcesディレクトリ:ビューとアセット

/resources は、ユーザーに見える部分(画面表示)を構築するフォルダです。主な構造は以下のとおりです。

ディレクトリ 内容
/views Bladeテンプレート(.blade.php)ファイルを格納。画面のHTMLをここに記述。
/lang 多言語対応用の翻訳ファイル。
/css, /js Viteなどのビルドツールを使う場合に利用する開発用リソース。

Bladeテンプレートの例

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
</head>
<body>
    <header>
        <h1>Laravel Blog</h1>
    </header>

    <div class="container">
        @yield('content')
    </div>

    <footer><p>© {{ date('Y') }} My Blog</p></footer>

</body>
</html>

Bladeでは @yield@section を使って、レイアウトを柔軟に分割できます。テンプレート継承を活用することで、共通デザインを保ちつつページごとに中身を切り替えることが可能です。

publicディレクトリ:公開エリア

/public は、外部(ブラウザ)からアクセスできる唯一のフォルダです。 index.php、画像、JavaScript、CSSなどを配置します。Laravelはセキュリティ上の理由から、ほかのフォルダには直接アクセスできません。

/public
├─ index.php
├─ css/
├─ js/
└─ storage/ (シンボリックリンク)

storage ディレクトリを php artisan storage:link でリンクしておくと、アップロードされたファイルを public/storage から参照できるようになります。

configディレクトリ:設定を一元管理

/config は、アプリ全体の挙動を制御する設定ファイルをまとめています。 例えば config/app.php ではアプリ名やタイムゾーン、ロケールなどを定義できます。

<?php

return [
    'name' => env('APP_NAME', 'LaravelApp'),
    'env' => env('APP_ENV', 'production'),
    'debug' => (bool) env('APP_DEBUG', false),
    'timezone' => 'Asia/Tokyo',
];

.env ファイルに設定を書き、それを config ファイル内で参照する形が一般的です。

ディレクトリ構成のベストプラクティス

  • コントローラ名は「〇〇Controller」と統一する(例:PostController)。
  • モデルは単数形(Post, User)、テーブルは複数形(posts, users)。
  • サービスクラスなどは /app/Services を作ってまとめる。
  • ロジックが複雑化してきたら /app/Actions などで分離するのも有効。

このように整理しておくことで、チーム開発でも迷わずファイルを見つけやすくなり、保守性も向上します。

図で理解するLaravelプロジェクト全体構造

Laravelのディレクトリ構成は、一見するとフォルダが多く複雑に見えますが、役割をグループ化して考えると非常にシンプルです。 下記の図では「アプリケーションロジック」「設定・初期化」「公開領域」「データベース関連」に分類して視覚化しています。

アプリケーションロジック /app (Models, Controllers) /routes (web.php, api.php) /resources (views, lang) /tests (Unit, Feature) 設定・初期化 /config /bootstrap 公開領域 /public (index.php, assets) /storage (linked uploads) データベース関連 /database (migrations) /seeders /factories 外部ライブラリ /vendor (Composer) ※ 各カテゴリを理解することで、Laravelのファイル構造全体が頭に入ります。

このように見ると、Laravelの構成は「ロジック」「設定」「公開」「DB」「外部依存」に明確に分けられていることが分かります。新しくファイルを追加する際も、この分類を意識すると混乱を防げます。

初心者が迷いやすいポイント

  • Bladeファイルを /public に置いてしまう(正しくは /resources/views
  • ルートを routes/api.php に書いたのにブラウザでアクセスしようとして動かない(APIはJSON専用)
  • storage/logs のエラーログに気づかずデバッグに時間がかかる
  • キャッシュクリアを忘れて設定変更が反映されない
$ php artisan config:clear
$ php artisan cache:clear
$ php artisan route:clear
$ php artisan view:clear

これらのコマンドを覚えておくと、開発中のトラブルシューティングがスムーズになります。

Laravel初心者必見!パスワードリセット機能の仕組みと実装方法を徹底解説…

Laravel初心者必見!パスワードリセット機能の仕組みと実装方法を徹底解説…

Laravel 12でパスワードリセット機能を初心者向けにわかりやすく解説。メール送信・トークン管理・ルート/コントローラ実装、セキュリティ上の注意点をコード例付きで丁寧に紹介します。

Laravel 12でパスワードリセット機能を初心者向けにわかりやすく解説。メール送信・トークン管理・ルート/コントローラ実装、セキュリティ上の注意点をコード例付きで丁寧に紹介します。

FAQ:実務で役立つディレクトリ構成に関する疑問

Laravelのディレクトリ構成を理解した後、実務やデプロイ時に遭遇しやすい具体的な疑問とその解決策をまとめました。これらの知識は、プロジェクトの安全性とメンテナンス性を高めるために不可欠です。

Q1. どのファイルをGitで管理すべきですか?安全なバージョン管理の方法は?

A: 基本的な原則として、「ローカル環境で自動生成されるファイルや、機密情報を含むファイルはGit管理から除外する」ようにしてください。これは、不必要なコミットを避け、セキュリティを維持するために非常に重要です。

  • 除外すべき重要ファイル:
    • /vendor: Composerが管理するPHPの外部ライブラリです。プロジェクトのクローン後にcomposer installコマンドで自動的にダウンロード・構築されるため、リポジトリに含める必要はありません。
    • /node_modules: npmが管理するJavaScriptのパッケージです。同様にnpm installで再構築可能です。
    • .envファイル: データベースのパスワード、APIキー、シークレットキーなど、機密性の高い設定値が含まれるため、絶対にGitに含めてはいけません。
  • 推奨される対応:

    設定情報のテンプレートとして、.env.exampleというファイルをGit管理に含めます。これには環境変数名だけを記述し、実際の値は含めないことで、新しい開発者がプロジェクトに参加した際に必要な設定項目をすぐに把握できるようにします。

Q2. BladeファイルとVueやReactなどのJavaScriptフレームワークを一緒に使えますか?

A: はい、可能です。 現代のLaravel開発では、BladeとJavaScriptフレームワークを共存させる「ハイブリッド構成」が標準的な手法となっています。

  • 役割分担:

    LaravelのビューエンジンであるBladeは、サイトの基本的な骨格(レイアウト、認証画面など)や、サーバーサイドでレンダリングする静的な部分を担当します。

    VueやReactなどのフレームワークは、「対話的で動的なユーザーインターフェース」(例:リアルタイム更新、複雑なフォーム処理)が必要な特定のコンポーネント部分だけを担います。

  • 技術的基盤:

    Laravelは、フロントエンドのアセットビルドツールとしてViteを推奨しており、これを使用すれば、複雑な設定なしにJavaScriptフレームワークのコンポーネントをBladeテンプレート内に簡単に埋め込み、開発を進めることができます。

Q3. ディレクトリを独自に増やしても大丈夫ですか?どのような基準で増やすべき?

A: 全く問題ありません。むしろ、アプリケーションの規模が大きくなれば積極的に推奨されます。

  • 追加の理由:

    デフォルトの/app/Http/Controllers/app/Modelsだけでは、複雑なビジネスロジックが集中しすぎ(「太ったコントローラー」問題)てしまいます。コードの責務の分離を明確にするために、新しいディレクトリを追加します。

  • よくある追加例:
    • /app/Services: 複数のControllerから呼び出される複雑なビジネスロジックや外部API連携を格納。
    • /app/Actions: 特定のユースケース(例: ユーザーの退会処理)を独立したクラスとして格納。

注意点: 独自のディレクトリを追加する際は、その命名規則と、クラスがどのような責務を持つのかを明確にし、チーム内またはプロジェクト内で統一しておくことが最も重要です。

Q4. 本番環境ではどのフォルダをデプロイすればいいですか?デプロイ時の注意点は?

A: 通常はプロジェクト全体(Git管理されているすべてのファイル)をアップロードし、サーバー上で環境を構築します。

  • デプロイ時の手順:

    サーバー上でcomposer install --no-devを実行します。これは開発時にのみ必要なパッケージを除外し、本番環境の安全性とデプロイ速度を向上させるためです。

    また、本番環境専用の.envファイルを作成・配置し、php artisan config:cacheなどで設定を最適化することも重要です。

  • 公開ディレクトリの設定:

    ApacheやNginxなどのWebサーバーの設定ファイルで、公開ディレクトリ(ドキュメントルート)を必ず/publicフォルダに指定するように設定します。これにより、.envファイルなどの機密ファイルが外部から直接アクセスされることを防げます。

Q5. storageディレクトリが書き込み不可でエラーになる場合の対処法は?

A: これはWebサーバー(Apache, Nginxなど)が、ログファイルやキャッシュファイルを作成・更新するために必要なファイルシステムへの書き込み権限がないために発生する、デプロイ後の非常によくあるエラーです。

Linux環境では、Webサーバーがファイルを書き込めるよう、以下のコマンドで権限を付与すれば解決します。

$ chmod -R 775 storage bootstrap/cache
$ chown -R www-data:www-data storage bootstrap/cache

コマンド解説: chmodで権限を設定し、chownでWebサーバーを実行しているユーザー(多くの場合、www-data)にファイルの所有権を変更しています。サーバー環境によってはユーザー名が異なる場合があるため、その際はサーバー管理者に確認してください。

✨ まとめ:Laravelプロジェクトの構造を完全にマスターする

Laravelのディレクトリ構成は、最初はその複雑さに戸惑うかもしれませんが、この記事を通して解説してきたように、それは決して無秩序なものではありません。むしろ、現代のWeb開発のベストプラクティスと、「コードを整理し、大規模な開発にも対応できる」というLaravelの設計思想が凝縮された、非常に合理的かつ洗練された仕組みです。

重要なのは、個々のファイル名ではなく、各ディレクトリの「責務」を理解することです。基本となるMVC構造(Model-View-Controller)を軸に、以下の原則を頭に入れておきましょう。

  • コアロジックの格納庫: ほとんどのビジネスロジック(Model, Controller, Serviceなど)は、/app ディレクトリ内に配置されます。
  • ユーザーインターフェース: ユーザーに見せる画面(Bladeファイル)は、すべて /resources/views に集約されています。
  • 交通整理の心臓部: どのURLがどのコード(Controller)を実行するかを定義するルート設定は、/routes フォルダが担います。
  • 静的設定: 環境に依存しないアプリケーション全体の静的な設定値は、/config に配置され、安全に管理されます。

ファイル配置に迷う時間がゼロになると、あなたはコードの理解スピードだけでなく、新しい機能の実装スピードも格段に向上します。それは、必要な機能を探すためにフォルダをさまようことなく、必要なファイルに直接たどり着けるようになるからです。

これであなたは、Laravelプロジェクトの構造という「地図」を手に入れました。この構造を理解したことで、あなたのLaravel開発はよりスムーズに、より効率的に、そして何よりもエラーの少ない楽しいものになるはずです。次のステップとして、実際に簡単な機能を追加して、構造の理解を深めてみてください。

【初心者歓迎!一歩先のLaravel】リレーション入門「ユーザーと投稿」で「…

【初心者歓迎!一歩先のLaravel】リレーション入門「ユーザーと投稿」で「…

Laravel初心者必見! CRUDの次へ進むための「1対多リレーション」を徹底解説。ユーザーと投稿の紐付けをSQL不要で実現する方法、hasManyとbelongsToの使い方、アプリが遅くなるN+1問題の解決策まで、図解とコードで分かり…

Laravel初心者必見! CRUDの次へ進むための「1対多リレーション」を徹底解説。ユーザーと投稿の紐付けをSQL不要で実現する方法、hasManyとbelongsToの使い方、アプリが遅くなるN+1問題の解決策まで、図解とコードで分かり…

 

PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ]

価格:3300円
(2025/10/6 12:15時点)
感想(2件)

動かして学ぶ!Laravel開発入門 (NEXT ONE) [ 山崎 大助 ]

価格:3300円
(2025/10/6 12:15時点)
感想(0件)