Master API Platform 4.3 serialization — design groups (entity:operation convention, read ≠ write), force IRI on relations with #[ApiProperty(readableLink: false, writableLink: false)], prevent circular references with MaxDepth, use BackedEnum natively, apply #[Context] for per-property formats, install a Context…
Write or evolve an API Platform 4.3 State Processor — turn a DTO Input into a persistence effect (Doctrine + dispatch). Covers the Autowire-based decoration of apiplatform.doctrine.orm.state.persistprocessor / removeprocessor, the DeleteOperationInterface discriminator, the native Messenger modes (messenger: 'input'…
Write or evolve an API Platform 4.3 State Provider — transform a data source (Doctrine, external API, cache) into the API representation. Covers the modern Autowire-based decoration of apiplatform.doctrine.orm.state.itemprovider / collectionprovider, the CollectionOperationInterface discriminator, header-versioned…
Implement the canonical API Platform 4.3 + Symfony 7.4+ User entity — User implements UserInterface, PasswordAuthenticatedUserInterface, #[UniqueEntity('email')], a transient $plainPassword validated only on user:create, the persisted hashed $password excluded from every serialization group, a UserPasswordHasher State…
Plan and implement API Platform 4.3 versioning — URI versioning (/v1/, /v2/), separate Output DTOs per version (with dedicated Providers), header-based versioning (X-API-Version resolved in a versioned Provider), additive group-based versioning for minor changes, deprecation with the 4.x attribute (deprecationReason…
Pre-architecture brainstorming for an API Platform feature — when the story isn't yet stable enough to feed /architect. Explores requirements, identifies invariants, considers alternatives, surfaces unknowns, defines the smallest valuable slice. Output: a refined story description ready for /architect or…
Refactor fat controllers into thin orchestrators — extract business logic to services, use #[MapRequestPayload] / #[MapQueryString] for input DTOs, dispatch to handlers via MessageBusInterface, #[IsGranted] attributes for authz, slim action methods to 5-10 lines, separate Form DTOs from entities. For API Platform…
Implement CQRS in Symfony — separate Command (write intent, final readonly) from Query (read intent), one #[AsMessageHandler] per command/query, dedicated buses (command.bus, query.bus) with doctrinetransaction middleware on the command side, HandledStamp::getResult() for return values. Domain Events (sync, same…