カテゴリ: Symfony 更新日: 2026/01/02

Symfonyプロジェクトのディレクトリ構造を完全ガイド!初心者でもわかる仕組みをやさしく解説

Symfonyプロジェクトのディレクトリ構造をわかりやすく解説
Symfonyプロジェクトのディレクトリ構造をわかりやすく解説

先生と生徒の会話形式で理解しよう

生徒

「SymfonyっていうPHPのフレームワークを使い始めたんですが、最初に作られるフォルダがたくさんあって混乱しています…」

先生

「Symfonyのプロジェクトを作ると、自動的にいくつかの重要なディレクトリ(フォルダ)が用意されます。それぞれには役割があるので、ひとつずつ見ていきましょう。」

生徒

「どれが何のためのフォルダかが、まだピンとこないです…」

先生

「身近なたとえを使いながら、初心者にもわかるように説明しますね!」

1. Symfonyのディレクトリ構造とは?

1. Symfonyのディレクトリ構造とは?
1. Symfonyのディレクトリ構造とは?

Symfony(シンフォニー)は、PHPで構築されたWebアプリケーション開発向けフレームワークで、プロジェクトを作るとすぐに多くのフォルダが自動生成されます。最初は「こんなにたくさんのフォルダをどう使うの?」と驚くかもしれませんが、これらは家の中の“部屋”のように用途ごとに整理されているため、開発をスムーズに進めるための仕組みになっています。

たとえば、「src はアプリの頭脳」「templates は画面のデザイン」「public は玄関」といったように、役割を知ることで理解が一気に進みます。まずは全体像を掴んで、どのフォルダがどんな役割を持っているかを知るところから始めてみましょう。

Symfonyプロジェクトの基本ディレクトリは次のとおりです。

  • src/(コントローラやビジネスロジック)
  • templates/(画面テンプレート)
  • config/(設定ファイル)
  • public/(ブラウザから見えるファイル)
  • var/(キャッシュやログ)
  • vendor/(外部ライブラリ)
  • bin/(Symfonyのコマンド)
  • tests/(テストコード)

実際にフォルダの中身がどう使われるのか、簡単なサンプルコードを見てみましょう。


// src/Controller/HelloController.php に置かれるファイルのイメージ
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    #[Route('/hello')]
    public function hello(): Response
    {
        // templates/hello.html.twig を表示することもできる
        return new Response('Hello Symfony!');
    }
}

上のコードでは、src/にコントローラがあり、public/からアクセスされたリクエストがこの処理に流れ込んできます。このようにフォルダごとに役割が分かれているため、慣れてくるととても整理された構造だと感じられるようになります。

2. src/(ソース)フォルダ:アプリの中心

2. src/(ソース)フォルダ:アプリの中心
2. src/(ソース)フォルダ:アプリの中心

src/フォルダは、Symfonyアプリケーションの頭脳となるプログラムコードを入れておく場所です。「src」は「source(ソース)」の略で、実際にアプリがどんな動きをするのかを決める処理のほとんどがここに集まります。

たとえば、ユーザー登録やログイン処理、商品一覧を取得して画面に渡す処理など、画面の裏側で動いているロジックは基本的にこの中に置かれます。逆に言うと、src/の中身がアプリの振る舞いそのもの、と考えても大きくは間違っていません。

代表的には、次のような役割のフォルダがよく使われます。

  • src/Controller/:URLごとの処理を書くコントローラ
  • src/Entity/:データベースのテーブルと対応するクラス
  • src/Service/:共通処理をまとめたサービスクラス

イメージしやすいように、src/Controller/に置かれる簡単なコントローラのサンプルを見てみましょう。


// src/Controller/HelloController.php のイメージ
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    #[Route('/hello-src')]
    public function helloFromSrc(): Response
    {
        // ここにアプリの「動き」を書いていく
        return new Response('src フォルダから動いているコントローラです。');
    }
}

このコードは、src/Controller/の中にあるクラスの一例です。ブラウザから/hello-srcにアクセスすると、この関数が呼び出されてメッセージが表示されます。このように、src/フォルダには「どのように動くか」を決める大事な処理が詰まっており、Symfonyプロジェクトの中心的な役割を担っていると覚えておくと良いでしょう。

3. templates/(テンプレート)フォルダ:画面を作る場所

3. templates/(テンプレート)フォルダ:画面を作る場所
3. templates/(テンプレート)フォルダ:画面を作る場所

templates/フォルダは、Symfonyアプリでユーザーに見せる画面(HTML)をまとめておく場所です。さきほどの src/ がアプリの頭脳だとすると、ここは「見た目」を担当するリビングや部屋のようなイメージになります。

