この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: Symfony
SEOタイトル: Symfony (PHP フルスタックフレームワーク) 完全ガイド(コンポーネント・Laravel との関係)

この記事の要点
  • Symfony: 2005 年〜の歴史を持つ PHP フレームワーク。SensioLabs / Symfony 社が開発
  • Laravel の母: Laravel は Symfony Components(HttpFoundation / Routing / Console など)の上に構築されている
  • コンポーネント設計: フレームワークとしても、個別ライブラリとしても使える疎結合構造
  • 最新 Symfony 7.x(2023〜)。LTS あり。PHP 8.2+ 必須
  • Drupal・Magento・Laravel・eZ Platform など多くの PHP 製品の基盤になっている

Symfony とは

Symfony は 2005 年に SensioLabs 社(現 Symfony 社)の Fabien Potencier が開発を開始した、PHP のフルスタック Web フレームワークです。「Reusable PHP Components」の集合体として設計されており、フレームワーク全体としても、個別のライブラリとしても使えます。

歴史とリリース

バージョンリリース備考
1.x2007初の安定版
2.x2011完全リライト・コンポーネント化
3.x2015PSR-7 採用 / クリーンアップ
4.x2017Flex / 軽量化・マイクロカーネル
5.x2020PHP 7.2+
6.x LTS2021長期サポート / PHP 8.0+
7.x2023PHP 8.2+ / Readonly Property / Enum / 非同期

Laravel との関係

Laravel は Symfony Components の上に構築されています。 具体的には:

Laravel の機能裏で動く Symfony Component
HTTP リクエスト / レスポンスsymfony/http-foundation
ルーティングsymfony/routing
artisan コマンドsymfony/console
イベントsymfony/event-dispatcher
プロセス起動symfony/process
ファイル操作symfony/finder
HTTP クライアントsymfony/http-client
Mailersymfony/mailer

つまり Laravel を使っているなら、知らずに Symfony を使っているのです。

インストールとプロジェクト作成

# Symfony CLI(推奨ツール)をインストール
curl -sS https://get.symfony.com/cli/installer | bash

# 新規プロジェクト
symfony new myapp --version="7.1.*" --webapp
cd myapp

# 開発サーバ起動
symfony server:start

# Composer 単体でも作成可
composer create-project symfony/skeleton myapp ^7.1
composer require webapp

コンポーネントの一覧(主要なもの)

Component役割
HttpFoundationRequest / Response / Session のオブジェクト化
HttpKernelHTTP リクエストの処理パイプライン
RoutingURL → コントローラのマッピング
DependencyInjectionDI コンテナ(service container)
EventDispatcherObserver パターンの実装
ConsoleCLI コマンドの作成
Formフォーム定義・レンダリング・バリデーション
Validatorアノテーション / Attribute / YAML でバリデーション
Security認証・認可
Twigテンプレートエンジン(Symfony 公式)
Messenger非同期メッセージング / Queue
Mailerメール送信
Workflowステートマシン / フロー管理
Translationi18n / 多言語化

ディレクトリ構造

myapp/
├── bin/console               # CLI
├── config/                   # 設定 (YAML / PHP)
│   ├── packages/
│   ├── routes.yaml
│   └── services.yaml
├── public/                   # ドキュメントルート
│   └── index.php
├── src/
│   ├── Controller/
│   ├── Entity/               # Doctrine エンティティ
│   ├── Repository/
│   ├── Form/
│   └── Kernel.php
├── templates/                # Twig テンプレート
├── translations/
├── migrations/
├── tests/
├── var/                      # cache / log
├── vendor/
├── .env
└── composer.json

コントローラの書き方

getRepository(User::class)->findAll();
        return $this->render('user/index.html.twig', ['users' => $users]);
    }

    #[Route('/users/{id}', name: 'user_show', methods: ['GET'])]
    public function show(User $user): Response   // ParamConverter で自動取得
    {
        return $this->render('user/show.html.twig', ['user' => $user]);
    }

    #[Route('/users', name: 'user_create', methods: ['POST'])]
    public function create(Request $req, EntityManagerInterface $em): Response
    {
        $user = new User();
        $user->setName($req->request->get('name'));
        $em->persist($user);
        $em->flush();
        return $this->redirectToRoute('user_show', ['id' => $user->getId()]);
    }
}

