3.

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

コントローラの書き方

<?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 等を内部利用
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 を使って数日〜数週間。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Laravel
  2. CakePHP
  3. Symfony
  4. Zend Framework (PHP フレームワーク)
  5. DietCake
  6. phalcon
  7. CodeIgniter
  8. FuelPHP
  9. Slim
  10. Flight
  11. Yii
  12. Silex

最近更新/作成されたページ