<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
>
    <channel>
        <title>Symfony Blog</title>
        <atom:link href="https://feeds.feedburner.com/symfony/blog" rel="self" type="application/rss+xml" />
        <link>https://symfony.com/blog/</link>
        <description>Most recent posts published on the Symfony project blog</description>
        <pubDate>Sun, 17 May 2026 08:19:57 +0200</pubDate>
        <lastBuildDate>Fri, 15 May 2026 13:30:00 +0200</lastBuildDate>
        <language>en</language>
                        <item>
            <title><![CDATA[SymfonyDay Montreal 2026: Symfony 8: The Hexagonal Track]]></title>
            <link>https://symfony.com/blog/symfonyday-montreal-2026-symfony-8-the-hexagonal-track?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    


SymfonyDay Montreal 2026 is happening on June 4 at L&#039;Espace Quartier Latin (UQAM). It&#039;s the perfect opportunity to sharpen your skills and meet the core team in Canada!

🎤 Speaker announcement!

We are thrilled to host Robin Chalas, CEO &amp;amp; Co-Founder,…</description>
            <content:encoded><![CDATA[
                                <p><a class="block text-center" href="https://live.symfony.com/2026-montreal/">
    <img src="https://symfony.com/uploads/assets/blog/HEADER-1200x440px-at-3x-5.png" alt="Header 1200X440Px At 3X 5">
</a></p>

<p><strong><a href="https://live.symfony.com/2026-montreal/">SymfonyDay Montreal 2026</a></strong> is happening on June 4 at L'Espace Quartier Latin (UQAM). It's the perfect opportunity to sharpen your skills and meet the core team in Canada!</p>

<h2>🎤 Speaker announcement!</h2>

<p>We are thrilled to host <strong><a href="https://connect.symfony.com/profile/chalasr">Robin Chalas</a></strong>, CEO &amp; Co-Founder, baksla.sh, for his talk <strong>"<a href="https://live.symfony.com/2026-montreal/schedule/symfony-8-the-hexagonal-track">Symfony 8: The Hexagonal Track</a>"</strong>:</p>

<p>Structuring an application around its domain rather than its framework is an old idea. Making it practical has sometimes felt like swimming against the current.</p>

<p>Thanks to the way Symfony 8 leverages modern PHP, this drastically changes. Recent evolutions in both the language and the framework align naturally with hexagonal thinking and tactical DDD patterns — no workarounds, no fighting the tools.</p>

<p>Join me as I wear both my Core Team member and DDD practitioner hats to give a pragmatic look at putting your business logic first, building applications that scale with your domain's complexity and remain maintainable as they grow, with Symfony's blessing.</p>

<p>👉 Discover more talks by reading the <strong><a href="https://live.symfony.com/2026-montreal/schedule">full schedule</a></strong></p>

<p><a class="block text-center" href="https://live.symfony.com/2026-montreal/" title="Nl Blog Banner Symfonyday">
    <img src="https://symfony.com/uploads/assets/blog/NL-BLOG-Banner-SymfonyDay.jpg" alt="Nl Blog Banner Symfonyday">
</a></p>

<h3>🎟️ Register Now</h3>

<p>Limited seating available! Make sure to <strong><a href="https://live.symfony.com/2026-montreal/registration">register here</a></strong> to join the gathering.</p>

<h3>📍 Our Venue: L’Espace Quartier Latin</h3>

<p>We are gathering at <strong><a href="https://maps.app.goo.gl/KV48kYKqY7hu982q9">L’Espace Quartier Latin</a></strong> at UQAM! The venue is extremely easy to reach, both by public transport and by private transport.</p>

<h3>🤲 L’apéro – Let’s Celebrate Together</h3>

<p>After a full day of learning, it’s time to relax. We invite all attendees to join us for a community drink in the evening thanks to <strong><a href="https://pimcore.com/fr/">Pimcore</a></strong>'s support. It’s a wonderful opportunity to chat with the speakers, meet fellow developers, and enjoy the unique Montreal atmosphere. <em>Santé !</em></p>

<p>We can’t wait to see you on <strong>June 4th!</strong></p>

<hr />

<h3>Join us online!</h3>

<p>💡Follow the "conference" blog posts to not miss anything!</p>

<p>Want the latest Symfony updates? Follow us and tune in from wherever you are 🌎</p>

<p><a class="block text-center" href="https://linktr.ee/symfony">
   <img src="https://symfony.com/uploads/assets/blog/Banner-BLOG.png" alt="Banner Blog">
</a></p>

                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfonyday-montreal-2026-symfony-8-the-hexagonal-track?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Eloïse Charrier ]]></dc:creator>
            <pubDate>Fri, 15 May 2026 13:30:00 +0200</pubDate>
            <comments>https://symfony.com/blog/symfonyday-montreal-2026-symfony-8-the-hexagonal-track?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[New in Symfony 8.1: Translation Improvements]]></title>
            <link>https://symfony.com/blog/new-in-symfony-8-1-translation-improvements?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 8.1 brings several improvements to the translation system: broader