Doctrine ORM

Symfony 標準の ORM は Doctrine(Eloquent ではない)。Data Mapper パターンを採用し、Active Record の Eloquent とは設計思想が違います。

id; }
    public function getName(): string { return $this->name; }
    public function setName(string $name): self { $this->name = $name; return $this; }
}

// 利用
$user = new User();
$user->setName('Tanaka')->setEmail('t@example.com');
$em->persist($user);
$em->flush();   // ここで初めて SQL 発行

MakerBundle(スキャフォールド)

composer require --dev symfony/maker-bundle

# Entity 生成(対話的)
bin/console make:entity User

# CRUD 自動生成
bin/console make:crud User

# コントローラ
bin/console make:controller Hello

# フォーム
bin/console make:form UserType User

# マイグレーション
bin/console make:migration
bin/console doctrine:migrations:migrate

# 認証
bin/console make:user
bin/console make:auth

Twig テンプレート

{# templates/user/index.html.twig #}
{% extends 'base.html.twig' %}

{% block title %}ユーザー一覧{% endblock %}

{% block body %}
  

ユーザー一覧

    {% for user in users %}
  • {{ user.name }} ({{ user.email }})
  • {% else %}
  • ユーザーがいません
  • {% endfor %}
{% endblock %}

Symfony を使っている主要プロダクト

プロダクトカテゴリSymfony の利用
LaravelフレームワークHttpFoundation / Console / Routing 等を内部利用
DrupalCMS8.x 以降のコアが Symfony Components ベース
Magento 2EC プラットフォームSymfony Components を多用
Sulu CMSCMSSymfony フルスタックで構築
eZ Platform / IbexaCMSSymfony ベース
Shopware 6ECSymfony フルスタック
OroCRM / OroCommerceBtoB EC / CRMSymfony ベース
API PlatformAPI 構築フレームワークSymfony Bundle として提供

強みと弱み

強み

  • コンポーネント化された疎結合設計: フレームワーク全体ではなくパーツ単位で採用できる
  • エンタープライズ品質: テストカバレッジが高く、後方互換ポリシーが厳格
  • 長期サポート (LTS): バージョンごとに 3 年セキュリティサポート
  • 表現力豊かな DI コンテナと autowiring
  • ドキュメントと公式チュートリアル(SymfonyCasts)が手厚い
  • 大規模・複雑なドメインに耐える設計(DDD と相性◎)

弱み

  • 学習コストが高い: 設定ファイルが多い・抽象度が高い・規約が緩い
  • 小規模 / 短納期だと Laravel の方が圧倒的に速い
  • 日本でのコミュニティ・書籍は Laravel / CakePHP より少ない
  • 標準で多機能 → 設定で迷う

Symfony CLI の便利機能

# 開発サーバ(HTTPS 対応)
symfony server:start --port=8000

# 環境変数チェック
symfony check:requirements

# 直近の例外を再表示
symfony console debug:dotenv
symfony console debug:container
symfony console debug:router

# プロジェクトのセキュリティチェック
symfony security:check

FAQ

Q: Laravel と Symfony はどちらを学ぶべき?
A: 速習・案件数なら Laravelエンタープライズ・基盤理解なら Symfony。Laravel 経験者が中身を知るために Symfony を学ぶのも有意義。

Q: Symfony Components だけ使える?
A: 可能。Composer で個別に composer require symfony/http-foundation 等で導入できます。フレームワーク全体を入れる必要はありません。

Q: Symfony 5/6 から 7 への移行は大変?
A: 同じメジャー系統内なら自動 Deprecation 警告に従えば 1 日程度。メジャーをまたぐと Rector / SymfonyMigrate を使って数日〜数週間。