home / skills / pluginagentmarketplace / custom-plugin-php / php-symfony

php-symfony skill

/skills/php-symfony

This skill helps you master Symfony applications across Doctrine, DI, and API Platform, enabling robust enterprise-grade development.

npx playbooks add skill pluginagentmarketplace/custom-plugin-php --skill php-symfony

Review the files below or copy the command above to add this skill to your agents.

Files (6)
SKILL.md
5.7 KB
---
name: php-symfony
version: "2.0.0"
description: Symfony framework mastery - Doctrine, DI container, Messenger, and enterprise architecture
sasmp_version: "1.3.0"
bonded_agent: 03-php-symfony
bond_type: PRIMARY_BOND
atomic: true
category: framework
---

# Symfony Framework Skill

> Atomic skill for mastering enterprise-grade Symfony applications

## Overview

Comprehensive skill for building robust Symfony applications. Covers Symfony 6.4 LTS and 7.x with focus on Doctrine ORM, dependency injection, and API Platform.

## Skill Parameters

### Input Validation
```typescript
interface SkillParams {
  topic:
    | "doctrine"         // ORM, DBAL, migrations
    | "di-container"     // Services, autowiring, tags
    | "routing"          // Routes, controllers
    | "security"         // Voters, firewalls
    | "messenger"        // Async messaging
    | "api-platform"     // REST/GraphQL APIs
    | "forms";           // Form types, validation

  level: "beginner" | "intermediate" | "advanced";
  symfony_version?: "6.4" | "7.0" | "7.1" | "7.2";
  project_type?: "webapp" | "api" | "microservice";
}
```

### Validation Rules
```yaml
validation:
  topic:
    required: true
    allowed: [doctrine, di-container, routing, security, messenger, api-platform, forms]
  level:
    required: true
  symfony_version:
    default: "7.1"
```

## Learning Modules

### Module 1: Doctrine ORM
```yaml
beginner:
  - Entity creation with attributes
  - Basic relationships
  - Repository basics

intermediate:
  - DQL and QueryBuilder
  - Lifecycle events
  - Custom repository methods

advanced:
  - Inheritance mapping
  - Second-level cache
  - Event subscribers
```

### Module 2: Dependency Injection
```yaml
beginner:
  - Service basics
  - Autowiring
  - Constructor injection

intermediate:
  - Service tags
  - Factory services
  - Decorators

advanced:
  - Compiler passes
  - Service subscribers
  - Lazy services
```

### Module 3: Messenger Component
```yaml
beginner:
  - Messages and handlers
  - Sync vs async transports

intermediate:
  - Message middleware
  - Retry strategies
  - Multiple transports

advanced:
  - Custom transports
  - Saga patterns
```

## Execution Flow

```mermaid
graph TD
    A[Skill Invoked] --> B{Validate}
    B -->|Invalid| C[Return Error]
    B -->|Valid| D[Load Content]
    D --> E{Topic Router}
    E --> F[Generate Examples]
    F --> G[Add Console Commands]
```

## Error Handling & Retry Logic

```yaml
errors:
  CONTAINER_ERROR:
    code: "SYMFONY_001"
    recovery: "Run cache:clear, check services.yaml"

  DOCTRINE_ERROR:
    code: "SYMFONY_002"
    recovery: "Run doctrine:schema:validate"

retry:
  max_attempts: 3
  backoff:
    type: exponential
    initial_delay_ms: 100
```

## Code Examples

### Doctrine Entity
```php
<?php
declare(strict_types=1);

namespace App\Entity;

use App\Repository\ProductRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

#[ORM\Entity(repositoryClass: ProductRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Product
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 255)]
    #[Assert\NotBlank]
    private string $name;

    #[ORM\ManyToOne(inversedBy: 'products')]
    #[ORM\JoinColumn(nullable: false)]
    private Category $category;

    #[ORM\Column]
    private \DateTimeImmutable $createdAt;

    public function __construct()
    {
        $this->createdAt = new \DateTimeImmutable();
    }
}
```