XLIFF format support, a more flexible enabled_locales configuration, a
better translated placeholder for expanded choice fields, and a new helper
class to compute locale fallback chains.…</description>
            <content:encoded><![CDATA[
                                <p>Symfony 8.1 brings several improvements to the <a href="https://symfony.com/translation" class="reference external">translation</a> system: broader
XLIFF format support, a more flexible <code translate="no" class="notranslate">enabled_locales</code> configuration, a
better translated placeholder for expanded choice fields, and a new helper
class to compute locale fallback chains.</p>
<div class="section">
<h2 id="using-environment-variables-in-enabled-locales"><a class="headerlink" href="#using-environment-variables-in-enabled-locales" title="Permalink to this headline">Using Environment Variables in Enabled Locales</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/nicolas-grekas">
                <img src="https://connect.symfony.com/profile/nicolas-grekas.picture" alt="Nicolas Grekas">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/nicolas-grekas">Nicolas Grekas</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/63121">#63121</a>
                                                </span>
            </div>
</div>
<p>The <a href="https://symfony.com/doc/current/reference/configuration/framework.html#enabled-locales" class="reference external">framework.enabled_locales</a> configuration option used to require a
hard-coded list of locales. In Symfony 8.1 you can use environment variables
in this list directly. Empty values are filtered out automatically, so you can
declare a fixed number of slots and leave some of them empty:</p>
<div translate="no" data-loc="7" class="notranslate codeblock codeblock-length-sm codeblock-yaml">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-comment"># config/packages/translation.yaml</span>
<span class="hljs-attr">framework:</span>
    <span class="hljs-attr">enabled_locales:</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">'%env(LOCALE_1)%'</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">'%env(LOCALE_2)%'</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">'%env(LOCALE_3)%'</span>
        <span class="hljs-bullet">-</span> <span class="hljs-string">'%env(LOCALE_4)%'</span></code></pre>
    </div>
</div>
<p>This is useful when the list of enabled locales depends on the deployment
environment. For example, different tenants may enable different subsets of
languages without requiring a separate configuration file per environment.</p>
</div>
<div class="section">
<h2 id="translated-placeholder-on-expanded-choice-fields"><a class="headerlink" href="#translated-placeholder-on-expanded-choice-fields" title="Permalink to this headline">Translated Placeholder on Expanded Choice Fields</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/eyupcanakman">
                <img src="https://github.com/eyupcanakman.png" alt="Eyüp Can Akman">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/eyupcanakman">Eyüp Can Akman</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/63727">#63727</a>
                                                </span>
            </div>
</div>
<p>When a <code translate="no" class="notranslate">ChoiceType</code> is rendered as a group of radio buttons or checkboxes
(<code translate="no" class="notranslate">expanded: true</code>), its <code translate="no" class="notranslate">placeholder</code> label used the <a href="https://symfony.com/doc/current/reference/forms/types/choice.html#choice-translation-domain" class="reference external">choice_translation_domain</a>
option for translation.</p>
<p>This caused problems with <a href="https://symfony.com/doc/current/reference/forms/types/entity.html" class="reference external">EntityType</a>, whose <code translate="no" class="notranslate">choice_translation_domain</code>
defaults to <code translate="no" class="notranslate">false</code>. As a result, <code translate="no" class="notranslate">TranslatableMessage</code> placeholders were
never translated even when an explicit <code translate="no" class="notranslate">translation_domain</code> was configured.</p>
<p>In Symfony 8.1, placeholders for expanded choice fields now use
<code translate="no" class="notranslate">translation_domain</code>, matching the behavior of non-expanded <code translate="no" class="notranslate">&lt;select&gt;</code> fields:</p>
<div translate="no" data-loc="10" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">Translation</span>\<span class="hljs-title">TranslatableMessage</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Bridge</span>\<span class="hljs-title">Doctrine</span>\<span class="hljs-title">Form</span>\<span class="hljs-title">Type</span>\<span class="hljs-title">EntityType</span>;

<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>form</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>this</span>-&gt;<span class="hljs-title invoke__">createForm</span>(EntityType::<span class="hljs-variable language_">class</span>, <span class="hljs-keyword">null</span>, [
    <span class="hljs-string">'class'</span> =&gt; Country::<span class="hljs-variable language_">class</span>,
    <span class="hljs-string">'expanded'</span> =&gt; <span class="hljs-keyword">true</span>,
    <span class="hljs-comment">// this placeholder is now translated using the 'forms' domain.</span>
    <span class="hljs-string">'placeholder'</span> =&gt; <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">TranslatableMessage</span>(<span class="hljs-string">'select_a_country'</span>, [], <span class="hljs-string">'forms'</span>),
    <span class="hljs-string">'translation_domain'</span> =&gt; <span class="hljs-string">'forms'</span>,
]);</code></pre>
    </div>
</div>
</div>
<div class="section">
<h2 id="new-localefallbackprovider-class"><a class="headerlink" href="#new-localefallbackprovider-class" title="Permalink to this headline">New <code translate="no" class="notranslate">LocaleFallbackProvider</code> Class</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/mpdude">
                <img src="https://connect.symfony.com/profile/mpdude.picture" alt="Matthias Pigulla">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/mpdude">Matthias Pigulla</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/45553">#45553</a>
                                                </span>
            </div>
</div>
<p>Applications with many regional locales often need to compute locale fallback
chains consistently across different services and components.</p>
<p>Symfony resolves these fallback chains by following ICU parent mappings,
shortening locale sub-tags, and finally appending any configured fallback
locales. Until now, this logic lived inside the <code translate="no" class="notranslate">Translator</code> class.</p>
<p>In Symfony 8.1, this logic is extracted into a dedicated reusable
<code translate="no" class="notranslate">LocaleFallbackProvider</code> class:</p>
<div translate="no" data-loc="5" class="notranslate codeblock codeblock-length-sm codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">Translation</span>\<span class="hljs-title">LocaleFallbackProvider</span>;

<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>provider</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">LocaleFallbackProvider</span>([<span class="hljs-string">'en'</span>]);
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>fallbacks</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>provider</span>-&gt;<span class="hljs-title invoke__">computeFallbackLocales</span>(<span class="hljs-string">'es_AR'</span>);
<span class="hljs-comment">// ['es_419', 'es', 'en']</span></code></pre>
    </div>
</div>
<p>The class also provides a static helper to validate locale strings. It throws
an <code translate="no" class="notranslate">InvalidArgumentException</code> when the locale contains invalid characters:</p>
<div translate="no" data-loc="1" class="notranslate codeblock codeblock-length-sm codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code>LocaleFallbackProvider::<span class="hljs-title invoke__">validateLocale</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>locale</span>);</code></pre>
    </div>
</div>
</div>
<div class="section">
<h2 id="support-for-xliff-versions-2-1-and-2-2"><a class="headerlink" href="#support-for-xliff-versions-2-1-and-2-2" title="Permalink to this headline">Support for XLIFF Versions 2.1 and 2.2</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/alexandre-daubois">
                <img src="https://connect.symfony.com/profile/alexandre-daubois.picture" alt="Alexandre Daubois">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/alexandre-daubois">Alexandre Daubois</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/63455">#63455</a>
                                                </span>
            </div>
</div>
<p>Symfony previously accepted only XLIFF 1.2 and 2.0 files. Translation files
declaring <code translate="no" class="notranslate">version="2.1"</code> or <code translate="no" class="notranslate">version="2.2"</code> were rejected even though
their structure is fully compatible with XLIFF 2.0.</p>
<p>This could become an issue when using newer localization platforms or
translation tooling that already generate XLIFF 2.1 or 2.2 files by default.
Symfony 8.1 now accepts these newer version numbers transparently:</p>
<div translate="no" data-loc="12" class="notranslate codeblock codeblock-length-md codeblock-xml">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">xliff</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"urn:oasis:names:tc:xliff:document:2.0"</span>
    <span class="hljs-attr">version</span>=<span class="hljs-string">"2.2"</span> <span class="hljs-attr">srcLang</span>=<span class="hljs-string">"en"</span> <span class="hljs-attr">trgLang</span>=<span class="hljs-string">"fr"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">file</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"f1"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">unit</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"welcome"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">segment</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">source</span>&gt;</span>Welcome<span class="hljs-tag">&lt;/<span class="hljs-name">source</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">target</span>&gt;</span>Bienvenue<span class="hljs-tag">&lt;/<span class="hljs-name">target</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">segment</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">unit</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">xliff</span>&gt;</span></code></pre>
    </div>
</div>
</div>
<div class="section">
<h2 id="support-for-xliff-pgs-module"><a class="headerlink" href="#support-for-xliff-pgs-module" title="Permalink to this headline">Support for XLIFF PGS Module</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/alexandre-daubois">
                <img src="https://connect.symfony.com/profile/alexandre-daubois.picture" alt="Alexandre Daubois">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/alexandre-daubois">Alexandre Daubois</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/63465">#63465</a>
                                                </span>
            </div>
</div>
<p>XLIFF 2.2 introduces the <a href="https://docs.oasis-open.org/xliff/xliff-core/v2.2/xliff-extended-v2.2-part2.html#plural_gender_select_module" class="reference external" rel="external noopener noreferrer" target="_blank">PGS module</a> (Plural, Gender and Select), which
allows translators to express plural, gender, and select variations directly
inside XLIFF files.</p>
<p>Symfony 8.1 understands these attributes, converts them internally to ICU
MessageFormat, and registers the result in the <code translate="no" class="notranslate">+intl-icu</code> translation
domain. This means the translations work transparently with <code translate="no" class="notranslate">trans()</code>:</p>
<div translate="no" data-loc="21" class="notranslate codeblock codeblock-length-md codeblock-xml">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">xliff</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"urn:oasis:names:tc:xliff:document:2.0"</span>
    <span class="hljs-attr">xmlns:pgs</span>=<span class="hljs-string">"urn:oasis:names:tc:xliff:pgs:1.0"</span>
    <span class="hljs-attr">version</span>=<span class="hljs-string">"2.2"</span> <span class="hljs-attr">srcLang</span>=<span class="hljs-string">"en"</span> <span class="hljs-attr">trgLang</span>=<span class="hljs-string">"fr"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">file</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"f1"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">unit</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"file_deleted"</span> <span class="hljs-attr">pgs:switch</span>=<span class="hljs-string">"plural:file_count"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">segment</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"s1"</span> <span class="hljs-attr">pgs:case</span>=<span class="hljs-string">"0"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">source</span>&gt;</span>You deleted no file.<span class="hljs-tag">&lt;/<span class="hljs-name">source</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">target</span>&gt;</span>Vous n'avez supprimé aucun fichier.<span class="hljs-tag">&lt;/<span class="hljs-name">target</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">segment</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">segment</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"s2"</span> <span class="hljs-attr">pgs:case</span>=<span class="hljs-string">"1"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">source</span>&gt;</span>You deleted one file.<span class="hljs-tag">&lt;/<span class="hljs-name">source</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">target</span>&gt;</span>Vous avez supprimé un fichier.<span class="hljs-tag">&lt;/<span class="hljs-name">target</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">segment</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">segment</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"s3"</span> <span class="hljs-attr">pgs:case</span>=<span class="hljs-string">"other"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">source</span>&gt;</span>You deleted <span class="hljs-tag">&lt;<span class="hljs-name">ph</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">disp</span>=<span class="hljs-string">"file_count"</span>/&gt;</span> files.<span class="hljs-tag">&lt;/<span class="hljs-name">source</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">target</span>&gt;</span>Vous avez supprimé <span class="hljs-tag">&lt;<span class="hljs-name">ph</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">disp</span>=<span class="hljs-string">"file_count"</span>/&gt;</span> fichiers.<span class="hljs-tag">&lt;/<span class="hljs-name">target</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">segment</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">unit</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">xliff</span>&gt;</span></code></pre>
    </div>
</div>
<p>The <code translate="no" class="notranslate">pgs:switch</code> attribute defines the variable name and switch type
(<code translate="no" class="notranslate">plural</code>, <code translate="no" class="notranslate">gender</code>, or <code translate="no" class="notranslate">select</code>), while each <code translate="no" class="notranslate">&lt;segment&gt;</code> uses
<code translate="no" class="notranslate">pgs:case</code> to match a value.</p>
<p>You can also combine multiple switches in a single attribute. For example,
<code translate="no" class="notranslate">pgs:switch="gender:host_gender plural:guest_count"</code>. Symfony automatically
nests the generated ICU structures as needed.</p>
</div>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/new-in-symfony-8-1-translation-improvements?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Thu, 14 May 2026 09:55:00 +0200</pubDate>
            <comments>https://symfony.com/blog/new-in-symfony-8-1-translation-improvements?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 8.1.0-BETA2 released]]></title>
            <link>https://symfony.com/blog/symfony-8-1-0-beta2-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 8.1.0-BETA2 has just been released.
This is a pre-release version of Symfony 8.1. If you want to test it
in your own applications before its final release, run the following commands:

        
        1
2
3
        $ composer config minimum-stability…</description>
            <content:encoded><![CDATA[
                                <p><a href="#Symfony%208.1.0-BETA2" class="reference internal">Symfony 8.1.0-BETA2</a> has just been released.</p>
<p>This is a pre-release version of Symfony 8.1. If you want to test it
in your own applications before its final release, run the following commands:</p>
<div translate="no" data-loc="3" class="notranslate codeblock codeblock-length-sm codeblock-terminal codeblock-bash">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-prompt">$ </span>composer config minimum-stability beta
<span class="hljs-prompt">$ </span>composer config extra.symfony.require <span class="hljs-string">"8.1.*"</span>
<span class="hljs-prompt">$ </span>composer update</code></pre>
    </div>
</div>
<p>These commands assume that all your Symfony dependencies in <code translate="no" class="notranslate">composer.json</code>
use <code translate="no" class="notranslate">*</code> as their version constraint. Otherwise, you will need to update
the version constraints of those Symfony dependencies to <code translate="no" class="notranslate">8.1.*</code>.</p>
<p>Read the <a href="https://symfony.com/doc/current/setup/upgrade_major.html" class="reference external">Symfony upgrade guide</a> to learn more about upgrading Symfony
and use the <a href="https://insight.symfony.com/" class="reference external">SymfonyInsight upgrade reports</a> to detect the code you will
need to change in your project.</p>
<div class="admonition admonition-tip ">
    <p class="admonition-title">
                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" width="24" height="24" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path></svg>
                <span>Tip</span>
    </p><p>Want to be notified whenever a new Symfony release is published? Or when a
version is not maintained anymore? Or only when a security issue is fixed?
Consider <a href="https://symfony.com/account/notifications" class="reference external">subscribing to the Symfony Roadmap Notifications</a>.</p>
</div>
<div class="section">
<h2 id="changelog-since-symfony-8-1-0-beta1"><a class="headerlink" href="#changelog-since-symfony-8-1-0-beta1" title="Permalink to this headline">Changelog Since Symfony 8.1.0-BETA1</a></h2>
<ul>
    <li>data <a href="https://github.com/symfony/symfony/pull/64203" class="reference external" rel="external noopener noreferrer" target="_blank">#64203</a> Release v8.1.0-BETA2</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64198" class="reference external" rel="external noopener noreferrer" target="_blank">#64198</a> [SecurityBundle] Allow defining security provider factories without config (@hockdudu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64189" class="reference external" rel="external noopener noreferrer" target="_blank">#64189</a> [FrameworkBundle] Bump Request/Session value resolver priority above EntityValueResolver (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64197" class="reference external" rel="external noopener noreferrer" target="_blank">#64197</a> [Messenger] Ensure SigningSerializer won't decode before verifying the signature (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64195" class="reference external" rel="external noopener noreferrer" target="_blank">#64195</a> [Security] Remove the legacy nested unserialize() call from token and exception classes (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64196" class="reference external" rel="external noopener noreferrer" target="_blank">#64196</a> [Yaml] Reject non-stringables when using "!!binary" (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64191" class="reference external" rel="external noopener noreferrer" target="_blank">#64191</a> [Inflector][String] Fixed singularize traces &gt; trace (@ruudk)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64192" class="reference external" rel="external noopener noreferrer" target="_blank">#64192</a> [Mailer] Use hash_equals() to compare webhook signatures for AhaSend (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64193" class="reference external" rel="external noopener noreferrer" target="_blank">#64193</a> [Notifier] Use hash_equals() to compare webhook signatures for Vonage (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64180" class="reference external" rel="external noopener noreferrer" target="_blank">#64180</a> [Messenger][Amqp] Fix support for RabbitMQ v4 by adding delayed quorum queues (@Jean85)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64187" class="reference external" rel="external noopener noreferrer" target="_blank">#64187</a> [AssetMapper] Warn on missing bare CSS and JSON imports (@ousamabenyounes)</li>
<li>feature <a href="https://github.com/symfony/symfony/pull/61936" class="reference external" rel="external noopener noreferrer" target="_blank">#61936</a> [Messenger] Allow to respect retry strategy with RecoverableMessageHandlingException (@VincentLanglet)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64182" class="reference external" rel="external noopener noreferrer" target="_blank">#64182</a> [Console] Fix signal handler scoping (@jpollard3)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64181" class="reference external" rel="external noopener noreferrer" target="_blank">#64181</a> [Security] Preserve webserver base URL in HttpUtils::createRequest() (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64058" class="reference external" rel="external noopener noreferrer" target="_blank">#64058</a> [Process] Ignore array env values before proc_open (@dionisvl)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64179" class="reference external" rel="external noopener noreferrer" target="_blank">#64179</a> [Filesystem] preserve source mode when copying files (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64176" class="reference external" rel="external noopener noreferrer" target="_blank">#64176</a> [Console] Make ConsoleSectionOutput::overwrite() atomic to fix sections + ProgressIndicator clear (@Amoifr)</li>
<li>feature <a href="https://github.com/symfony/symfony/pull/63770" class="reference external" rel="external noopener noreferrer" target="_blank">#63770</a> [HttpClient] Add custom DNS resolution using a decorator (@peter17)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64158" class="reference external" rel="external noopener noreferrer" target="_blank">#64158</a> [Form] Fix array_flip() warning in expanded+multiple ChoiceType on partial submit (@SAY-5)</li>
<li>feature <a href="https://github.com/symfony/symfony/pull/64156" class="reference external" rel="external noopener noreferrer" target="_blank">#64156</a> [Validator] Add findByCodes() to ConstraintViolationListInterface (@michaelthieulin)</li>
<li>feature <a href="https://github.com/symfony/symfony/pull/64160" class="reference external" rel="external noopener noreferrer" target="_blank">#64160</a> [HttpClient] Add $allowList argument to NoPrivateNetworkHttpClient (@Amoifr)</li>
<li>feature <a href="https://github.com/symfony/symfony/pull/64163" class="reference external" rel="external noopener noreferrer" target="_blank">#64163</a> [HttpClient] Log stale-if-error fallback in CachingHttpClient (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64174" class="reference external" rel="external noopener noreferrer" target="_blank">#64174</a> [Scheduler] Use stored checkpoint as base date for <a href="debug:scheduler" class="reference internal">debug:scheduler</a> (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64153" class="reference external" rel="external noopener noreferrer" target="_blank">#64153</a> [Messenger] Drop trace args from FlattenException normalization (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64150" class="reference external" rel="external noopener noreferrer" target="_blank">#64150</a> [HttpKernel] Use backend-handled request for terminate listeners in HttpCache (@Toflar)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64172" class="reference external" rel="external noopener noreferrer" target="_blank">#64172</a> [WebProfilerBundle] Don’t try to access RawMessage::$headers (@MatTheCat)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64148" class="reference external" rel="external noopener noreferrer" target="_blank">#64148</a> [Dotenv] Don't truncate OS env vars containing $ when $_ENV is unpopulated (@HMAZonderland)</li>
<li>feature <a href="https://github.com/symfony/symfony/pull/60298" class="reference external" rel="external noopener noreferrer" target="_blank">#60298</a> [Messenger][Amqp] delayed quorum queues (Miquel Fontana, @miquel-angel)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64167" class="reference external" rel="external noopener noreferrer" target="_blank">#64167</a> [Console] Add missing symfony/polyfill-php85 dependency (@Amoifr)</li>
<li>data <a href="https://github.com/symfony/symfony/pull/64146" class="reference external" rel="external noopener noreferrer" target="_blank">#64146</a> Release v6.4.38</li>
<li>data <a href="https://github.com/symfony/symfony/pull/64145" class="reference external" rel="external noopener noreferrer" target="_blank">#64145</a> Release v8.0.10</li>
<li>data <a href="https://github.com/symfony/symfony/pull/64144" class="reference external" rel="external noopener noreferrer" target="_blank">#64144</a> Release v7.4.10</li>
</ul>
<span id="Symfony 8.1.0-BETA2"></span>
</div>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfony-8-1-0-beta2-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 13 May 2026 20:41:28 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-8-1-0-beta2-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 8.0.11 released]]></title>
            <link>https://symfony.com/blog/symfony-8-0-11-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 8.0.11 has just been released.
Read the Symfony upgrade guide to learn more about upgrading Symfony
and use the SymfonyInsight upgrade reports to detect the code you will
need to change in your project.

    
                    
                Tip…</description>
            <content:encoded><![CDATA[
                                <p><a href="#Symfony%208.0.11" class="reference internal">Symfony 8.0.11</a> has just been released.</p>
<p>Read the <a href="https://symfony.com/doc/current/setup/upgrade_major.html" class="reference external">Symfony upgrade guide</a> to learn more about upgrading Symfony
and use the <a href="https://insight.symfony.com/" class="reference external">SymfonyInsight upgrade reports</a> to detect the code you will
need to change in your project.</p>
<div class="admonition admonition-tip ">
    <p class="admonition-title">
                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" width="24" height="24" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path></svg>
                <span>Tip</span>
    </p><p>Want to be notified whenever a new Symfony release is published? Or when a
version is not maintained anymore? Or only when a security issue is fixed?
Consider <a href="https://symfony.com/account/notifications" class="reference external">subscribing to the Symfony Roadmap Notifications</a>.</p>
</div>
<div class="section">
<h2 id="changelog-since-symfony-8-0-10"><a class="headerlink" href="#changelog-since-symfony-8-0-10" title="Permalink to this headline">Changelog Since Symfony 8.0.10</a></h2>
<ul>
    <li>data <a href="https://github.com/symfony/symfony/pull/64202" class="reference external" rel="external noopener noreferrer" target="_blank">#64202</a> Release v8.0.11</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64198" class="reference external" rel="external noopener noreferrer" target="_blank">#64198</a> [SecurityBundle] Allow defining security provider factories without config (@hockdudu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64189" class="reference external" rel="external noopener noreferrer" target="_blank">#64189</a> [FrameworkBundle] Bump Request/Session value resolver priority above EntityValueResolver (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64197" class="reference external" rel="external noopener noreferrer" target="_blank">#64197</a> [Messenger] Ensure SigningSerializer won't decode before verifying the signature (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64195" class="reference external" rel="external noopener noreferrer" target="_blank">#64195</a> [Security] Remove the legacy nested unserialize() call from token and exception classes (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64196" class="reference external" rel="external noopener noreferrer" target="_blank">#64196</a> [Yaml] Reject non-stringables when using "!!binary" (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64191" class="reference external" rel="external noopener noreferrer" target="_blank">#64191</a> [Inflector][String] Fixed singularize traces &gt; trace (@ruudk)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64192" class="reference external" rel="external noopener noreferrer" target="_blank">#64192</a> [Mailer] Use hash_equals() to compare webhook signatures for AhaSend (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64193" class="reference external" rel="external noopener noreferrer" target="_blank">#64193</a> [Notifier] Use hash_equals() to compare webhook signatures for Vonage (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64180" class="reference external" rel="external noopener noreferrer" target="_blank">#64180</a> [Messenger][Amqp] Fix support for RabbitMQ v4 by adding delayed quorum queues (@Jean85)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64187" class="reference external" rel="external noopener noreferrer" target="_blank">#64187</a> [AssetMapper] Warn on missing bare CSS and JSON imports (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64182" class="reference external" rel="external noopener noreferrer" target="_blank">#64182</a> [Console] Fix signal handler scoping (@jpollard3)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64181" class="reference external" rel="external noopener noreferrer" target="_blank">#64181</a> [Security] Preserve webserver base URL in HttpUtils::createRequest() (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64058" class="reference external" rel="external noopener noreferrer" target="_blank">#64058</a> [Process] Ignore array env values before proc_open (@dionisvl)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64179" class="reference external" rel="external noopener noreferrer" target="_blank">#64179</a> [Filesystem] preserve source mode when copying files (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64176" class="reference external" rel="external noopener noreferrer" target="_blank">#64176</a> [Console] Make ConsoleSectionOutput::overwrite() atomic to fix sections + ProgressIndicator clear (@Amoifr)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64174" class="reference external" rel="external noopener noreferrer" target="_blank">#64174</a> [Scheduler] Use stored checkpoint as base date for <a href="debug:scheduler" class="reference internal">debug:scheduler</a> (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64153" class="reference external" rel="external noopener noreferrer" target="_blank">#64153</a> [Messenger] Drop trace args from FlattenException normalization (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64150" class="reference external" rel="external noopener noreferrer" target="_blank">#64150</a> [HttpKernel] Use backend-handled request for terminate listeners in HttpCache (@Toflar)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64172" class="reference external" rel="external noopener noreferrer" target="_blank">#64172</a> [WebProfilerBundle] Don’t try to access RawMessage::$headers (@MatTheCat)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64148" class="reference external" rel="external noopener noreferrer" target="_blank">#64148</a> [Dotenv] Don't truncate OS env vars containing $ when $_ENV is unpopulated (@HMAZonderland)</li>
<li>data <a href="https://github.com/symfony/symfony/pull/64146" class="reference external" rel="external noopener noreferrer" target="_blank">#64146</a> Release v6.4.38</li>
<li>data <a href="https://github.com/symfony/symfony/pull/64144" class="reference external" rel="external noopener noreferrer" target="_blank">#64144</a> Release v7.4.10</li>
</ul>
<span id="Symfony 8.0.11"></span>
</div>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfony-8-0-11-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 13 May 2026 20:23:23 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-8-0-11-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 7.4.11 released]]></title>
            <link>https://symfony.com/blog/symfony-7-4-11-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 7.4.11 has just been released.
Read the Symfony upgrade guide to learn more about upgrading Symfony
and use the SymfonyInsight upgrade reports to detect the code you will
need to change in your project.

    
                    
                Tip…</description>
            <content:encoded><![CDATA[
                                <p><a href="#Symfony%207.4.11" class="reference internal">Symfony 7.4.11</a> has just been released.</p>
<p>Read the <a href="https://symfony.com/doc/current/setup/upgrade_major.html" class="reference external">Symfony upgrade guide</a> to learn more about upgrading Symfony
and use the <a href="https://insight.symfony.com/" class="reference external">SymfonyInsight upgrade reports</a> to detect the code you will
need to change in your project.</p>
<div class="admonition admonition-tip ">
    <p class="admonition-title">
                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" width="24" height="24" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path></svg>
                <span>Tip</span>
    </p><p>Want to be notified whenever a new Symfony release is published? Or when a
version is not maintained anymore? Or only when a security issue is fixed?
Consider <a href="https://symfony.com/account/notifications" class="reference external">subscribing to the Symfony Roadmap Notifications</a>.</p>
</div>
<div class="section">
<h2 id="changelog-since-symfony-7-4-10"><a class="headerlink" href="#changelog-since-symfony-7-4-10" title="Permalink to this headline">Changelog Since Symfony 7.4.10</a></h2>
<ul>
    <li>data <a href="https://github.com/symfony/symfony/pull/64201" class="reference external" rel="external noopener noreferrer" target="_blank">#64201</a> Release v7.4.11</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64198" class="reference external" rel="external noopener noreferrer" target="_blank">#64198</a> [SecurityBundle] Allow defining security provider factories without config (@hockdudu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64189" class="reference external" rel="external noopener noreferrer" target="_blank">#64189</a> [FrameworkBundle] Bump Request/Session value resolver priority above EntityValueResolver (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64197" class="reference external" rel="external noopener noreferrer" target="_blank">#64197</a> [Messenger] Ensure SigningSerializer won't decode before verifying the signature (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64195" class="reference external" rel="external noopener noreferrer" target="_blank">#64195</a> [Security] Remove the legacy nested unserialize() call from token and exception classes (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64196" class="reference external" rel="external noopener noreferrer" target="_blank">#64196</a> [Yaml] Reject non-stringables when using "!!binary" (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64191" class="reference external" rel="external noopener noreferrer" target="_blank">#64191</a> [Inflector][String] Fixed singularize traces &gt; trace (@ruudk)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64192" class="reference external" rel="external noopener noreferrer" target="_blank">#64192</a> [Mailer] Use hash_equals() to compare webhook signatures for AhaSend (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64193" class="reference external" rel="external noopener noreferrer" target="_blank">#64193</a> [Notifier] Use hash_equals() to compare webhook signatures for Vonage (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64180" class="reference external" rel="external noopener noreferrer" target="_blank">#64180</a> [Messenger][Amqp] Fix support for RabbitMQ v4 by adding delayed quorum queues (@Jean85)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64187" class="reference external" rel="external noopener noreferrer" target="_blank">#64187</a> [AssetMapper] Warn on missing bare CSS and JSON imports (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64182" class="reference external" rel="external noopener noreferrer" target="_blank">#64182</a> [Console] Fix signal handler scoping (@jpollard3)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64181" class="reference external" rel="external noopener noreferrer" target="_blank">#64181</a> [Security] Preserve webserver base URL in HttpUtils::createRequest() (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64058" class="reference external" rel="external noopener noreferrer" target="_blank">#64058</a> [Process] Ignore array env values before proc_open (@dionisvl)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64179" class="reference external" rel="external noopener noreferrer" target="_blank">#64179</a> [Filesystem] preserve source mode when copying files (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64176" class="reference external" rel="external noopener noreferrer" target="_blank">#64176</a> [Console] Make ConsoleSectionOutput::overwrite() atomic to fix sections + ProgressIndicator clear (@Amoifr)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64174" class="reference external" rel="external noopener noreferrer" target="_blank">#64174</a> [Scheduler] Use stored checkpoint as base date for <a href="debug:scheduler" class="reference internal">debug:scheduler</a> (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64153" class="reference external" rel="external noopener noreferrer" target="_blank">#64153</a> [Messenger] Drop trace args from FlattenException normalization (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64150" class="reference external" rel="external noopener noreferrer" target="_blank">#64150</a> [HttpKernel] Use backend-handled request for terminate listeners in HttpCache (@Toflar)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64172" class="reference external" rel="external noopener noreferrer" target="_blank">#64172</a> [WebProfilerBundle] Don’t try to access RawMessage::$headers (@MatTheCat)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64148" class="reference external" rel="external noopener noreferrer" target="_blank">#64148</a> [Dotenv] Don't truncate OS env vars containing $ when $_ENV is unpopulated (@HMAZonderland)</li>
<li>data <a href="https://github.com/symfony/symfony/pull/64146" class="reference external" rel="external noopener noreferrer" target="_blank">#64146</a> Release v6.4.38</li>
</ul>
<span id="Symfony 7.4.11"></span>
</div>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfony-7-4-11-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 13 May 2026 20:05:48 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-7-4-11-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 6.4.39 released]]></title>
            <link>https://symfony.com/blog/symfony-6-4-39-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 6.4.39 has just been released.
Read the Symfony upgrade guide to learn more about upgrading Symfony
and use the SymfonyInsight upgrade reports to detect the code you will
need to change in your project.

    
                    
                Tip…</description>
            <content:encoded><![CDATA[
                                <p><a href="#Symfony%206.4.39" class="reference internal">Symfony 6.4.39</a> has just been released.</p>
<p>Read the <a href="https://symfony.com/doc/current/setup/upgrade_major.html" class="reference external">Symfony upgrade guide</a> to learn more about upgrading Symfony
and use the <a href="https://insight.symfony.com/" class="reference external">SymfonyInsight upgrade reports</a> to detect the code you will
need to change in your project.</p>
<div class="admonition admonition-tip ">
    <p class="admonition-title">
                    <svg xmlns="http://www.w3.org/2000/svg" fill="none" width="24" height="24" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path></svg>
                <span>Tip</span>
    </p><p>Want to be notified whenever a new Symfony release is published? Or when a
version is not maintained anymore? Or only when a security issue is fixed?
Consider <a href="https://symfony.com/account/notifications" class="reference external">subscribing to the Symfony Roadmap Notifications</a>.</p>
</div>
<div class="section">
<h2 id="changelog-since-symfony-6-4-38"><a class="headerlink" href="#changelog-since-symfony-6-4-38" title="Permalink to this headline">Changelog Since Symfony 6.4.38</a></h2>
<ul>
    <li>data <a href="https://github.com/symfony/symfony/pull/64200" class="reference external" rel="external noopener noreferrer" target="_blank">#64200</a> Release v6.4.39</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64198" class="reference external" rel="external noopener noreferrer" target="_blank">#64198</a> [SecurityBundle] Allow defining security provider factories without config (@hockdudu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64189" class="reference external" rel="external noopener noreferrer" target="_blank">#64189</a> [FrameworkBundle] Bump Request/Session value resolver priority above EntityValueResolver (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64195" class="reference external" rel="external noopener noreferrer" target="_blank">#64195</a> [Security] Remove the legacy nested unserialize() call from token and exception classes (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64196" class="reference external" rel="external noopener noreferrer" target="_blank">#64196</a> [Yaml] Reject non-stringables when using "!!binary" (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64191" class="reference external" rel="external noopener noreferrer" target="_blank">#64191</a> [Inflector][String] Fixed singularize traces &gt; trace (@ruudk)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64193" class="reference external" rel="external noopener noreferrer" target="_blank">#64193</a> [Notifier] Use hash_equals() to compare webhook signatures for Vonage (@alexandre-daubois)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64180" class="reference external" rel="external noopener noreferrer" target="_blank">#64180</a> [Messenger][Amqp] Fix support for RabbitMQ v4 by adding delayed quorum queues (@Jean85)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64187" class="reference external" rel="external noopener noreferrer" target="_blank">#64187</a> [AssetMapper] Warn on missing bare CSS and JSON imports (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64182" class="reference external" rel="external noopener noreferrer" target="_blank">#64182</a> [Console] Fix signal handler scoping (@jpollard3)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64181" class="reference external" rel="external noopener noreferrer" target="_blank">#64181</a> [Security] Preserve webserver base URL in HttpUtils::createRequest() (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64058" class="reference external" rel="external noopener noreferrer" target="_blank">#64058</a> [Process] Ignore array env values before proc_open (@dionisvl)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64179" class="reference external" rel="external noopener noreferrer" target="_blank">#64179</a> [Filesystem] preserve source mode when copying files (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64176" class="reference external" rel="external noopener noreferrer" target="_blank">#64176</a> [Console] Make ConsoleSectionOutput::overwrite() atomic to fix sections + ProgressIndicator clear (@Amoifr)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64174" class="reference external" rel="external noopener noreferrer" target="_blank">#64174</a> [Scheduler] Use stored checkpoint as base date for <a href="debug:scheduler" class="reference internal">debug:scheduler</a> (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64153" class="reference external" rel="external noopener noreferrer" target="_blank">#64153</a> [Messenger] Drop trace args from FlattenException normalization (@ousamabenyounes)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64150" class="reference external" rel="external noopener noreferrer" target="_blank">#64150</a> [HttpKernel] Use backend-handled request for terminate listeners in HttpCache (@Toflar)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64172" class="reference external" rel="external noopener noreferrer" target="_blank">#64172</a> [WebProfilerBundle] Don’t try to access RawMessage::$headers (@MatTheCat)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/64148" class="reference external" rel="external noopener noreferrer" target="_blank">#64148</a> [Dotenv] Don't truncate OS env vars containing $ when $_ENV is unpopulated (@HMAZonderland)</li>
</ul>
<span id="Symfony 6.4.39"></span>
</div>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfony-6-4-39-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 13 May 2026 19:54:06 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-6-4-39-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[SymfonyOnline June 2026: The schedule is live!]]></title>
            <link>https://symfony.com/blog/symfonyonline-june-2026-the-schedule-is-live?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    


The wait is over! After reviewing many high-quality proposals, we are excited to announce the schedule for SymfonyOnline June 2026, taking place online from June 11 to 12, 2026!

🙏 A huge thank you to our community

First and foremost, we want to…</description>
            <content:encoded><![CDATA[
                                <p><a class="block text-center" href="https://live.symfony.com/2026-online-june" title="Nl Blog Banner 2026 04 17T163921 336">
    <img src="https://symfony.com/uploads/assets/blog/NL-BLOG-Banner-2026-04-17T163921-336.png" alt="Nl Blog Banner 2026 04 17T163921 336">
</a></p>

<p>The wait is over! After reviewing many high-quality proposals, we are excited to announce the schedule for <strong><a href="https://live.symfony.com/2026-online-june">SymfonyOnline June 2026</a></strong>, taking place online from <strong>June 11 to 12, 2026!</strong></p>

<h3>🙏 A huge thank you to our community</h3>

<p>First and foremost, we want to thank everyone who submitted a talk during the Call for Papers. Your expertise and dedication are what keep the Symfony ecosystem thriving. While we couldn't fit every session into the schedule, the variety and depth of the topics submitted were impressive.</p>

<h3>🎤 What’s on the menu?</h3>

<p>For this 13th edition, we’ve organized the conference into two high-impact thematic tracks designed to keep you at the cutting edge of web development:</p>

<ul>
<li><strong>Day 1 - June 11: AI Track.</strong> A full day dedicated to integrating AI within PHP and Symfony applications.</li>
</ul>

<p><a href="https://live.symfony.com/2026-online-june/schedule/building-tuis-in-php-the-symfony-terminal-component">Building TUIs in PHP: The Symfony Terminal Component</a> - Fabien Potencier<br>
<a href="https://live.symfony.com/2026-online-june/schedule/symfony-ai-mate">Symfony Mate: Real Runtime Context for AI Coding Assistants</a> - Johannes Wachter<br>
<a href="https://live.symfony.com/2026-online-june/schedule/symfony-ai-in-action">Symfony AI: Platform, Agent, and Store</a> - Christopher Hertel<br>
<a href="https://live.symfony.com/2026-online-june/schedule/custom-phpstan-rules-guardrails-for-ai-assisted-symfony-code">Custom PHPStan Rules: Guardrails for AI-Assisted Symfony Code</a> - Dave Liddament<br>
<a href="https://live.symfony.com/2026-online-june/schedule/giving-voice-to-your-agents-the-symfony-ai-way">Giving voice to your agents, the Symfony AI way</a> - Guillaume Loulier<br>
<a href="https://live.symfony.com/2026-online-june/schedule/hunting-vulnerabilities-in-symfony-with-llms">Hunting Vulnerabilities in Symfony with LLMs</a> - Vincent Amstoutz<br>
<a href="https://live.symfony.com/2026-online-june/schedule/make-your-ai-useful-with-mcp">Building MCP Servers with the Official PHP SDK</a> - Tobias Nyholm<br></p>

<ul>
<li><strong>Day 2 - June 12: Symfony Deep Dive.</strong> An immersion into Symfony components and its related projects.</li>
</ul>

<p><a href="https://live.symfony.com/2026-online-june/schedule/mastering-symfony-messenger-and-rabbitmq">Event Streaming with Symfony Messenger</a> - Max Beckers<br>
<a href="https://live.symfony.com/2026-online-june/schedule/git-but-better-an-introduction-to-jujutsu-jj">Git, But Better: An Introduction to Jujutsu (jj)</a> - Pauline Vos<br>
<a href="https://live.symfony.com/2026-online-june/schedule/from-web-to-mobile-with-symfony-and-hotwire-native">From Web to Mobile with Symfony &amp; Hotwire Native</a> - Imad Zairig<br>
<a href="https://live.symfony.com/2026-online-june/schedule/protect-your-data-with-queryable-encryption">Protect your data with Queryable Encryption</a> - Jérôme Tamarelle<br>
<a href="https://live.symfony.com/2026-online-june/schedule/symfony-8-the-hexagonal-track">Symfony 8: The Hexagonal Track</a> - Robin Chalas<br>
<a href="https://live.symfony.com/2026-online-june/schedule/reconfiguring-symfony-in-real-time-with-sidekicks">Reconfiguring Symfony in real time with sidekicks</a> - Nicolas Grekas</p>

<p>We are thrilled to welcome renowned experts who will share their latest insights and best practices with the community! 🫶</p>

<p>✨ Key Feature: All talks are pre-recorded to ensure the highest technical quality, but speakers will be joining us live to answer your questions in real-time during the dedicated Q&amp;A sessions!</p>

<h3>🛠️ Pre-conference Workshops (June 9-10)</h3>

<p>Don't forget that the conference is preceded by two days of hands-on technical workshops. These small-group sessions are the perfect opportunity to master specific Symfony features under the guidance of certified trainers: <strong><a href="https://live.symfony.com/2026-online-june/workshop">Discover the first topics!</a></strong></p>

<p>Note: Workshop spots are limited and no replays are available for these sessions to ensure an interactive learning experience.</p>

<h3>🎟️ Register now!</h3>

<p>Join the global PHP &amp; Symfony community from the comfort of your home or office by clicking <strong><a href="https://live.symfony.com/2026-online-june/registration/">here</a></strong>.</p>

<ul>
<li>▶️ <strong>Instant Replays</strong>: Missed a session? All talks are available for replay as soon as they start.</li>
<li>🆒 <strong>Accessibility</strong>: English subtitles are provided for all presentations.</li>
</ul>

<p>We look forward to seeing you online to explore the future of PHP together!</p>

<hr />

<h3>Join us online!</h3>

<p>💡Follow the "conference" blog posts to not miss anything!</p>

<p>Want the latest Symfony updates? Follow us and tune in from wherever you are 🌎</p>

<p><a class="block text-center" href="https://linktr.ee/symfony">
   <img src="https://symfony.com/uploads/assets/blog/Banner-BLOG.png" alt="Banner Blog">
</a></p>

                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfonyonline-june-2026-the-schedule-is-live?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Eloïse Charrier ]]></dc:creator>
            <pubDate>Wed, 13 May 2026 14:30:00 +0200</pubDate>
            <comments>https://symfony.com/blog/symfonyonline-june-2026-the-schedule-is-live?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[New in Symfony 8.1: Dynamic Controller Attributes]]></title>
            <link>https://symfony.com/blog/new-in-symfony-8-1-dynamic-controller-attributes?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Controller attributes such as #[Cache], #[IsGranted], #[Template]
and #[MapRequestPayload] are a core part of modern Symfony applications.
Technically, they are static reflection metadata resolved from source code.
Symfony 8.1 introduces several improvements…</description>
            <content:encoded><![CDATA[
                                <p>Controller attributes such as <code translate="no" class="notranslate">#[Cache]</code>, <code translate="no" class="notranslate">#[IsGranted]</code>, <code translate="no" class="notranslate">#[Template]</code>
and <code translate="no" class="notranslate">#[MapRequestPayload]</code> are a core part of modern Symfony applications.
Technically, they are static reflection metadata resolved from source code.</p>
<p>Symfony 8.1 introduces several improvements to <strong>make these attributes dynamic</strong>
and easier to override, easier to use from event listeners, and easier to extend
with custom attribute-based features.</p>
<div class="section">
<h2 id="decoupled-controller-attributes"><a class="headerlink" href="#decoupled-controller-attributes" title="Permalink to this headline">Decoupled Controller Attributes</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/nicolas-grekas">
                <img src="https://connect.symfony.com/profile/nicolas-grekas.picture" alt="Nicolas Grekas">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/nicolas-grekas">Nicolas Grekas</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/62850">#62850</a>
                                                </span>
            </div>
</div>
<p>Until now, controller attributes were always read directly from the controller's
source code via reflection. This meant that listeners had <strong>no way to modify or
replace those attributes at runtime</strong>: the attributes effectively belonged to the
PHP code, not to the request being processed.</p>
<p>Symfony 8.1 stores controller attributes in a new request attribute named
<code translate="no" class="notranslate">_controller_attributes</code>. The first call to <code translate="no" class="notranslate">ControllerEvent::getAttributes()</code>
populates it from reflection, and subsequent reads (including in later kernel
events) reuse the stored value. Listeners can now override attributes for a
specific request by calling <code translate="no" class="notranslate">setController()</code> with a custom set of attributes:</p>
<div translate="no" data-loc="15" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Attribute</span>\<span class="hljs-title">Cache</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">ControllerEvent</span>;

<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onKernelController</span><span class="hljs-params">(ControllerEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span>
</span>{
    <span class="hljs-comment">// replace the controller's #[Cache] attribute for this request only,</span>
    <span class="hljs-comment">// without touching the controller's source code</span>
    <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>attributes</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;<span class="hljs-title invoke__">getAttributes</span>();
    <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>attributes</span>[Cache::<span class="hljs-variable language_">class</span>] = [<span class="hljs-keyword">new</span> <span class="hljs-title invoke__">Cache</span>(<span class="hljs-attr">maxage</span>: <span class="hljs-number">60</span>, <span class="hljs-attr">public</span>: <span class="hljs-keyword">true</span>)];

    <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;<span class="hljs-title invoke__">setController</span>(
        <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;<span class="hljs-title invoke__">getController</span>(),
        <span class="hljs-title invoke__">array_merge</span>(...<span class="hljs-title invoke__">array_values</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>attributes</span>)),
    );
}</code></pre>
    </div>
</div>
<p>This restores the declarative nature of PHP attributes: the source code
defines the defaults, and the rest of the application can adapt them when needed.</p>
</div>
<div class="section">
<h2 id="flat-list-of-controller-attributes"><a class="headerlink" href="#flat-list-of-controller-attributes" title="Permalink to this headline">Flat List of Controller Attributes</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/nicolas-grekas">
                <img src="https://connect.symfony.com/profile/nicolas-grekas.picture" alt="Nicolas Grekas">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/nicolas-grekas">Nicolas Grekas</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/63090">#63090</a>
                                                </span>
            </div>
</div>
<p>Symfony 8.1 also simplifies how controller attributes are represented. Instead
of always returning them grouped by class name, <code translate="no" class="notranslate">getAttributes()</code> accepts a
new <code translate="no" class="notranslate">'*'</code> argument to return a <strong>flat list of attribute instances</strong> in their
declaration order:</p>
<div translate="no" data-loc="11" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-comment">// get all attributes grouped by class name (default behavior)</span>
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;<span class="hljs-title invoke__">getAttributes</span>();
<span class="hljs-comment">// returns: [Cache::class =&gt; [new Cache(...)], IsGranted::class =&gt; [new IsGranted(...)], ...]</span>

<span class="hljs-comment">// get all attributes as a flat list, in declaration order</span>
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;<span class="hljs-title invoke__">getAttributes</span>(<span class="hljs-string">'*'</span>);
<span class="hljs-comment">// returns: [new Cache(...), new IsGranted(...), ...]</span>

<span class="hljs-comment">// get all attributes of a specific class</span>
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;<span class="hljs-title invoke__">getAttributes</span>(Cache::<span class="hljs-variable language_">class</span>);
<span class="hljs-comment">// returns: [new Cache(...), ...]</span></code></pre>
    </div>
</div>
<p>In addition, <code translate="no" class="notranslate">ResponseEvent</code> now exposes a public readonly
<code translate="no" class="notranslate">$controllerArgumentsEvent</code> property so response listeners can read the
controller attributes that applied to the request without re-reflecting the
controller:</p>
<div translate="no" data-loc="8" class="notranslate codeblock codeblock-length-sm codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Attribute</span>\<span class="hljs-title">Cache</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">ResponseEvent</span>;

<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">onKernelResponse</span><span class="hljs-params">(ResponseEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span>
</span>{
    <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>cacheAttributes</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;controllerArgumentsEvent?-&gt;<span class="hljs-title invoke__">getAttributes</span>(Cache::<span class="hljs-variable language_">class</span>) ?? [];
    <span class="hljs-comment">// ... act on the response based on the controller's attributes</span>
}</code></pre>
    </div>
</div>
</div>
<div class="section">
<h2 id="events-named-after-controller-attributes"><a class="headerlink" href="#events-named-after-controller-attributes" title="Permalink to this headline">Events Named After Controller Attributes</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/nicolas-grekas">
                <img src="https://connect.symfony.com/profile/nicolas-grekas.picture" alt="Nicolas Grekas">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/nicolas-grekas">Nicolas Grekas</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/63032">#63032</a>
                                                </span>
            </div>
</div>
<p>Before Symfony 8.1, attribute-based listeners had to subscribe to generic
kernel events and manually inspect controller attributes. Symfony 8.1
introduces <strong>dedicated events for each controller attribute</strong> instead.</p>
<p>The event name follows the convention <code translate="no" class="notranslate">{kernelEvent}.{AttributeFQCN}</code>, so a
<code translate="no" class="notranslate">#[Cache]</code> attribute triggers the event
<code translate="no" class="notranslate">kernel.controller_arguments.Symfony<wbr></wbr>\Component<wbr></wbr>\HttpKernel<wbr></wbr>\Attribute<wbr></wbr>\Cache</code>
(or <code translate="no" class="notranslate">KernelEvents::CONTROLLER_ARGUMENTS.'.'.Cache::class</code>).</p>
<p>Each event receives a <code translate="no" class="notranslate">ControllerAttributeEvent</code> object that combines the
attribute instance with the underlying kernel event. For example, if you define
this custom attribute in your application:</p>
<div translate="no" data-loc="11" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Attribute</span>;

<span class="hljs-comment">#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD)]</span>
<span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RateLimit</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>maxRequests</span> = <span class="hljs-number">100</span>,
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>periodInSeconds</span> = <span class="hljs-number">60</span>,
    )</span> </span>{
    }
}</code></pre>
    </div>
</div>
<p>You can apply the attribute to any controller and write the following listener
to handle it:</p>
<div translate="no" data-loc="18" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">EventListener</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Attribute</span>\<span class="hljs-title">RateLimit</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">EventDispatcher</span>\<span class="hljs-title">Attribute</span>\<span class="hljs-title">AsEventListener</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Event</span>\<span class="hljs-title">ControllerAttributeEvent</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">KernelEvents</span>;

<span class="hljs-meta">#[AsEventListener(<span class="hljs-attr">event</span>: KernelEvents::<span class="hljs-variable constant_">CONTROLLER_ARGUMENTS</span>.<span class="hljs-string">'.'</span>.RateLimit::<span class="hljs-variable language_">class</span>)]</span>
<span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RateLimitListener</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__invoke</span><span class="hljs-params">(ControllerAttributeEvent <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>)</span>: <span class="hljs-title">void</span>
    </span>{
        <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>rateLimit</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;attribute;       <span class="hljs-comment">// RateLimit instance</span>
        <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>request</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>event</span>-&gt;kernelEvent-&gt;<span class="hljs-title invoke__">getRequest</span>();

        <span class="hljs-comment">// ... enforce $rateLimit-&gt;maxRequests within $rateLimit-&gt;periodInSeconds</span>
    }
}</code></pre>
    </div>
</div>
<p>Attribute events are available for all controller-related kernel events.
Symfony also preserves attribute declaration order automatically, so listeners
compose naturally around controllers.</p>
<p>Symfony optimizes these events internally, dispatching them only when listeners
exist and supporting attribute inheritance automatically. Built-in listeners
such as <code translate="no" class="notranslate">CacheAttributeListener</code>, <code translate="no" class="notranslate">IsGrantedAttributeListener</code> and
<code translate="no" class="notranslate">TemplateAttributeListener</code> have been migrated to this new system.</p>
</div>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/new-in-symfony-8-1-dynamic-controller-attributes?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Wed, 13 May 2026 10:34:00 +0200</pubDate>
            <comments>https://symfony.com/blog/new-in-symfony-8-1-dynamic-controller-attributes?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[SymfonyDay Montreal 2026: Building TUIs in PHP: The Symfony Terminal Component]]></title>
            <link>https://symfony.com/blog/symfonyday-montreal-2026-building-tuis-in-php-the-symfony-terminal-component?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    


We are excited to welcome the Symfony community to Montreal on June 4, 2026, at L&#039;Espace Quartier Latin (UQAM). Join us for a day dedicated to expertise and innovation in the heart of the city! See more details about SymfonyDay Montreal 2026.

🎤 Speaker…</description>
            <content:encoded><![CDATA[
                                <p><a class="block text-center" href="https://live.symfony.com/2026-montreal/">
    <img src="https://symfony.com/uploads/assets/blog/HEADER-1200x440px-at-3x-5.png" alt="Header 1200X440Px At 3X 5">
</a></p>

<p>We are excited to welcome the Symfony community to Montreal on June 4, 2026, at L'Espace Quartier Latin (UQAM). Join us for a day dedicated to expertise and innovation in the heart of the city! See more details about <strong><a href="https://live.symfony.com/2026-montreal/">SymfonyDay Montreal 2026</a></strong>.</p>

<h2>🎤 Speaker announcement!</h2>

<p>We are thrilled to host <strong><a href="https://connect.symfony.com/profile/fabpot">Fabien Potencier</a></strong>, Symfony founder and project lead, for his talk: <strong>"<a href="https://live.symfony.com/2026-montreal/schedule/building-tuis-in-php-the-symfony-terminal-component">Building TUIs in PHP: The Symfony Terminal Component</a>"</strong>:</p>

<p>With coding agents moving from the IDE to the terminal, TUIs are having a renaissance. This session introduces the new Symfony Terminal Component, a TUI toolkit built from the ground up in PHP. We'll explore its architecture, the primitives it exposes, and how it makes building rich, interactive terminal interfaces possible in Symfony applications. Don't miss the pull request opening!</p>

<h3>Ready to join us?</h3>

<p>Registration is open, but seats are limited for this edition! <a href="https://live.symfony.com/2026-montreal/registration">Book your ticket now</a> to secure your spot. The event will be held at <strong>L'Espace Quartier Latin</strong>, and we will conclude the day with a <strong>community drink</strong> to network and celebrate together.</p>

<p>👉 Discover more talks by reading the <strong><a href="https://live.symfony.com/2026-montreal/schedule">full schedule</a></strong></p>

<p><a class="block text-center" href="https://live.symfony.com/2026-montreal/" title="Nl Blog Banner Symfonyday">
    <img src="https://symfony.com/uploads/assets/blog/NL-BLOG-Banner-SymfonyDay.jpg" alt="Nl Blog Banner Symfonyday">
</a></p>

<h3>🎟️ Register Now – Limited Seating!</h3>

<p>Seats are limited for this edition, and they are going fast! To ensure you don't miss out on this gathering of the Symfony &amp; PHP community, make sure to grab your ticket today. Register <strong><a href="https://live.symfony.com/2026-montreal/registration/">here!</a></strong></p>

<h3>📍 Our Venue: L’Espace Quartier Latin</h3>

<p>We are gathering at <strong><a href="https://maps.app.goo.gl/KV48kYKqY7hu982q9">L’Espace Quartier Latin</a></strong> at UQAM! The venue is extremely easy to reach, both by public transport and by private transport.</p>

<h3>🤲 L’apéro – Let’s Celebrate Together</h3>

<p>After a full day of learning, it’s time to relax. We invite all attendees to join us for a community drink in the evening. It’s a wonderful opportunity to chat with the speakers, meet fellow developers, and enjoy the unique Montreal atmosphere. <em>Santé !</em></p>

<p>We can’t wait to see you on <strong>June 4th!</strong></p>

<hr />

<h3>Join us online!</h3>

<p>💡Follow the "conference" blog posts to not miss anything!</p>

<p>Want the latest Symfony updates? Follow us and tune in from wherever you are 🌎</p>

<p><a class="block text-center" href="https://linktr.ee/symfony">
   <img src="https://symfony.com/uploads/assets/blog/Banner-BLOG.png" alt="Banner Blog">
</a></p>

                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/symfonyday-montreal-2026-building-tuis-in-php-the-symfony-terminal-component?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Eloïse Charrier ]]></dc:creator>
            <pubDate>Tue, 12 May 2026 17:30:00 +0200</pubDate>
            <comments>https://symfony.com/blog/symfonyday-montreal-2026-building-tuis-in-php-the-symfony-terminal-component?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[New in Symfony 8.1: Serialize Attribute]]></title>
            <link>https://symfony.com/blog/new-in-symfony-8-1-serialize-attribute?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    
                    
                
            
            
    
        Contributed by
                    Kostiantyn Miakshyn
                                         in
                                    #49518…</description>
            <content:encoded><![CDATA[
                                <div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://connect.symfony.com/profile/koc">
                <img src="https://connect.symfony.com/profile/koc.picture" alt="Kostiantyn Miakshyn">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://connect.symfony.com/profile/koc">Kostiantyn Miakshyn</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/symfony/pull/49518">#49518</a>
                                                </span>
            </div>
</div>
<p>Building API endpoints in Symfony often involves the same repetitive boilerplate:
inject the serializer service, call <code translate="no" class="notranslate">serialize()</code>, create a response with the
proper status code, and configure the <code translate="no" class="notranslate">Content-Type</code> header:</p>
<div translate="no" data-loc="22" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-comment">// src/Controller/GetUserController.php</span>
<span class="hljs-keyword">namespace</span> <span class="hljs-title">App</span>\<span class="hljs-title">Controller</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Model</span>\<span class="hljs-title">User</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpFoundation</span>\<span class="hljs-title">JsonResponse</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">Serializer</span>\<span class="hljs-title">SerializerInterface</span>;

<span class="hljs-keyword">final</span> <span class="hljs-keyword">readonly</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GetUserController</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(
        <span class="hljs-keyword">private</span> SerializerInterface <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>serializer</span>
    )</span> </span>{
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__invoke</span><span class="hljs-params">()</span>: <span class="hljs-title">JsonResponse</span>
    </span>{
        <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>data</span> = <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">User</span>(<span class="hljs-number">1</span>, <span class="hljs-string">'Jane Smith'</span>, <span class="hljs-string">'...'</span>);
        <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>serialized</span> = <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>this</span>-&gt;serializer-&gt;<span class="hljs-title invoke__">serialize</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>data</span>, <span class="hljs-string">'json'</span>);

        <span class="hljs-keyword">return</span> JsonResponse::<span class="hljs-title invoke__">fromJsonString</span>(<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>serialized</span>, JsonResponse::<span class="hljs-variable constant_">HTTP_CREATED</span>);
    }
}</code></pre>
    </div>
</div>
<p><strong>Symfony 8.1 streamlines this workflow</strong> with the new <code translate="no" class="notranslate">#[Serialize]</code> attribute.
After installing and configuring the <a href="https://symfony.com/serializer" class="reference external">Serializer component</a>, apply the
<code translate="no" class="notranslate">#[Serialize]</code> attribute to a controller method and return an object or
array instead of a full <code translate="no" class="notranslate">Response</code> object.</p>
<p>Symfony serializes the result using the format derived from the request (JSON by
default), sets the <code translate="no" class="notranslate">Content-Type</code> header, and wraps everything in a <code translate="no" class="notranslate">Response</code>
object automatically:</p>
<div translate="no" data-loc="11" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-comment">// ...</span>
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">HttpKernel</span>\<span class="hljs-title">Attribute</span>\<span class="hljs-title">Serialize</span>;

<span class="hljs-keyword">final</span> <span class="hljs-keyword">readonly</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GetUserController</span>
</span>{
    <span class="hljs-meta">#[Serialize]</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__invoke</span><span class="hljs-params">()</span>: <span class="hljs-title">User</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">User</span>(<span class="hljs-number">1</span>, <span class="hljs-string">'Jane Smith'</span>, <span class="hljs-string">'...'</span>);
    }
}</code></pre>
    </div>
</div>
<p>You can also customize the HTTP status code, response headers, and serialization
context passed to the <a href="https://symfony.com/serializer" class="reference external">Serializer component</a>:</p>
<div translate="no" data-loc="17" class="notranslate codeblock codeblock-length-md codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-comment">// ...</span>
<span class="hljs-keyword">use</span> <span class="hljs-title">Symfony</span>\<span class="hljs-title">Component</span>\<span class="hljs-title">Serializer</span>\<span class="hljs-title">Normalizer</span>\<span class="hljs-title">DateTimeNormalizer</span>;

<span class="hljs-keyword">final</span> <span class="hljs-keyword">readonly</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CreateProductController</span>
</span>{
    <span class="hljs-meta">#[Serialize(
        <span class="hljs-attr">code</span>: <span class="hljs-number">201</span>,
        <span class="hljs-attr">headers</span>: [<span class="hljs-string">'X-Custom-Header'</span> =&gt; <span class="hljs-string">'abc'</span>],
        <span class="hljs-attr">context</span>: [DateTimeNormalizer::<span class="hljs-variable constant_">FORMAT_KEY</span> =&gt; <span class="hljs-string">'d.m.Y H:i:s'</span>],
    )]</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__invoke</span><span class="hljs-params">()</span>: <span class="hljs-title">ProductCreated</span>
    </span>{
        <span class="hljs-comment">// ... create the product</span>

        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">ProductCreated</span>(<span class="hljs-number">101</span>);
    }
}</code></pre>
    </div>
</div>
<p>The response format is determined from the current request format, so the same
controller can return JSON or XML depending on the route configuration. For
example, a route defined as <code translate="no" class="notranslate">/products/{id}.{_format}</code> produces JSON for
<code translate="no" class="notranslate">/products/42.json</code> and XML for <code translate="no" class="notranslate">/products/42.xml</code>.</p>
<p>If the request asks for a format that is not supported by the Serializer
component, Symfony automatically returns a <code translate="no" class="notranslate">415 Unsupported Media Type</code> response.</p>
                <hr style="margin-bottom: 5px" />
                <div style="font-size: 90%">
                    <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
                </div>
            ]]></content:encoded>
            <guid isPermaLink="false">https://symfony.com/blog/new-in-symfony-8-1-serialize-attribute?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Tue, 12 May 2026 09:12:00 +0200</pubDate>
            <comments>https://symfony.com/blog/new-in-symfony-8-1-serialize-attribute?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
            </channel>
</rss>
