Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
The English summary is being prepared. Showing the original description.
Writes Symfony PHP — DI container, bundles, Doctrine, Messenger, Security voters, console commands. For Laravel / Eloquent / Artisan use `laravel`. For framework-free PHP use `php-coder`.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
Use this skill for all Symfony-specific code generation and editing tasks, especially when working with:
services.yaml)This skill extends the base php-coder skill and applies Symfony conventions on top of the project's general PHP rules.
When the task is understanding how a Symfony app boots, wires its container, routes requests, or fails at runtime — defer to project-analysis-symfony first, then return here for the edit. This skill assumes the kernel/container layout is already known.
→ First apply the php-coder skill for general PHP rules.
Then add these Symfony-specific checks:
bin/console exists, composer.json lists symfony/framework-bundle.composer.lock for the framework-bundle major. 5.x → 6.x → 7.x differs in attribute routing, voter signatures, and Messenger DSN shape.src/Module/<Name>/), or DDD-style. Do not enforce a layout the project does not use.config/packages/<env>/, services.yaml autowiring vs explicit bindings, config/bundles.php.App\Service\Foo, not custom string IDs.public: true to make tests pass.new on classes that have collaborators.AbstractController only when the project doesRequest or a DTO; delegate business logic; return a Response variant#[Route] attributes on 6.x+; YAML routes only where the project already does.#[MapRequestPayload] / #[MapQueryString] (7.x+) for request DTOs when the project uses them.ParamConverter / argument resolvers for entities only when the project uses them.#[Assert\NotBlank], #[Assert\Email]) on 6.x+.ConstraintViolationListInterface — never compose error arrays by hand.#[AutoconfigureTag] or YAML tags, never an injected array of FQCNs.#[AsDecorator] (6.1+); respect priority.Container::get in application code.config/routes/.<resource>_<action> (user_show, invoice_list).#[IsGranted], #[RateLimit] at the route level, not inside the controller body.requirements: for path parameter constraints; do not validate in the controller.JsonResponse, API Platform, or redirects with flash.ConstraintViolationList → application/problem+json; DTOs / serializer groups, not raw entities.MessageHandlerInterface (5.x) or #[AsMessageHandler] (6.x+).framework.messenger.routing in config/packages/messenger.yaml.failure_transport explicitly — without it, failed messages disappear.#[AsEventListener] (6.1+) or EventSubscriberInterface — match the project's convention.UserRegistered, OrderPaid); one side-effect per subscriber.kernel.request / kernel.response — wrong priority is a frequent bug source.config/packages/security.yaml (main, API, admin).#[IsGranted] on actions; $this->isGranted() only when the result drives downstream logic.ParameterBagInterface or #[Autowire(param: ...)] — never $_ENV directly..env (+ .env.test); production values in deployment config.config/packages/<bundle>.yaml; env overrides under config/packages/<env>/.addSelect or EAGER when always needed.EntityManager::wrapInTransaction() for multi-write atomicity.PreFlush, PostUpdate) — no domain logic there unless the project already does.doctrine:migrations:diff; review before commit.up() and down().{% extends %} / {% include %} / macros.|raw only when content is provably safe.#[AsCommand] (6.x+); one command class per intent; constructor injection.--limit, --time-limit, graceful SIGTERM shutdown.OutputInterface — never echo.new on classes with collaborators.$_ENV / $_SERVER direct access — go through the parameter bag.public: true to make tests pass — use the test container.public: true.#[IsGranted] is a no-op if the controller is not a service (autoconfigure handles it by default).failure_transport is opt-in; without it, failures vanish.cache:clear in prod before debugging "config not applied".composer.lock before assuming 6.x patterns work.A DEPENDENCY PROVES A LIBRARY IS AVAILABLE. ONLY THE ENTRY POINT AND THE
ROUTER PROVE WHICH APPLICATION SHAPE IS RUNNING.
`symfony/*` PACKAGES WITH NO SKELETON MARKER IS A THIRD STATE, AND THIS SKILL
DOES NOT APPLY TO IT.
Symfony ships its ORM, container, collections and HTTP layer as independently installable packages, usable with no framework present — a published distribution model, not one consumer's arrangement. An application built that way has a custom entry point and a custom router. Routing it here offers a CLI that does not exist, a request-validation primitive that is not wired, and a routes file that was never there: every suggestion confidently wrong, and the reason visible only from the entry point.
The probe set, and its cost. A fixed set of filesystem existence checks plus one manifest read — no directory walk, no content scan, and never re-derived per session. Any ONE marker present means the framework is real:
| Probe | Meaning |
|---|---|
bin/console | the console entry point the skeleton writes |
config/bundles.php | the bundle registry |
config/services.yaml | the DI service config |
symfony/* in composer.json with none of those markers is
components-without-the-framework. Say so and route away from this skill rather
than answering as though the framework were there.
Implemented deterministically in src/install/detect_php_shape.ts
(detectPhpShape), whose PROBE_PATHS is this table and whose verdict names
what a wrong route would have offered.
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
The English summary is being prepared. Showing the original description.
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
The English summary is being prepared. Showing the original description.
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
The English summary is being prepared. Showing the original description.
Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review.
The English summary is being prepared. Showing the original description.
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
The English summary is being prepared. Showing the original description.
Use for an adversarial red-team / blue-team / auditor review of an AI agent's CONFIG + behaviour (rules, skills, MCP, hooks, permissions) — attack-chain → defensive-gap list, not a code audit.
The English summary is being prepared. Showing the original description.