Agent skill
symfony-doctrine-persistence
Symfony Doctrine persistence — repository adapters, entity mapping, migrations, transactions, database patterns. Triggers on: doctrine, repository, persistence, database, mapping, migration, ORM, entity manager, DBAL, transaction
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/symfony-doctrine-persistence
SKILL.md
Symfony Doctrine Persistence
You are an expert in Doctrine ORM within Symfony hexagonal architecture.
When to Activate
- User needs a repository implementation
- User asks about entity mapping
- User needs migration management
- User discusses transactions or database access
Core Rules
- Mapping NEVER in Domain: No
#[ORM\Entity]or annotations on domain entities - Mapping in Infrastructure: Use XML or separate mapping files in
Infrastructure/{Module}/Persistence/Mapping/ - Repository = Adapter: Implements domain port interface
- Event dispatch after persist: Repository dispatches domain events after flush
Repository Adapter Pattern
namespace App\Infrastructure\{Module}\Persistence;
use App\Domain\{Module}\Entity\{Entity};
use App\Domain\{Module}\Port\{Entity}RepositoryInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Messenger\MessageBusInterface;
final readonly class Doctrine{Entity}Repository implements {Entity}RepositoryInterface
{
public function __construct(
private EntityManagerInterface $entityManager,
private MessageBusInterface $eventBus,
) {
}
public function save({Entity} $entity): void
{
$this->entityManager->persist($entity);
$this->entityManager->flush();
foreach ($entity->pullDomainEvents() as $event) {
$this->eventBus->dispatch($event);
}
}
public function findById({Entity}Id $id): ?{Entity}
{
return $this->entityManager->find({Entity}::class, $id->value);
}
public function remove({Entity} $entity): void
{
$this->entityManager->remove($entity);
$this->entityManager->flush();
}
}
Mapping Strategies
Option A: XML Mapping (Recommended for strict separation)
<!-- src/Infrastructure/User/Persistence/Mapping/User.orm.xml -->
<doctrine-mapping>
<entity name="App\Domain\User\Entity\User" table="users">
<id name="id" type="string" column="id" />
<embedded name="email" class="App\Domain\User\ValueObject\Email" />
<field name="name" type="string" />
<field name="createdAt" type="datetime_immutable" column="created_at" />
</entity>
</doctrine-mapping>
Option B: PHP Attributes in Infrastructure
// Separate mapping class that maps to domain entity
// Configure in doctrine.yaml with mapping paths
Migration Workflow
Always ask the user which strategy they prefer:
- Auto-diff:
php bin/console doctrine:migrations:diff(generates from mapping) - Manual: Write migrations by hand for full control
References
See references/ for detailed guides:
repository-patterns.md— Repository patterns and transaction managementmapping-patterns.md— XML mapping, embeddables, relationsmigration-workflow.md— Migration strategies and best practices
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?