このフォルダの中には、「Twig(ツイッグ)」というテンプレートエンジンを使ったファイルを置きます。Twigは、ふつうのHTMLに少しだけ特別な記号を書き足すことで、「名前を差し替える」「一覧をくり返し表示する」といった処理ができる仕組みです。

たとえば、次のようなシンプルなテンプレートファイルを templates/hello.html.twig に作るとします。


{# templates/hello.html.twig のイメージ #}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>こんにちはページ</title>
</head>
<body>
    <h1>こんにちは、Symfonyのテンプレート!</h1>
    <p>この画面は templates フォルダから表示されています。</p>
</body>
</html>

このファイル自体は、ほとんどふつうのHTMLと同じです。違うのは、あとから変数を埋め込んだり、条件分岐を書ける点です。コントローラ側からこのテンプレートを呼び出すことで、ブラウザに画面が表示されます。

実際に、src/Controller/ のコントローラからテンプレートを使う例も見てみましょう。


// src/Controller/HelloController.php の一例
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    #[Route('/hello-view')]
    public function helloView(): Response
    {
        // templates/hello.html.twig を表示する
        return $this->render('hello.html.twig');
    }
}

このように、templates/は「見た目のHTMLを書いておく場所」、src/は「どのテンプレートを表示するか決める場所」と役割分担しています。プログラミング未経験の方は、まずはテンプレートを「HTMLファイルの置き場所」と捉え、コントローラから呼び出して画面が切り替わる流れを体験してみると理解が深まりやすくなります。

4. config/(コンフィグ)フォルダ:設定をまとめる場所

4. config/(コンフィグ)フォルダ:設定をまとめる場所
4. config/(コンフィグ)フォルダ:設定をまとめる場所

config/フォルダは、Symfonyアプリ全体の動き方を決めるための設定を集めた場所です。家にたとえるなら「どこにスイッチがあるか」「家電がどう動くか」を決める説明書のような役割をしています。

ここには、ルーティング(URLと処理のつながり)やデータベース接続、サービス設定など、アプリの根幹となる情報がまとめられています。Symfonyはこの設定を読み取りながら動作するため、プロジェクトを理解するうえでとても重要なフォルダです。

設定ファイルは「YAML(ヤムル)」という形式で書かれることが多く、初めて見る方でも比較的読みやすいのが特徴です。文字と記号だけで直感的に内容を把握できるため、初心者でも少しずつ慣れていけます。

たとえば、次のようにルート(URL)を設定するファイルを用意すると、Symfonyはその情報をもとにコントローラを呼び出します。


# config/routes.yaml の例
hello_config:
    path: /hello-config
    controller: App\Controller\HelloController::helloFromConfig

この設定は「/hello-config」というURLにアクセスされたら、HelloControllerhelloFromConfig() を実行する、という意味です。とてもシンプルですが、Symfonyにとっては非常に大切な情報です。

プログラミングに慣れていない人は、まず「config はアプリの説明書」と覚えるだけで十分です。細かい仕組みはあとから理解できるので、まずは YAML の見た目に触れて「どんな設定があるのか」を覗いてみるところから始めてみると良いでしょう。

5. public/(パブリック)フォルダ:インターネットからアクセスされる場所

5. public/(パブリック)フォルダ:インターネットからアクセスされる場所
5. public/(パブリック)フォルダ:インターネットからアクセスされる場所

public/フォルダは、Symfonyアプリの中でインターネットから直接アクセスされる唯一の場所です。家にたとえると「玄関」であり、訪問者(ユーザー)が最初に通る入り口の役割を持っています。

このフォルダには、Webブラウザが読み込むための画像・CSS・JavaScript といった静的ファイルを置きます。これらはページの見た目や動きに関わる部分で、ユーザーが画面を開くたびにブラウザが取得していきます。

また、Symfonyアプリの中心となる index.php もここに配置されています。これは「フロントコントローラ」と呼ばれ、すべてのリクエストを受け取り、src/ にある処理へ橋渡しする、いわば“受付係”のような存在です。

初心者向けに、非常にシンプルな public 内のファイル構成を見てみましょう。


public/
├── index.php       # アプリの入口(フロントコントローラ)
├── style.css       # 画面のデザイン
└── logo.png        # 表示する画像

例えば、public/style.css に次のような簡単なスタイルを置くと、Webページの背景色を変えることができます。


/* public/style.css */
body {
    background-color: #f5f5f5;
}

