Code Snippets

Symfony

Console commands and config you will need again in six months: security attributes, forms, Doctrine, and the APIs that quietly moved.

Search these 9 posts

Everything in Symfony

  • Diagram: a role hierarchy showing ROLE_ADMIN above ROLE_USER, beside three IS_AUTHENTICATED variants marked with which ones a plain visitor passes.

    09/02/2026

    is_granted in Twig: roles and IS_AUTHENTICATED

    is_granted takes more than roles, and picking the wrong one gives you a check that quietly passes when it should not. What each attribute tests, why role hierarchy makes ROLE_USER true for your admins, and where the check belongs.

  • Diagram: a crossed-out FOSUserBundle block opening into four replacement components -- Security, MakerBundle, ResetPasswordBundle and VerifyEmailBundle.

    09/02/2026

    Leaving FOSUserBundle: what replaces each piece

    The bundle is maintained only enough for existing projects to migrate off it. Every piece it provided now has a replacement in Symfony itself or in two small bundles - and the migration is mostly deletion.

  • Diagram: individually labeled form_row fields inside a form_start/form_end frame, with a form_rest chip carrying the CSRF token at the bottom.

    09/02/2026

    Rendering a Symfony form field by field in Twig

    One call renders the whole form and gives you no say in the markup. Splitting it up is four functions, and the one that matters most is form_rest - the safety net that stops a forgotten field from silently disappearing.

  • Diagram: addError() called from a controller landing on a specific field's inline error and on the form's own top-level error banner.

    06/11/2015

    Adding a form error from a controller in Symfony

    Some checks cannot live in a constraint because they need something the form does not know about. FormError attaches the message to a field, or to the form itself, so it renders where the user is looking.

  • Diagram: the Request object at the center with arrows out to a Controller, a Service and a Twig template, and one arrow in from routing where the locale is set.

    01/01/2015

    Reading the current locale in Symfony

    The locale lives on the Request, not in a global. How to reach it from a controller, from a service that has no request, and from a template - and where it is set before any of that.

  • Diagram: setFirstResult and setMaxResults windowing a slice of a row stack, beside a fetch-joined collection case routed to Paginator instead.

    01/01/2015

    Limiting a Doctrine query with setMaxResults

    Here is an example of a simple DQL query in a custom repository method meant to return a single array result. The following will return the latest result in case there are multiple contact records that match the…

  • Diagram: MM and YYYY select fields feeding a DataTransformer that outputs a DateTime, beside a struck-through DateType with a hidden day control.

    11/19/2014

    A card expiry month/year field in Symfony

    The old answer was to render DateType's day dropdown and hide it with CSS. That works until somebody uses a screen reader. Two choice fields and a small transformer do the job honestly.

  • Diagram: a DataTransformer throwing an exception into a field that shows a generic message, beside an alternative field showing custom text built from the invalid value.

    08/20/2014

    invalid_message: what a failed transformer shows

    A transformer that cannot convert what was typed throws, and Symfony turns that into a message the user reads. Left alone it says nothing useful; invalid_message is where you replace it.

  • Diagram: Doctrine's flush() taking two paths, a silent commit or a thrown exception that has to be caught by type.

    11/19/2013

    Knowing whether a Doctrine insert or update worked

    Doctrine has no return value to check after flush() - it signals failure by throwing. Wrapping it is the right instinct, but the version of this snippet that has been circulating since 2013 catches nothing at all.