### Service with DI
```php
<?php
declare(strict_types=1);

namespace App\Service;

use App\Repository\ProductRepository;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;

final readonly class ProductService
{
    public function __construct(
        private ProductRepository $repository,
        private EntityManagerInterface $entityManager,
        private LoggerInterface $logger,
        #[Autowire('%app.tax_rate%')]
        private float $taxRate,
    ) {}

    public function createProduct(array $data): Product
    {
        $product = new Product();
        $product->setName($data['name']);

        $this->entityManager->persist($product);
        $this->entityManager->flush();

        $this->logger->info('Product created', ['id' => $product->getId()]);

        return $product;
    }
}
```

### Messenger Handler
```php
<?php
declare(strict_types=1);

namespace App\MessageHandler;

use App\Message\SendOrderConfirmation;
use App\Service\EmailService;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;

#[AsMessageHandler]
final readonly class SendOrderConfirmationHandler
{
    public function __construct(
        private EmailService $emailService,
    ) {}

    public function __invoke(SendOrderConfirmation $message): void
    {
        $this->emailService->sendOrderConfirmation($message->orderId);
    }
}
```

## Test Templates

```php
<?php
declare(strict_types=1);

namespace App\Tests\Functional;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

final class ProductControllerTest extends WebTestCase
{
    public function testListProducts(): void
    {
        $client = static::createClient();
        $client->request('GET', '/api/products');

        $this->assertResponseIsSuccessful();
    }
}
```

## Troubleshooting

| Problem | Solution |
|---------|----------|
| Service not found | Run `debug:container`, check autowiring |
| Doctrine mapping error | Run `doctrine:schema:validate` |
| Route not found | Run `debug:router`, check firewall |

## Quality Metrics

| Metric | Target |
|--------|--------|
| Code accuracy | 100% |
| Symfony conventions | 100% |
| DI best practices | 100% |

## Usage

```
Skill("php-symfony", {topic: "messenger", level: "advanced"})
```

Overview

This skill provides practical mastery of enterprise-grade Symfony applications, focused on Doctrine ORM, the dependency injection container, Messenger, and API design. It targets Symfony 6.4 and 7.x and delivers clear patterns, code examples, and troubleshooting steps for production-ready projects. Use it to speed up onboarding and standardize architecture across webapps, APIs, and microservices.

How this skill works

The skill validates requested topic and level, then loads focused content modules for Doctrine, DI, routing, security, Messenger, API Platform, or forms. It generates concrete examples, console commands, and test templates tailored to the chosen Symfony version and project type. Built-in error codes and retry suggestions point to common fixes like cache clearing and doctrine schema validation.

When to use it

  • When adding or refactoring Doctrine entities, repositories, or migrations
  • When designing services: autowiring, tags, factories, or compiler passes
  • When implementing asynchronous flows with Messenger and multiple transports
  • When building REST/GraphQL APIs with API Platform or custom controllers
  • When hardening authentication, voters, and firewall configuration

Best practices

  • Prefer constructor injection and autowiring; use service attributes for clarity
  • Keep Doctrine entities simple; push business logic into services and repositories
  • Use message handlers for side effects; apply retry and middleware for resilience
  • Register tags and compiler passes only when necessary; favor clear service contracts
  • Write lightweight functional tests for controllers and integration tests for critical flows

Example use cases

  • Create a Product entity with lifecycle callbacks, validations, and repository methods
  • Implement a ProductService using EntityManager, repositories, and a configured tax rate
  • Set up Messenger with multiple transports, retry strategies, and a custom middleware
  • Expose entities via API Platform and add DTOs or custom normalizers for complex responses
  • Debug service resolution with debug:container and resolve doctrine mapping issues with doctrine:schema:validate

FAQ

Which Symfony versions does this skill target?

It focuses on Symfony 6.4 LTS and the 7.x series, with a default of 7.1 if unspecified.

What error recovery steps are recommended for container or Doctrine issues?

For container errors clear cache and inspect services.yaml; for Doctrine run doctrine:schema:validate and check entity mappings.