そして、テンプレートからこの CSS を読み込むと、ブラウザが public フォルダ内のファイルへアクセスし、画面の見た目が変わります。


<link rel="stylesheet" href="/style.css">

このように、public/ フォルダは「外から見えるもの」をまとめて置く場所です。裏側の処理を書く場所である src/ や設定を行う config/ とは役割が大きく異なるため、どこに何を置くか理解しておくとプロジェクトがぐっと整理しやすくなります。

6. var/(ヴァー)フォルダ:一時的なデータを保存する場所

6. var/(ヴァー)フォルダ:一時的なデータを保存する場所
6. var/(ヴァー)フォルダ:一時的なデータを保存する場所

var/フォルダは、Symfonyが自動的に作業用に使うファイルを保存しておく場所です。

たとえば、ログ(アプリの動作記録)やキャッシュ(一時保存データ)などがここに保存されます。基本的に、開発者が直接編集することはありません。

7. vendor/(ベンダー)フォルダ:外部の部品を管理する場所

7. vendor/(ベンダー)フォルダ:外部の部品を管理する場所
7. vendor/(ベンダー)フォルダ:外部の部品を管理する場所

vendor/フォルダには、SymfonyやPHPのライブラリがまとめられています。

これは「Composer(コンポーザー)」という仕組みで、自動的にインストールされます。

この中身は他の人が作った便利な部品なので、自分で編集する必要はありません。

8. bin/(ビン)フォルダ:コマンドを実行するためのファイル

8. bin/(ビン)フォルダ:コマンドを実行するためのファイル
8. bin/(ビン)フォルダ:コマンドを実行するためのファイル

bin/フォルダには、Symfonyの実行コマンドが含まれています。

たとえば、「サーバーを起動する」「データベースを作る」などの処理が行えます。

コマンドはターミナル(黒い画面)で操作します。

9. tests/(テスト)フォルダ:アプリの動作チェック用

9. tests/(テスト)フォルダ:アプリの動作チェック用
9. tests/(テスト)フォルダ:アプリの動作チェック用

tests/フォルダは、アプリが正しく動いているかをテスト(確認)するためのコードを入れる場所です。

初心者のうちはまだ使わないかもしれませんが、大きなアプリを作るときにはとても大事な仕組みになります。

10. Symfonyのディレクトリ構造を「家」に例えて覚えよう

10. Symfonyのディレクトリ構造を「家」に例えて覚えよう
10. Symfonyのディレクトリ構造を「家」に例えて覚えよう

Symfonyの各フォルダを「家」に例えて覚えると、イメージしやすくなります。

  • src/:住人の活動(ロジック)
  • templates/:部屋のデザイン(画面)
  • config/:家のルール(設定)
  • public/:玄関・外観(外から見える)
  • var/:倉庫やメモ(作業記録)
  • vendor/:買ってきた道具(外部ライブラリ)
  • bin/:家事用ロボット(コマンド)
  • tests/:点検チェック(テスト)

こうして覚えると、Symfonyのディレクトリ構成も怖くありません。

まとめ

まとめ
まとめ

Symfonyのプロジェクト構造は初めて見ると複雑に感じられますが、それぞれのフォルダには明確な役割があり、仕組みを知れば全体像がはっきり理解できるようになります。特にWebアプリケーション開発では、ディレクトリ構造を把握しておくことで作業効率が大きく向上し、開発ミスも減らすことができます。今回の記事では、srcフォルダにあるコントローラーやエンティティの役割、templatesフォルダに保存されるTwigテンプレートの意味、configフォルダによる設定管理、publicフォルダが担うアプリケーションの玄関口としての役割を詳しく整理しました。さらにvarフォルダのキャッシュやログに関する重要性、vendorフォルダによる外部ライブラリの管理、binフォルダに含まれるCLI操作用ファイル、testsフォルダで実施できるテストコードまで、全体を通してSymfonyの構成をひとつずつ丁寧に確認しました。こうした知識を身につけておくとアプリの仕組みを俯瞰しながら開発でき、後から機能を追加する際もどこを修正すれば良いか迷いにくくなります。

Symfonyディレクトリ構造の基本と整理

