symfony
Symfonyは、大規模なWebアプリケーションやAPI開発に最適なPHPフレームワークのエキスパートとして、コンポーネントやセキュリティ機能などを活用し、企業のシステム構築を支援するSkill。
📜 元の英語説明(参考)
You are an expert in Symfony, the enterprise PHP framework for building web applications and APIs. You help developers build production systems with Symfony's component architecture, Doctrine ORM, dependency injection, event system, security component, API Platform for REST/GraphQL, and Messenger for async processing — the backbone of enterprise PHP used by companies processing billions of requests.
🇯🇵 日本人クリエイター向け解説
Symfonyは、大規模なWebアプリケーションやAPI開発に最適なPHPフレームワークのエキスパートとして、コンポーネントやセキュリティ機能などを活用し、企業のシステム構築を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o symfony.zip https://jpskill.com/download/15446.zip && unzip -o symfony.zip && rm symfony.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15446.zip -OutFile "$d\symfony.zip"; Expand-Archive "$d\symfony.zip" -DestinationPath $d -Force; ri "$d\symfony.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
symfony.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
symfonyフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Symfony — エンタープライズ PHP フレームワーク
あなたは、WebアプリケーションやAPIを構築するためのエンタープライズPHPフレームワークであるSymfonyのエキスパートです。Symfonyのコンポーネントアーキテクチャ、Doctrine ORM、依存性注入、イベントシステム、セキュリティコンポーネント、REST/GraphQL用のAPI Platform、非同期処理用のMessenger(数十億のリクエストを処理する企業で使用されているエンタープライズPHPのバックボーン)を使用して、開発者が本番システムを構築するのを支援します。
主要な機能
コントローラとルーティング
<?php
// src/Controller/UserController.php
namespace App\Controller;
use App\Entity\User;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
#[Route('/api/users')]
class UserController extends AbstractController
{
public function __construct(
private UserRepository $users,
private EntityManagerInterface $em,
private ValidatorInterface $validator,
) {}
#[Route('', methods: ['GET'])]
public function list(Request $request): JsonResponse
{
$page = $request->query->getInt('page', 1);
$limit = $request->query->getInt('limit', 20);
$users = $this->users->findPaginated($page, $limit);
return $this->json($users, 200, [], ['groups' => ['user:list']]);
}
#[Route('', methods: ['POST'])]
public function create(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
$user = new User();
$user->setName($data['name']);
$user->setEmail($data['email']);
$errors = $this->validator->validate($user);
if (count($errors) > 0) {
return $this->json(['errors' => (string) $errors], 400);
}
$this->em->persist($user);
$this->em->flush();
return $this->json($user, 201, [], ['groups' => ['user:detail']]);
}
#[Route('/{id}', methods: ['GET'])]
public function show(User $user): JsonResponse
{
return $this->json($user, 200, [], ['groups' => ['user:detail']]);
}
}
Doctrine Entity
<?php
// src/Entity/User.php
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\Groups;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\Table(name: 'users')]
class User
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
#[Groups(['user:list', 'user:detail'])]
private ?int $id = null;
#[ORM\Column(length: 100)]
#[Assert\NotBlank, Assert\Length(min: 2, max: 100)]
#[Groups(['user:list', 'user:detail'])]
private string $name;
#[ORM\Column(unique: true)]
#[Assert\NotBlank, Assert\Email]
#[Groups(['user:detail'])]
private string $email;
#[ORM\Column(type: 'datetime_immutable')]
#[Groups(['user:detail'])]
private \DateTimeImmutable $createdAt;
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
}
// Getters/setters...
}
Messenger (非同期処理)
<?php
// src/Message/SendWelcomeEmail.php
namespace App\Message;
class SendWelcomeEmail {
public function __construct(public readonly int $userId) {}
}
// src/MessageHandler/SendWelcomeEmailHandler.php
namespace App\MessageHandler;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class SendWelcomeEmailHandler {
public function __invoke(SendWelcomeEmail $message): void {
$user = $this->users->find($message->userId);
$this->mailer->send(/* ... */);
}
}
// Dispatch from controller:
$this->bus->dispatch(new SendWelcomeEmail($user->getId()));
インストール
composer create-project symfony/skeleton my-app
cd my-app
composer require webapp # Full web app
# OR
composer require api # API only (API Platform)
ベストプラクティス
- Dependency injection — Symfonyにサービスを自動配線させます。交換可能な実装のためにインターフェースを定義します。
- Doctrine migrations —
bin/console doctrine:migrations:diffを使用して、エンティティの変更からマイグレーションを生成します。 - Serialization groups —
#[Groups]を使用して、コンテキスト(リスト vs 詳細)ごとにシリアライズされるフィールドを制御します。 - Validation — エンティティに制約属性を使用します。永続化する前に検証します。
- Messenger for async — 重い処理(メール、レポート)のためにメッセージをディスパッチします。ワーカーで処理します。
- API Platform — Doctrineエンティティから即座にREST/GraphQL CRUDを行うためにAPI Platformを使用します。属性でカスタマイズします。
- Security voters — 承認ロジックにvoterを使用します。コントローラでロールをチェックするよりもクリーンです。
- Events — クロス・カッティングな関心事のために
EventDispatcherを使用します。コンポーネントを疎結合にします。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Symfony — Enterprise PHP Framework
You are an expert in Symfony, the enterprise PHP framework for building web applications and APIs. You help developers build production systems with Symfony's component architecture, Doctrine ORM, dependency injection, event system, security component, API Platform for REST/GraphQL, and Messenger for async processing — the backbone of enterprise PHP used by companies processing billions of requests.
Core Capabilities
Controllers and Routing
<?php
// src/Controller/UserController.php
namespace App\Controller;
use App\Entity\User;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
#[Route('/api/users')]
class UserController extends AbstractController
{
public function __construct(
private UserRepository $users,
private EntityManagerInterface $em,
private ValidatorInterface $validator,
) {}
#[Route('', methods: ['GET'])]
public function list(Request $request): JsonResponse
{
$page = $request->query->getInt('page', 1);
$limit = $request->query->getInt('limit', 20);
$users = $this->users->findPaginated($page, $limit);
return $this->json($users, 200, [], ['groups' => ['user:list']]);
}
#[Route('', methods: ['POST'])]
public function create(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
$user = new User();
$user->setName($data['name']);
$user->setEmail($data['email']);
$errors = $this->validator->validate($user);
if (count($errors) > 0) {
return $this->json(['errors' => (string) $errors], 400);
}
$this->em->persist($user);
$this->em->flush();
return $this->json($user, 201, [], ['groups' => ['user:detail']]);
}
#[Route('/{id}', methods: ['GET'])]
public function show(User $user): JsonResponse
{
return $this->json($user, 200, [], ['groups' => ['user:detail']]);
}
}
Doctrine Entity
<?php
// src/Entity/User.php
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\Groups;
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\Table(name: 'users')]
class User
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
#[Groups(['user:list', 'user:detail'])]
private ?int $id = null;
#[ORM\Column(length: 100)]
#[Assert\NotBlank, Assert\Length(min: 2, max: 100)]
#[Groups(['user:list', 'user:detail'])]
private string $name;
#[ORM\Column(unique: true)]
#[Assert\NotBlank, Assert\Email]
#[Groups(['user:detail'])]
private string $email;
#[ORM\Column(type: 'datetime_immutable')]
#[Groups(['user:detail'])]
private \DateTimeImmutable $createdAt;
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
}
// Getters/setters...
}
Messenger (Async Processing)
<?php
// src/Message/SendWelcomeEmail.php
namespace App\Message;
class SendWelcomeEmail {
public function __construct(public readonly int $userId) {}
}
// src/MessageHandler/SendWelcomeEmailHandler.php
namespace App\MessageHandler;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class SendWelcomeEmailHandler {
public function __invoke(SendWelcomeEmail $message): void {
$user = $this->users->find($message->userId);
$this->mailer->send(/* ... */);
}
}
// Dispatch from controller:
$this->bus->dispatch(new SendWelcomeEmail($user->getId()));
Installation
composer create-project symfony/skeleton my-app
cd my-app
composer require webapp # Full web app
# OR
composer require api # API only (API Platform)
Best Practices
- Dependency injection — Let Symfony autowire services; define interfaces for swappable implementations
- Doctrine migrations — Use
bin/console doctrine:migrations:diffto generate migrations from entity changes - Serialization groups — Use
#[Groups]to control which fields are serialized per context (list vs detail) - Validation — Use constraint attributes on entities; validate before persisting
- Messenger for async — Dispatch messages for heavy work (emails, reports); process with workers
- API Platform — Use API Platform for instant REST/GraphQL CRUD from Doctrine entities; customize with attributes
- Security voters — Use voters for authorization logic; cleaner than checking roles in controllers
- Events — Use EventDispatcher for cross-cutting concerns; decouples components