タイトル: Symfony
SEOタイトル: Symfony (PHP フルスタックフレームワーク) 完全ガイド(コンポーネント・Laravel との関係)
| この記事の要点 |
|
Symfony とは
Symfony は 2005 年に SensioLabs 社(現 Symfony 社)の Fabien Potencier が開発を開始した、PHP のフルスタック Web フレームワークです。「Reusable PHP Components」の集合体として設計されており、フレームワーク全体としても、個別のライブラリとしても使えます。
歴史とリリース
| バージョン | リリース | 備考 |
|---|---|---|
| 1.x | 2007 | 初の安定版 |
| 2.x | 2011 | 完全リライト・コンポーネント化 |
| 3.x | 2015 | PSR-7 採用 / クリーンアップ |
| 4.x | 2017 | Flex / 軽量化・マイクロカーネル |
| 5.x | 2020 | PHP 7.2+ |
| 6.x LTS | 2021 | 長期サポート / PHP 8.0+ |
| 7.x | 2023 | PHP 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 |
| Mailer | symfony/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 | 役割 |
|---|---|
HttpFoundation | Request / Response / Session のオブジェクト化 |
HttpKernel | HTTP リクエストの処理パイプライン |
Routing | URL → コントローラのマッピング |
DependencyInjection | DI コンテナ(service container) |
EventDispatcher | Observer パターンの実装 |
Console | CLI コマンドの作成 |
Form | フォーム定義・レンダリング・バリデーション |
Validator | アノテーション / Attribute / YAML でバリデーション |
Security | 認証・認可 |
Twig | テンプレートエンジン(Symfony 公式) |
Messenger | 非同期メッセージング / Queue |
Mailer | メール送信 |
Workflow | ステートマシン / フロー管理 |
Translation | i18n / 多言語化 |
ディレクトリ構造
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
コントローラの書き方
<?php
// src/Controller/UserController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\User;
class UserController extends AbstractController
{
#[Route('/users', name: 'user_index', methods: ['GET'])]
public function index(EntityManagerInterface $em): Response
{
$users = $em->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 とは設計思想が違います。
<?php
// src/Entity/User.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\Table(name: 'users')]
class User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private string $name;
#[ORM\Column(length: 255, unique: true)]
private string $email;
public function getId(): ?int { return $this->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 %}
<h1>ユーザー一覧</h1>
<ul>
{% for user in users %}
<li>
<a href="{{ path('user_show', { id: user.id }) }}">
{{ user.name }}
</a>
({{ user.email }})
</li>
{% else %}
<li>ユーザーがいません</li>
{% endfor %}
</ul>
{% endblock %}
Symfony を使っている主要プロダクト
| プロダクト | カテゴリ | Symfony の利用 |
|---|---|---|
| Laravel | フレームワーク | HttpFoundation / Console / Routing 等を内部利用 |
| Drupal | CMS | 8.x 以降のコアが Symfony Components ベース |
| Magento 2 | EC プラットフォーム | Symfony Components を多用 |
| Sulu CMS | CMS | Symfony フルスタックで構築 |
| eZ Platform / Ibexa | CMS | Symfony ベース |
| Shopware 6 | EC | Symfony フルスタック |
| OroCRM / OroCommerce | BtoB EC / CRM | Symfony ベース |
| API Platform | API 構築フレームワーク | 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 を使って数日〜数週間。