Symfonyのプロジェクトを構築する際には、各フォルダがどのような役割を果たしているかを整理して理解しておくことが大切です。srcフォルダには実際のビジネスロジックを記述する処理が集まり、templatesフォルダでは画面表示を担当するHTMLやTwigテンプレートが配置されます。configフォルダはフレームワーク全体の動作を制御する設定ファイルをまとめる中心的な場所であり、publicフォルダはブラウザから直接見られるリソースが置かれる大切な領域です。またvarフォルダにはSymfonyが動作する際のキャッシュやログ記録が保存され、vendorフォルダには外部の便利なパッケージやライブラリがまとめられます。binフォルダにはCLI操作に必要な実行ファイルが配置され、testsフォルダではアプリケーションが正しく動作するかをコードで確認できます。それぞれの仕組みを知ることで、Symfonyを使った開発がより直感的になります。

具体的な操作例(サンプルコード付き)

Symfonyのディレクトリを実際に触る際には、まずsrcフォルダにコントローラーを作成し、templatesフォルダで画面を用意し、必要に応じてconfigフォルダにルーティングや設定情報を書き加えていきます。ここでは簡単な例として、srcフォルダに配置するコントローラーとtemplatesフォルダに配置するTwigテンプレートの例を紹介します。


// src/Controller/SampleController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class SampleController extends AbstractController
{
    #[Route('/sample', name: 'sample_page')]
    public function index(): Response
    {
        return $this->render('sample/index.html.twig', [
            'message' => 'Symfonyのディレクトリ構造を理解すると開発が楽になります!',
        ]);
    }
}

{# templates/sample/index.html.twig #}
<!DOCTYPE html>
<html>
<head>
    <title>サンプル画面</title>
</head>
<body>
    <h1>{{ message }}</h1>
    <p>これはSymfonyのテンプレートフォルダに置く画面ファイルの例です。</p>
</body>
</html>

このように、srcフォルダでロジックを書き、templatesフォルダで表示内容を整え、configフォルダでルーティングを設定することで、ひとつのページが構成されます。こうした流れを理解することで、Symfonyのアプリケーション開発を自信を持って進められるようになります。

フォルダを家に例えて理解するメリット

Symfonyのディレクトリ構造は、家に例えて覚えるとより理解しやすくなります。srcフォルダは住人の動きそのものであり、templatesフォルダは部屋のレイアウトや見た目を整える役割、configフォルダは家全体のルールを決めるための中心的な場所として機能します。publicフォルダは玄関のように外の世界とつながる場所であり、varフォルダは収納や倉庫のように裏側で使う作業スペースになります。vendorフォルダは外部から買ってきた便利な道具が揃えられた場所で、binフォルダは機械の操作に必要なロボットのような存在です。testsフォルダは家の安全を確認する点検係のような役割を持っています。このように例えて捉えることで、初めてSymfonyに触れる初心者でも全体像を楽に整理できます。

先生と生徒の振り返り会話

生徒

「ディレクトリが多くて最初は混乱していたんですが、今回の説明で全体像がすごく分かりやすくなりました!」

先生

「役割が分かるだけで開発の見通しがつきやすくなりますよ。特にsrcやtemplates、configはよく触る場所なので、どんどん慣れていきましょうね。」

生徒

「家に例える説明もイメージしやすくて助かりました!フォルダごとの役割が頭の中でつながりました。」

先生

「今後、機能追加やバグ修正をするときにも、この理解がきっと役に立ちますよ。必要な場所をすぐ探せるようになると作業効率も上がりますからね。」

生徒

「Symfonyをもっと深く学びたくなりました!次は実際にコントローラーを増やしたり、Twigで画面づくりも挑戦したいです。」

先生

「その意欲が大切ですね。ディレクトリ構造が理解できた今なら、次のステップもきっとスムーズに進めるはずです。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Symfonyのディレクトリ構造とは何ですか?初心者でも理解できますか?

Symfonyのディレクトリ構造とは、プロジェクト内に作られる各フォルダの配置と役割のことです。初心者でも家の間取りに例えることで直感的に理解できます。
カテゴリの一覧へ
新着記事
New1
CodeIgniter
CodeIgniterのコントローラクラスの作り方を完全ガイド!初心者でもわかる基礎から実践まで
New2
Symfony
Symfonyのフォームラベルを多言語対応!初心者でもわかる翻訳設定ガイド
New3
Laravel
Laravelでユーザー登録機能を作る方法!初心者向けにバリデーションとリダイレクトをやさしく解説
New4
CodeIgniter
CodeIgniterのコントローラとは?役割と基本構造を完全解説!初心者向けガイド
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravelのビューとは?Bladeテンプレートの基本を解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.7
Java&Spring記事人気No7
Laravel
LaravelのBlade構文まとめ!@if @foreach など基本ディレクティブ解説
No.8
Java&Spring記事人気No8
Laravel
Laravelのルートグループの使い方!初心者でもわかるprefixやミドルウェアの設定方法