<?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>Sat, 04 Apr 2026 13:41:49 +0200</pubDate>
        <lastBuildDate>Wed, 01 Apr 2026 11:33:00 +0200</lastBuildDate>
        <language>en</language>
                        <item>
            <title><![CDATA[SymfonyLive Berlin 2026: Call for Student Volunteers!]]></title>
            <link>https://symfony.com/blog/symfonylive-berlin-2026-call-for-student-volunteers?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    




Are you a student looking to gain hands-on experience, grow your network, and take part in an international tech event? 🎤

SymfonyLive Berlin 2026 is looking for motivated student volunteers to join the adventure!

📍Where: Berlin, Germany, at The…</description>
            <content:encoded><![CDATA[
                                <p><a class="block text-center" href="https://live.symfony.com/2026-berlin" title="Blog 1200X440Px">
    <img src="https://symfony.com/uploads/assets/blog/BLOG-1200x440px.png" alt="Blog 1200X440Px">
</a></p>

<hr />

<h3>Are you a student looking to gain hands-on experience, grow your network, and take part in an international tech event? 🎤</h3>

<p><a href="https://live.symfony.com/2026-berlin">SymfonyLive Berlin 2026 is looking for motivated student volunteers to join the adventure!</a></p>

<p>📍<strong>Where:</strong> Berlin, Germany, at <strong>The CineStar CUBIX Alexanderplatz</strong>, located in the heart of Berlin directly on Alexanderplatz - perfectly accessible by all public transport.</p>

<p>🗓️ <strong>When:</strong> During SymfonyLive Berlin 2026</p>

<p>Volunteering with us means helping out for one day and getting a free ticket to attend the conference the other day, so you don’t miss any of the action!</p>

<hr />

<p>💼 <strong>Volunteer Tasks</strong></p>

<p>As a volunteer, you may be asked to:</p>

<p>✔️ Welcome attendees</p>

<p>✔️ Provide directions and information</p>

<p>✔️ Help ensure everything runs smoothly throughout the event</p>

<p>✅ <strong>Requirements</strong></p>

<p>To apply, you must:</p>

<p>✔️ Be a student in computer science / IT (all backgrounds welcome!)</p>

<p>✔️ Be curious about careers in development or tech</p>

<p>✔️ Be available for at least one full day during the event</p>

<p>✔️ Speak English (conference language)</p>

<hr />

<p>🎁 <strong>What You Get</strong></p>

<p>✔️ Free access to the full SymfonyLive Berlin 2026 conference</p>

<p>✔️ Opportunities to network with developers, speakers, and community leaders</p>

<p>✔️ Lunch included</p>

<p>✔️ A unique and memorable experience within the Symfony community</p>

<hr />

<p>🚫 <strong>Please note:</strong></p>

<p>We are unable to cover:</p>

<p>✔️ Travel or accommodation costs</p>

<p>✔️ Dinners or evening expenses</p>

<hr />

<p>💌 <strong>How to Apply</strong></p>

<p>Interested? Send us an email at <strong>events@symfony.com</strong>
 with:</p>

<p>✔️ Your name, school, and area of study</p>

<p>✔️ Why you’d like to volunteer</p>

<p>✔️ Your availability during the event</p>

<hr />

<h3><a href="https://live.symfony.com/2026-berlin">Be part of the Symfony community, gain valuable experience, and help make SymfonyLive Berlin 2026 amazing! 💙</a></h3>

<hr />

<h3>Joins 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/symfonylive-berlin-2026-call-for-student-volunteers?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Paola Suárez ]]></dc:creator>
            <pubDate>Wed, 01 Apr 2026 11:33:00 +0200</pubDate>
            <comments>https://symfony.com/blog/symfonylive-berlin-2026-call-for-student-volunteers?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 8.0.8 released]]></title>
            <link>https://symfony.com/blog/symfony-8-0-8-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 8.0.8 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.8" class="reference internal">Symfony 8.0.8</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-7"><a class="headerlink" href="#changelog-since-symfony-8-0-7" title="Permalink to this headline">Changelog Since Symfony 8.0.7</a></h2>
<ul>
    <li>bug <a href="https://github.com/symfony/symfony/pull/63812" class="reference external" rel="external noopener noreferrer" target="_blank">#63812</a> [DependencyInjection] Fix tagged_iterator/tagged_locator in array PHP config (@javiereguiluz)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63823" class="reference external" rel="external noopener noreferrer" target="_blank">#63823</a> [DependencyInjection] Fix rejecting inline services in parameters section (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63817" class="reference external" rel="external noopener noreferrer" target="_blank">#63817</a> [Serializer] Fix denormalization of nested array with key types (@mtarld)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63782" class="reference external" rel="external noopener noreferrer" target="_blank">#63782</a> [Serializer] Fix mixed-typed constructor parameters overriding getter-inferred type (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63818" class="reference external" rel="external noopener noreferrer" target="_blank">#63818</a> [Cache] Ensure compatibility with Relay extension 0.21.0 (@lyrixx)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63806" class="reference external" rel="external noopener noreferrer" target="_blank">#63806</a> [Ldap] Make the Adapter resettable (@kira0269, @nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63720" class="reference external" rel="external noopener noreferrer" target="_blank">#63720</a> [MonologBridge] Fix ConsoleHandler losing output after nested command terminates (@mp3000mp)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63723" class="reference external" rel="external noopener noreferrer" target="_blank">#63723</a> [EventDispatcher] Fix memory leak in TraceableEventDispatcher for long-running processes (@wazum)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63749" class="reference external" rel="external noopener noreferrer" target="_blank">#63749</a> [Console] Fix performance regression in OutputFormatter for ASCII content (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63683" class="reference external" rel="external noopener noreferrer" target="_blank">#63683</a> [TwigBridge] Fix image method to use DataPart content ID (@pavelwitassek)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63787" class="reference external" rel="external noopener noreferrer" target="_blank">#63787</a> [Serializer] Fix can*() prefix support in GetSetMethodNormalizer (@sn3mdev)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63747" class="reference external" rel="external noopener noreferrer" target="_blank">#63747</a> [Cache] Fix Psr16Cache::getMultiple() returning ValueWrapper with TagAwareAdapter (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63766" class="reference external" rel="external noopener noreferrer" target="_blank">#63766</a> [Dotenv] Fix preloading warning by replacing anonymous exception class (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63777" class="reference external" rel="external noopener noreferrer" target="_blank">#63777</a> [FrameworkBundle] Fix setting router.request_context.base_url when option default_uri is defined (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63692" class="reference external" rel="external noopener noreferrer" target="_blank">#63692</a> [HttpClient][EventSourceHttpClient] Fix broken streams when first event is delayed (@LachlanArthur)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63726" class="reference external" rel="external noopener noreferrer" target="_blank">#63726</a> [HttpClient] Unset push response content when the push handler is released (@sakozoko)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63736" class="reference external" rel="external noopener noreferrer" target="_blank">#63736</a> [Cache] Fix undefined array key when tag save fails in AbstractTagAwareAdapter (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63724" class="reference external" rel="external noopener noreferrer" target="_blank">#63724</a> [HttpKernel] Fix allowing invalid #[Autowire] references in controller arguments (@valtzu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63722" class="reference external" rel="external noopener noreferrer" target="_blank">#63722</a> [SecurityBundle] Fix profiler showing ERROR instead of DENIED  (@audain-dg)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63691" class="reference external" rel="external noopener noreferrer" target="_blank">#63691</a> [Messenger] Use SignalRegistry::isSupported() in ConsumeMessagesCommand (@shyim)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63648" class="reference external" rel="external noopener noreferrer" target="_blank">#63648</a> [VarDumper] Wrong dumper output for Accept: aplication/json requests (@rfcdt)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63674" class="reference external" rel="external noopener noreferrer" target="_blank">#63674</a> [Dotenv] Fix self-referencing variables with defaults and env key resolution during deferred expansion (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63676" class="reference external" rel="external noopener noreferrer" target="_blank">#63676</a> [HttpKernel] Reset router locale to default when finishing main request (@guillaumeVDP)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63679" class="reference external" rel="external noopener noreferrer" target="_blank">#63679</a> [WebProfilerBundle] Only decrement pendingRequests when it's more than zero (@andyexeter)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63655" class="reference external" rel="external noopener noreferrer" target="_blank">#63655</a> [Cache] Fix ChainAdapter ignoring item expiry when propagating to earlier adapters (@guillaumeVDP)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63656" class="reference external" rel="external noopener noreferrer" target="_blank">#63656</a> [Form] Fix typed property initialization in ValidatorExtension (@SeverinGloeckle)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63643" class="reference external" rel="external noopener noreferrer" target="_blank">#63643</a> [Messenger] Fix duplicate pending messages in Redis transport with batch handlers (@wazum)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63639" class="reference external" rel="external noopener noreferrer" target="_blank">#63639</a> [ErrorHandler] "@method" deprecation notices are missing when interface inheritance is used (@mpdude)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63627" class="reference external" rel="external noopener noreferrer" target="_blank">#63627</a> [Serializer] Fix self type reference on promoted constructor parameter (@andersonamuller, @nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63635" class="reference external" rel="external noopener noreferrer" target="_blank">#63635</a> [VarExporter] Skip rewriting initialized readonly properties during hydration (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63629" class="reference external" rel="external noopener noreferrer" target="_blank">#63629</a>  Fix deprecation notices for "@method" annotations and classes with __call() (@mpdude)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63624" class="reference external" rel="external noopener noreferrer" target="_blank">#63624</a> [JsonStreamer] Fix lazy instantiation for internal PHP classes (@Maxcastel)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63620" class="reference external" rel="external noopener noreferrer" target="_blank">#63620</a> [Dotenv] Fix escaped dollar signs lost during deferred variable resolution (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63611" class="reference external" rel="external noopener noreferrer" target="_blank">#63611</a> [Process] Throw InvalidArgumentException when env block exceeds Windows limit (Nadim AL ABDOU)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63616" class="reference external" rel="external noopener noreferrer" target="_blank">#63616</a> [HttpKernel] Set propertyPath on MapUploadedFile validation violations (@eyupcanakman)</li>
</ul>
<span id="Symfony 8.0.8"></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-8-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 23:31:58 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-8-0-8-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 7.4.8 released]]></title>
            <link>https://symfony.com/blog/symfony-7-4-8-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 7.4.8 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.8" class="reference internal">Symfony 7.4.8</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-7"><a class="headerlink" href="#changelog-since-symfony-7-4-7" title="Permalink to this headline">Changelog Since Symfony 7.4.7</a></h2>
<ul>
    <li>bug <a href="https://github.com/symfony/symfony/pull/63812" class="reference external" rel="external noopener noreferrer" target="_blank">#63812</a> [DependencyInjection] Fix tagged_iterator/tagged_locator in array PHP config (@javiereguiluz)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63823" class="reference external" rel="external noopener noreferrer" target="_blank">#63823</a> [DependencyInjection] Fix rejecting inline services in parameters section (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63817" class="reference external" rel="external noopener noreferrer" target="_blank">#63817</a> [Serializer] Fix denormalization of nested array with key types (@mtarld)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63782" class="reference external" rel="external noopener noreferrer" target="_blank">#63782</a> [Serializer] Fix mixed-typed constructor parameters overriding getter-inferred type (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63818" class="reference external" rel="external noopener noreferrer" target="_blank">#63818</a> [Cache] Ensure compatibility with Relay extension 0.21.0 (@lyrixx)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63806" class="reference external" rel="external noopener noreferrer" target="_blank">#63806</a> [Ldap] Make the Adapter resettable (@kira0269, @nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63720" class="reference external" rel="external noopener noreferrer" target="_blank">#63720</a> [MonologBridge] Fix ConsoleHandler losing output after nested command terminates (@mp3000mp)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63723" class="reference external" rel="external noopener noreferrer" target="_blank">#63723</a> [EventDispatcher] Fix memory leak in TraceableEventDispatcher for long-running processes (@wazum)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63749" class="reference external" rel="external noopener noreferrer" target="_blank">#63749</a> [Console] Fix performance regression in OutputFormatter for ASCII content (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63683" class="reference external" rel="external noopener noreferrer" target="_blank">#63683</a> [TwigBridge] Fix image method to use DataPart content ID (@pavelwitassek)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63787" class="reference external" rel="external noopener noreferrer" target="_blank">#63787</a> [Serializer] Fix can*() prefix support in GetSetMethodNormalizer (@sn3mdev)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63747" class="reference external" rel="external noopener noreferrer" target="_blank">#63747</a> [Cache] Fix Psr16Cache::getMultiple() returning ValueWrapper with TagAwareAdapter (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63766" class="reference external" rel="external noopener noreferrer" target="_blank">#63766</a> [Dotenv] Fix preloading warning by replacing anonymous exception class (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63777" class="reference external" rel="external noopener noreferrer" target="_blank">#63777</a> [FrameworkBundle] Fix setting router.request_context.base_url when option default_uri is defined (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63692" class="reference external" rel="external noopener noreferrer" target="_blank">#63692</a> [HttpClient][EventSourceHttpClient] Fix broken streams when first event is delayed (@LachlanArthur)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63726" class="reference external" rel="external noopener noreferrer" target="_blank">#63726</a> [HttpClient] Unset push response content when the push handler is released (@sakozoko)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63736" class="reference external" rel="external noopener noreferrer" target="_blank">#63736</a> [Cache] Fix undefined array key when tag save fails in AbstractTagAwareAdapter (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63724" class="reference external" rel="external noopener noreferrer" target="_blank">#63724</a> [HttpKernel] Fix allowing invalid #[Autowire] references in controller arguments (@valtzu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63722" class="reference external" rel="external noopener noreferrer" target="_blank">#63722</a> [SecurityBundle] Fix profiler showing ERROR instead of DENIED  (@audain-dg)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63691" class="reference external" rel="external noopener noreferrer" target="_blank">#63691</a> [Messenger] Use SignalRegistry::isSupported() in ConsumeMessagesCommand (@shyim)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63648" class="reference external" rel="external noopener noreferrer" target="_blank">#63648</a> [VarDumper] Wrong dumper output for Accept: aplication/json requests (@rfcdt)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63674" class="reference external" rel="external noopener noreferrer" target="_blank">#63674</a> [Dotenv] Fix self-referencing variables with defaults and env key resolution during deferred expansion (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63676" class="reference external" rel="external noopener noreferrer" target="_blank">#63676</a> [HttpKernel] Reset router locale to default when finishing main request (@guillaumeVDP)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63679" class="reference external" rel="external noopener noreferrer" target="_blank">#63679</a> [WebProfilerBundle] Only decrement pendingRequests when it's more than zero (@andyexeter)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63655" class="reference external" rel="external noopener noreferrer" target="_blank">#63655</a> [Cache] Fix ChainAdapter ignoring item expiry when propagating to earlier adapters (@guillaumeVDP)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63656" class="reference external" rel="external noopener noreferrer" target="_blank">#63656</a> [Form] Fix typed property initialization in ValidatorExtension (@SeverinGloeckle)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63643" class="reference external" rel="external noopener noreferrer" target="_blank">#63643</a> [Messenger] Fix duplicate pending messages in Redis transport with batch handlers (@wazum)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63639" class="reference external" rel="external noopener noreferrer" target="_blank">#63639</a> [ErrorHandler] "@method" deprecation notices are missing when interface inheritance is used (@mpdude)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63627" class="reference external" rel="external noopener noreferrer" target="_blank">#63627</a> [Serializer] Fix self type reference on promoted constructor parameter (@andersonamuller, @nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63635" class="reference external" rel="external noopener noreferrer" target="_blank">#63635</a> [VarExporter] Skip rewriting initialized readonly properties during hydration (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63629" class="reference external" rel="external noopener noreferrer" target="_blank">#63629</a>  Fix deprecation notices for "@method" annotations and classes with __call() (@mpdude)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63624" class="reference external" rel="external noopener noreferrer" target="_blank">#63624</a> [JsonStreamer] Fix lazy instantiation for internal PHP classes (@Maxcastel)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63620" class="reference external" rel="external noopener noreferrer" target="_blank">#63620</a> [Dotenv] Fix escaped dollar signs lost during deferred variable resolution (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63611" class="reference external" rel="external noopener noreferrer" target="_blank">#63611</a> [Process] Throw InvalidArgumentException when env block exceeds Windows limit (Nadim AL ABDOU)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63616" class="reference external" rel="external noopener noreferrer" target="_blank">#63616</a> [HttpKernel] Set propertyPath on MapUploadedFile validation violations (@eyupcanakman)</li>
</ul>
<span id="Symfony 7.4.8"></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-8-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 23:11:38 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-7-4-8-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony 6.4.36 released]]></title>
            <link>https://symfony.com/blog/symfony-6-4-36-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony 6.4.36 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.36" class="reference internal">Symfony 6.4.36</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-35"><a class="headerlink" href="#changelog-since-symfony-6-4-35" title="Permalink to this headline">Changelog Since Symfony 6.4.35</a></h2>
<ul>
    <li>bug <a href="https://github.com/symfony/symfony/pull/63823" class="reference external" rel="external noopener noreferrer" target="_blank">#63823</a> [DependencyInjection] Fix rejecting inline services in parameters section (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63817" class="reference external" rel="external noopener noreferrer" target="_blank">#63817</a> [Serializer] Fix denormalization of nested array with key types (@mtarld)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63818" class="reference external" rel="external noopener noreferrer" target="_blank">#63818</a> [Cache] Ensure compatibility with Relay extension 0.21.0 (@lyrixx)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63806" class="reference external" rel="external noopener noreferrer" target="_blank">#63806</a> [Ldap] Make the Adapter resettable (@kira0269, @nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63720" class="reference external" rel="external noopener noreferrer" target="_blank">#63720</a> [MonologBridge] Fix ConsoleHandler losing output after nested command terminates (@mp3000mp)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63723" class="reference external" rel="external noopener noreferrer" target="_blank">#63723</a> [EventDispatcher] Fix memory leak in TraceableEventDispatcher for long-running processes (@wazum)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63749" class="reference external" rel="external noopener noreferrer" target="_blank">#63749</a> [Console] Fix performance regression in OutputFormatter for ASCII content (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63683" class="reference external" rel="external noopener noreferrer" target="_blank">#63683</a> [TwigBridge] Fix image method to use DataPart content ID (@pavelwitassek)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63787" class="reference external" rel="external noopener noreferrer" target="_blank">#63787</a> [Serializer] Fix can*() prefix support in GetSetMethodNormalizer (@sn3mdev)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63747" class="reference external" rel="external noopener noreferrer" target="_blank">#63747</a> [Cache] Fix Psr16Cache::getMultiple() returning ValueWrapper with TagAwareAdapter (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63766" class="reference external" rel="external noopener noreferrer" target="_blank">#63766</a> [Dotenv] Fix preloading warning by replacing anonymous exception class (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63777" class="reference external" rel="external noopener noreferrer" target="_blank">#63777</a> [FrameworkBundle] Fix setting router.request_context.base_url when option default_uri is defined (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63692" class="reference external" rel="external noopener noreferrer" target="_blank">#63692</a> [HttpClient][EventSourceHttpClient] Fix broken streams when first event is delayed (@LachlanArthur)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63726" class="reference external" rel="external noopener noreferrer" target="_blank">#63726</a> [HttpClient] Unset push response content when the push handler is released (@sakozoko)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63736" class="reference external" rel="external noopener noreferrer" target="_blank">#63736</a> [Cache] Fix undefined array key when tag save fails in AbstractTagAwareAdapter (@pcescon)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63724" class="reference external" rel="external noopener noreferrer" target="_blank">#63724</a> [HttpKernel] Fix allowing invalid #[Autowire] references in controller arguments (@valtzu)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63691" class="reference external" rel="external noopener noreferrer" target="_blank">#63691</a> [Messenger] Use SignalRegistry::isSupported() in ConsumeMessagesCommand (@shyim)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63674" class="reference external" rel="external noopener noreferrer" target="_blank">#63674</a> [Dotenv] Fix self-referencing variables with defaults and env key resolution during deferred expansion (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63676" class="reference external" rel="external noopener noreferrer" target="_blank">#63676</a> [HttpKernel] Reset router locale to default when finishing main request (@guillaumeVDP)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63679" class="reference external" rel="external noopener noreferrer" target="_blank">#63679</a> [WebProfilerBundle] Only decrement pendingRequests when it's more than zero (@andyexeter)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63655" class="reference external" rel="external noopener noreferrer" target="_blank">#63655</a> [Cache] Fix ChainAdapter ignoring item expiry when propagating to earlier adapters (@guillaumeVDP)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63656" class="reference external" rel="external noopener noreferrer" target="_blank">#63656</a> [Form] Fix typed property initialization in ValidatorExtension (@SeverinGloeckle)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63643" class="reference external" rel="external noopener noreferrer" target="_blank">#63643</a> [Messenger] Fix duplicate pending messages in Redis transport with batch handlers (@wazum)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63639" class="reference external" rel="external noopener noreferrer" target="_blank">#63639</a> [ErrorHandler] "@method" deprecation notices are missing when interface inheritance is used (@mpdude)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63635" class="reference external" rel="external noopener noreferrer" target="_blank">#63635</a> [VarExporter] Skip rewriting initialized readonly properties during hydration (@nicolas-grekas)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63629" class="reference external" rel="external noopener noreferrer" target="_blank">#63629</a>  Fix deprecation notices for "@method" annotations and classes with __call() (@mpdude)</li>
<li>bug <a href="https://github.com/symfony/symfony/pull/63620" class="reference external" rel="external noopener noreferrer" target="_blank">#63620</a> [Dotenv] Fix escaped dollar signs lost during deferred variable resolution (@nicolas-grekas)</li>
</ul>
<span id="Symfony 6.4.36"></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-36-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 22:43:04 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-6-4-36-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[A Week of Symfony #1004 (March 23–29, 2026)]]></title>
            <link>https://symfony.com/blog/a-week-of-symfony-1004-march-23-29-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>This week, we celebrated the SymfonyLive Paris 2026 conference with great success. In addition, we introduced a new Tui component for the upcoming Symfony 8.1 version, which will allow to build rich, interactive terminal user interfaces.

Symfony development…</description>
            <content:encoded><![CDATA[
                                <p>This week, we celebrated the <a href="https://live.symfony.com/2026-paris/">SymfonyLive Paris 2026</a> conference with great success. In addition, we introduced a <a href="https://symfony.com/blog/introducing-the-symfony-tui-component">new Tui component</a> for the upcoming Symfony 8.1 version, which will allow to build rich, interactive terminal user interfaces.</p>

<h2>Symfony development highlights</h2>

<p>This week, 52 pull requests were merged (23 in code and 29 in docs) and 37 issues were closed (20 in code and 17 in docs). Excluding merges, 25 authors made 3,343 additions and 730 deletions. See details for <a href="https://github.com/symfony/symfony/pulse">code</a> and <a href="https://github.com/symfony/symfony-docs/pulse">docs</a>.</p>

<p><a href="https://github.com/symfony/symfony/commits/6.4">6.4 changelog</a>:</p>

<ul>
<li><a href="https://github.com/symfony/symfony/commit/17e61cf3f664a291ffa1e291ead55c47743a2230">17e61cf</a>: &#91;HttpKernel&#93; fix allowing invalid #[Autowire] references in controller arguments</li>
<li><a href="https://github.com/symfony/symfony/commit/0572460af7759f1ab17b6bc84f7aa5787e47c0fa">0572460</a>: &#91;Cache&#93; fix undefined array key when tag save fails in AbstractTagAwareAdapter</li>
<li><a href="https://github.com/symfony/symfony/commit/c9fe9849819178bcea752a43e98552975835ff6d">c9fe984</a>: &#91;HttpClient&#93; unset push response content when the push handler is released</li>
<li><a href="https://github.com/symfony/symfony/commit/bc616d48cbe2aaf8318df34e1b585d32deb3010b">bc616d4</a>: &#91;HttpClient, EventSourceHttpClient&#93; fix broken streams when first event is delayed</li>
<li><a href="https://github.com/symfony/symfony/commit/863d35065352cb32e368b625eadd2651e6669306">863d350</a>:  add a merge-up skill for maintainers</li>
<li><a href="https://github.com/symfony/symfony/commit/b10e8ac820eade44c73c171f6bd88031ba40541f">b10e8ac</a>: &#91;FrameworkBundle&#93; fix setting router.request_context.base_url when option default_uri is defined</li>
</ul>

<p><a href="https://github.com/symfony/symfony/commits/7.4">7.4 changelog</a>:</p>

<ul>
<li><a href="https://github.com/symfony/symfony/commit/fe9786597d19021defcd6017db7448fca018caa1">fe97865</a>: &#91;SecurityBundle&#93; fix profiler showing ERROR instead of DENIED</li>
<li><a href="https://github.com/symfony/symfony/commit/4ca277b1630380bbeb532fd06261965f84de889f">4ca277b</a>: &#91;Contracts&#93; fix SubscribedService $type phpdoc to allow non-class strings</li>
</ul>

<p><a href="https://github.com/symfony/symfony/commits/8.1">8.1 changelog</a>:</p>

<ul>
<li><a href="https://github.com/symfony/symfony/commit/9727380486b55673213d12d417f1c2ae00f9fad7">9727380</a>: &#91;VarExporter&#93; fix DeepCloner crash with objects using __serialize()</li>
<li><a href="https://github.com/symfony/symfony/commit/ee4e6730d6901aed9bf88d1db3bd174392ddc9fc">ee4e673</a>: &#91;Console&#93; add validation constraints support to #[MapInput]</li>
<li><a href="https://github.com/symfony/symfony/commit/255bf0d41d0b313291f2a9f4c828cefa61eee0dc">255bf0d</a>: &#91;Console&#93; fix allowing invalid #[Autowire] references in command arguments</li>
<li><a href="https://github.com/symfony/symfony/commit/03b46b8bebb0e163d71191e76f7bcb70a1b44ae2">03b46b8</a>: &#91;JsonStreamer&#93; use composer package for RFC 8259 tests</li>
<li><a href="https://github.com/symfony/symfony/commit/930b073cddb2dd8ea2fb30bd51525434c8784ba1">930b073</a>: &#91;JsonStreamer&#93; support date time timezone</li>
<li><a href="https://github.com/symfony/symfony/commit/5731ab859fe953d256bf9e26f1341b197128d500">5731ab8</a>: &#91;FrameworkBundle, HttpKernel&#93; deprecate Bundle::registerCommands()</li>
<li><a href="https://github.com/symfony/symfony/commit/360fecf43da5aa923f1c00014b43330b10d5b940">360fecf</a>: &#91;JsonStreamer&#93; add DateInterval value object support</li>
<li><a href="https://github.com/symfony/symfony/commit/cd9b8559863bf5f7a3037ed048bbac0ff2acb819">cd9b855</a>: &#91;Twig&#93; add daisyUI form layout</li>
</ul>

<h2>Newest issues and pull requests</h2>

<ul>
<li><a href="https://github.com/symfony/symfony/pull/63778">[Tui] Add the component</a></li>
<li><a href="https://github.com/symfony/symfony/issues/63797">[Console] Control Table column separators individually</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63776">[WebProfilerBundle] Add JSON endpoints for profiler data</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63750">Configure deprecation triggers</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63801">[HttpClient] add an HTTP/2 client using PHP-Standard-Library</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63751">[DependencyInjection][HttpKernel] Add support for resetting non-shared services</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63774">[DoctrineBridge] Allow custom doctrine type registration using attribute</a></li>
</ul>

<h2>Symfony Jobs</h2>

<p>These are some of the most recent Symfony job offers:</p>

<ul>
<li><strong>Symfony Developer</strong> at Design Force Marketing<br>
Full-time - $60,000 – $100,000 / year<br>
Grand Haven Michigan, United States<br>
<a href="https://symfony.com/jobs/5ad3b96">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at ShipMonk<br>
Contract / Freelance - $5,000 – $8,000 / month<br>
Full remote<br>
<a href="https://symfony.com/jobs/2bb5783">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at Vacatia<br>
Full-time - $150,000 – $180,000 / year<br>
Remote + part-time onsite (Portland, Oregon, United States)<br>
<a href="https://symfony.com/jobs/8844fec">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at POLAVIS<br>
Full-time - €30 – €45 / hour<br>
Full remote<br>
<a href="https://symfony.com/jobs/13a5a1a">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at Travis International Road Services<br>
Full-time - €3,800 – €4,500 / month<br>
Remote + part-time onsite (Tilburg, Netherlands)<br>
<a href="https://symfony.com/jobs/8f177bf">View details</a></li>
</ul>

<p>You can <a href="https://symfony.com/jobs">publish a Symfony job offer for free</a> on symfony.com.</p>

<h2>SymfonyCasts Updates</h2>

<p><a href="https://symfonycasts.com/">SymfonyCasts</a> is the official way to learn Symfony.
Select a track for a guided path through 100+ video tutorial courses about
Symfony, PHP and JavaScript.</p>

<p>This week, SymfonyCasts published the following updates:</p>

<ul>
<li>(Video) <a href="https://symfonycasts.com/screencast/doctrine-inheritance/querying">Doctrine Inheritance: Classes in the Database: Querying Classes</a></li>
<li>(Video) <a href="https://symfonycasts.com/screencast/doctrine-inheritance/class-table">Doctrine Inheritance: Classes in the Database: Class Table Inheritance</a></li>
</ul>

<h2>They talked about us</h2>

<ul>
<li><a href="https://gnugat.github.io/2026/03/25/turn-you-php-app-into-a-standalone-binary.html">Turn your PHP app into a standalone binary</a></li>
<li><a href="https://medium.com/@benoit.leveque/building-an-mcp-server-with-symfony-symfony-mcp-bundle-in-practice-680b4623967b">Building an MCP Server With Symfony: symfony/mcp-bundle in Practice</a></li>
<li><a href="https://dev.to/iamirondev/from-template-to-production-app-in-a-weekend-ji5">From Template to Production App in a Weekend</a></li>
<li><a href="https://dev.to/mattleads/passkey-management-and-account-recovery-in-symfony-24hh">Passkey Management and Account Recovery in Symfony</a></li>
<li><a href="https://nicolas-jourdan.medium.com/mastering-time-in-symfony-with-the-clock-component-d0caab0e38af">Mastering Time in Symfony with the Clock Component</a></li>
<li><a href="https://blog.tony-stark.xyz/blog/2026-03-symfony-sveltekit-template/">My Opinionated Symfony + SvelteKit Template with 10 PHPStan Extensions</a></li>
<li><a href="https://dev.to/rahul_chavan_fa70c3ea3f79/from-personal-tool-to-open-source-console-profiler-bundle-2gk0">From Personal Tool to Open Source: Console Profiler Bundle</a></li>
<li><a href="https://medium.itdo.com/apps-inteligentes-con-agentes-de-ia-en-php-symfony-e1425a1fd41b">APPs inteligentes con agentes de IA en PHP Symfony</a></li>
</ul>

<h2>Upcoming Symfony Events</h2>

<ul>
<li><a href="https://www.meetup.com/phpug-rhein-neckar/events/312782219/">Sylius Meetup &amp; Hackathon Mannheim 2026</a>: Mannheim, Germany (April 30, 2026)</li>
<li><a href="https://websummercamp.com/2026">Web Summer Camp 2026</a>: Opatija, Croatia (July 2, 2026 – July 4, 2026)</li>
</ul>

<h2>Call to Action</h2>

<ul>
<li>Follow Symfony <a href="https://x.com/symfony">on X</a>, <a href="https://mastodon.social/@symfony">on Mastodon</a>, <a href="https://bsky.app/profile/symfony.com">on Bluesky</a> and <a href="https://www.threads.net/@symfony">on Threads</a> and share this article.</li>
<li><a href="https://feeds.feedburner.com/symfony/blog">Subscribe to the Symfony blog RSS</a> and never miss a Symfony story again.</li>
</ul>

                <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/a-week-of-symfony-1004-march-23-29-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Sun, 29 Mar 2026 09:39:00 +0200</pubDate>
            <comments>https://symfony.com/blog/a-week-of-symfony-1004-march-23-29-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Introducing the Symfony Tui Component]]></title>
            <link>https://symfony.com/blog/introducing-the-symfony-tui-component?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
Introducing the Symfony Tui Component
I&#039;m thrilled to announce a brand new Symfony component: Tui, a PHP library
for building rich, interactive terminal user interfaces.
For 15 years, the Console component has been one of the most used Symfony
components,…</description>
            <content:encoded><![CDATA[
                                <div class="section">
<h2 id="introducing-the-symfony-tui-component"><a class="headerlink" href="#introducing-the-symfony-tui-component" title="Permalink to this headline">Introducing the Symfony Tui Component</a></h2>
<p>I'm thrilled to announce a brand new Symfony component: <strong>Tui</strong>, a PHP library
for building rich, interactive terminal user interfaces.</p>
<p>For 15 years, the Console component has been one of the most used Symfony
components, powering many CLI tools in the ecosystem. It does a lot: commands,
arguments, output formatting, questions, tables, progress bars... But over time,
I realized that two very different responsibilities had grown intertwined:
structuring CLI applications, and building interactive terminal experiences.</p>
<p>What if we split them?</p>
<p>Console stays focused on commands, arguments, and output. And <strong>Tui</strong> takes
over everything related to rich terminal interaction: widgets, layouts, styling,
input handling, mouse support, and real-time rendering.</p>
<p>Today, I'm opening the pull request to add Tui to Symfony.</p>
<div class="section">
<h3 id="a-full-widget-toolkit-for-the-terminal"><a class="headerlink" href="#a-full-widget-toolkit-for-the-terminal" title="Permalink to this headline">A Full Widget Toolkit for the Terminal</a></h3>
<p>Tui ships with a complete set of widgets:</p>
<ul>
    <li><strong>TextWidget</strong> for labels, headings, and FIGlet ASCII art banners</li>
<li><strong>InputWidget</strong> for single-line text fields with cursor, scrolling, and paste
support</li>
<li><strong>EditorWidget</strong>, a full multi-line text editor with word wrap, undo/redo, a
kill ring, and autocomplete</li>
<li><strong>SelectListWidget</strong> for scrollable, filterable pick lists</li>
<li><strong>SettingsListWidget</strong> for preference panels with value cycling and submenus</li>
<li><strong>TabsWidget</strong> for multi-view interfaces with horizontal or vertical headers (follow-up PR)</li>
<li><strong>MarkdownWidget</strong> with full CommonMark support and syntax-highlighted code
blocks</li>
<li><strong>ImageWidget</strong> and <strong>AnimatedImageWidget</strong> for inline images (via the Kitty
graphics protocol) and animated GIF playback as ASCII art (follow-up PR)</li>
<li><strong>OverlayWidget</strong> for modal dialogs, dropdowns, and floating panels (follow-up PR)</li>
<li><strong>LoaderWidget</strong>, <strong>CancellableLoaderWidget</strong>, and <strong>ProgressBarWidget</strong> for
background operations</li>
</ul>
<p>Every widget supports padding, borders (with 9 built-in patterns like
<code translate="no" class="notranslate">rounded</code>, <code translate="no" class="notranslate">double</code>, and block styles), backgrounds, text decoration, and
alignment. Widgets compose into trees using <code translate="no" class="notranslate">ContainerWidget</code> with vertical or
horizontal layout, gaps, and vertical expansion.</p>
</div>
<div class="section">
<h3 id="css-like-styling"><a class="headerlink" href="#css-like-styling" title="Permalink to this headline">CSS-like Styling</a></h3>
<p>Tui's styling system draws heavily from CSS. Styles are immutable value objects
with properties for colors (ANSI, 256-palette, true color RGB with <code translate="no" class="notranslate">mix()</code>,
<code translate="no" class="notranslate">tint()</code>, and <code translate="no" class="notranslate">shade()</code>), text formatting, padding, borders, layout direction,
gaps, and alignment.</p>
<p>There are three ways to style a widget:</p>
<p><strong>Stylesheet rules</strong> with CSS-like selectors (universal, FQCN, class, state,
sub-elements, responsive breakpoints):</p>
<div translate="no" data-loc="7" class="notranslate codeblock codeblock-length-sm codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>stylesheet</span>-&gt;<span class="hljs-title invoke__">addRule</span>(<span class="hljs-string">'.sidebar:focused'</span>, <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">Style</span>(
    <span class="hljs-attr">border</span>: Border::<span class="hljs-title invoke__">all</span>(<span class="hljs-number">1</span>, <span class="hljs-string">'rounded'</span>, <span class="hljs-string">'cyan'</span>),
));

<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>stylesheet</span>-&gt;<span class="hljs-title invoke__">addRule</span>(MarkdownWidget::<span class="hljs-variable language_">class</span>.<span class="hljs-string">'::code-block-border'</span>, <span class="hljs-keyword">new</span> <span class="hljs-title invoke__">Style</span>(
    <span class="hljs-attr">color</span>: <span class="hljs-string">'gray'</span>,
));</code></pre>
    </div>
</div>
<p><strong>Tailwind-like utility classes</strong> for quick, composable styling:</p>
<div translate="no" data-loc="4" class="notranslate codeblock codeblock-length-sm codeblock-php">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>widget</span>-&gt;<span class="hljs-title invoke__">addStyleClass</span>(<span class="hljs-string">'p-2'</span>);
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>widget</span>-&gt;<span class="hljs-title invoke__">addStyleClass</span>(<span class="hljs-string">'bg-emerald-500'</span>);
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>widget</span>-&gt;<span class="hljs-title invoke__">addStyleClass</span>(<span class="hljs-string">'bold'</span>);
<span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>widget</span>-&gt;<span class="hljs-title invoke__">addStyleClass</span>(<span class="hljs-string">'border-rounded'</span>);</code></pre>
    </div>
</div>
<p>The full Tailwind shade palette is supported: <code translate="no" class="notranslate">text-blue-700</code>,
<code translate="no" class="notranslate">bg-rose-100</code>, <code translate="no" class="notranslate">border-cyan-400</code>, and so on.</p>
<p><strong>Inline styles</strong> for one-off overrides with the highest cascade priority.</p>
<p>The cascade merges these layers exactly like CSS: stylesheet rules, then utility
classes, then inline styles. Responsive breakpoints let you switch layouts based
on terminal width, just like <code translate="no" class="notranslate">@media</code> queries.</p>
</div>
<div class="section">
<h3 id="declarative-templates-with-twig-follow-up-pr"><a class="headerlink" href="#declarative-templates-with-twig-follow-up-pr" title="Permalink to this headline">Declarative Templates with Twig (follow-up PR)</a></h3>
<p>Tui includes a template system that lets you describe widget trees using
pseudo-HTML and Twig. Structure lives in templates, styling in stylesheets, and
behavior in PHP:</p>
<div translate="no" data-loc="10" class="notranslate codeblock codeblock-length-md codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">extends</span></span> "layout.html.twig" %}</span><span class="xml">

</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">block</span></span> content %}</span><span class="xml">
    <span class="hljs-tag">&lt;<span class="hljs-name">text</span>&gt;</span>Pick a language:<span class="hljs-tag">&lt;/<span class="hljs-name">text</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">select-list</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"list"</span> <span class="hljs-attr">max-visible</span>=<span class="hljs-string">"5"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"php"</span> <span class="hljs-attr">label</span>=<span class="hljs-string">"PHP"</span> <span class="hljs-attr">description</span>=<span class="hljs-string">"Hypertext Preprocessor"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"python"</span> <span class="hljs-attr">label</span>=<span class="hljs-string">"Python"</span> <span class="hljs-attr">description</span>=<span class="hljs-string">"Simple and powerful"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">item</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"rust"</span> <span class="hljs-attr">label</span>=<span class="hljs-string">"Rust"</span> <span class="hljs-attr">description</span>=<span class="hljs-string">"Memory safety without GC"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">item</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">select-list</span>&gt;</span>
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">endblock</span></span> %}</span></code></pre>
    </div>
</div>
<p>Templates support Twig inheritance, blocks, loops, conditionals, and custom
widget tags via namespace prefixes. You get the same separation of concerns
you're used to in web development: Twig for structure, stylesheets for
presentation, PHP for behavior.</p>
</div>
<div class="section">
<h3 id="powered-by-php-fibers"><a class="headerlink" href="#powered-by-php-fibers" title="Permalink to this headline">Powered by PHP Fibers</a></h3>
<p>Under the hood, Tui runs on PHP Fibers and the Revolt event loop. This means
the entire application is single-threaded but fully concurrent, with no
extensions required: pure PHP 8.4+.</p>
<p>What does this enable? Animations keep running while you type. The loader
spinner keeps spinning during HTTP requests. Input is never blocked by
rendering. Multiple async operations run in parallel. The Amp ecosystem
provides non-blocking replacements for HTTP, processes, and timers that
integrate seamlessly since they share the same event loop.</p>
</div>
<div class="section">
<h3 id="smart-rendering"><a class="headerlink" href="#smart-rendering" title="Permalink to this headline">Smart Rendering</a></h3>
<p>The rendering pipeline is engineered for performance:</p>
<ul>
    <li><strong>Dirty tracking</strong>: widgets self-invalidate; only dirty subtrees are
re-rendered</li>
<li><strong>Render cache</strong>: unchanged widgets return cached output, skipping style
resolution, layout, chrome, and content rendering entirely</li>
<li><strong>Screen diffing</strong>: only changed cells are written to the terminal, minimizing
I/O</li>
<li><strong>Compositing</strong>: multiple layers (transparent or opaque) can be merged, useful
for animated backgrounds with text on top</li>
</ul>
<p>The result: smooth rendering, efficient enough for real-time games.</p>
</div>
<div class="section">
<h3 id="mouse-focus-keybindings-events"><a class="headerlink" href="#mouse-focus-keybindings-events" title="Permalink to this headline">Mouse, Focus, Keybindings, Events</a></h3>
<p>Tui supports the full range of interaction patterns you'd expect from a modern
UI toolkit:</p>
<ul>
    <li><strong>Mouse support</strong> (follow-up PR): click to focus, click to place cursors, scroll wheels,
drag, click-outside dismissal for overlays. Hold Shift to bypass mouse
tracking for native text selection.</li>
<li><strong>Focus management</strong>: <code translate="no" class="notranslate">F6</code>/<code translate="no" class="notranslate">Shift+F6</code> cycling, programmatic focus,
<code translate="no" class="notranslate">:focused</code> state for conditional styling.</li>
<li><strong>Customizable keybindings</strong>: a three-layer merge system (widget defaults,
app-level, per-widget overrides) so you can remap any action without
subclassing.</li>
<li><strong>Event system</strong>: built on Symfony EventDispatcher with per-widget listeners,
global listeners, and typed events (<code translate="no" class="notranslate">SubmitEvent</code>, <code translate="no" class="notranslate">SelectEvent</code>,
<code translate="no" class="notranslate">ChangeEvent</code>, <code translate="no" class="notranslate">CancelEvent</code>, <code translate="no" class="notranslate">TabChangeEvent</code>, <code translate="no" class="notranslate">FocusEvent</code>, and more).</li>
</ul>
</div>
<div class="section">
<h3 id="figlet-fonts"><a class="headerlink" href="#figlet-fonts" title="Permalink to this headline">FIGlet Fonts</a></h3>
<p>Tui bundles five FIGlet fonts (<code translate="no" class="notranslate">big</code>, <code translate="no" class="notranslate">small</code>, <code translate="no" class="notranslate">slant</code>, <code translate="no" class="notranslate">standard</code>, <code translate="no" class="notranslate">mini</code>) and
makes it trivial to register your own via <code translate="no" class="notranslate">FontRegistry</code>. Apply a font with a
Tailwind utility class (<code translate="no" class="notranslate">font-big</code>) or a stylesheet rule, and <code translate="no" class="notranslate">TextWidget</code>
renders your text as large ASCII art. For the keynote where I first presented
Tui, I created custom FIGlet fonts (chisel, VGA, minecraft, rounded, slanted)
to make the slides look great, all rendered live in the terminal.</p>
</div>
<div class="section">
<h3 id="real-world-already-in-production"><a class="headerlink" href="#real-world-already-in-production" title="Permalink to this headline">Real-World: Already in Production</a></h3>
<p>Tui isn't a toy. It already powers my very own AI coding agent built
entirely on the component: an editor widget for code input, markdown rendering
for AI responses, streaming output via fibers, overlays for model selection,
tabs for multiple conversations, mouse support, customizable keybindings, and
themes.</p>
<p>The Tui integrates naturally with Symfony Console: create a <code translate="no" class="notranslate">Tui</code> inside a
command's <code translate="no" class="notranslate">execute()</code> method, run it, and return the exit code. After <code translate="no" class="notranslate">run()</code>
returns, the terminal is restored and you can use the Console output object
normally.</p>
</div>
<div class="section">
<h3 id="what-s-next"><a class="headerlink" href="#what-s-next" title="Permalink to this headline">What's Next</a></h3>
<p>I've just opened the pull request on <code translate="no" class="notranslate">github.com/symfony/symfony</code>. I can't
wait to see what the community builds with it.</p>
<p>The terminal has always been my favorite playground. With Tui, I hope it becomes
yours too.</p>
</div>
</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/introducing-the-symfony-tui-component?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 25 Mar 2026 21:48:00 +0100</pubDate>
            <comments>https://symfony.com/blog/introducing-the-symfony-tui-component?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[A Week of Symfony #1003 (March 16–22, 2026)]]></title>
            <link>https://symfony.com/blog/a-week-of-symfony-1003-march-16-22-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>This week, the upcoming Symfony 8.1 version added new options to the messenger:consume command, introduced a way to retrieve the original command input arguments and options, and added an option to map empty data using MapQueryString and MapRequestPayload.…</description>
            <content:encoded><![CDATA[
                                <p>This week, the upcoming Symfony 8.1 version added <a href="https://github.com/symfony/symfony/commit/754e299ec9c129d9f4cff94343de5fd5cacc57f5">new</a> <a href="https://github.com/symfony/symfony/commit/510fb07f79cdc460e5ad8d98bc5b3145b7298cf5">options</a> to the <code>messenger:consume</code> command, introduced a way to <a href="https://github.com/symfony/symfony/commit/ee4f425c6ce2eb164fe0a4a427a8d3d77c78b30b">retrieve the original command input arguments and options</a>, and added an option to <a href="https://github.com/symfony/symfony/commit/3750e07b661710271fa48f1139d6f58711558f15">map empty data</a> using <code>MapQueryString</code> and <code>MapRequestPayload</code>. In addition, we released <a href="https://symfony.com/blog/twig-3-24-0-released">Twig 3.24.0</a>, which includes new features related to HTML attributes, improved null-safe operator behavior, and support for variable renaming in object destructuring.</p>

<h2>Symfony development highlights</h2>

<p>This week, 47 pull requests were merged (20 in code and 27 in docs) and 35 issues were closed (22 in code and 13 in docs). Excluding merges, 22 authors made additions and deletions. See details for <a href="https://github.com/symfony/symfony/pulse">code</a> and <a href="https://github.com/symfony/symfony-docs/pulse">docs</a>.</p>

<p><a href="https://github.com/symfony/symfony/commits/6.4">6.4 changelog</a>:</p>

<ul>
<li><a href="https://github.com/symfony/symfony/commit/0ea1ee05051d697ccf1efdb3167a7ace59a21710">0ea1ee0</a>: &#91;Messenger&#93; fix duplicate pending messages in Redis transport with batch handlers</li>
<li><a href="https://github.com/symfony/symfony/commit/88c396f4bd2366fdb30965d52102e09afb7467c2">88c396f</a>: &#91;Form&#93; fix typed property initialization in ValidatorExtension</li>
<li><a href="https://github.com/symfony/symfony/commit/114ca762ea3d3e5dd071ac91e63cc0c6a6593f56">114ca76</a>: &#91;Cache&#93; fix ChainAdapter ignoring item expiry when propagating to earlier adapters</li>
<li><a href="https://github.com/symfony/symfony/commit/270104517624f929ba6e7a85e7dce3b53b8c2b84">2701045</a>: &#91;WebProfilerBundle&#93; only decrement pendingRequests when it's more than zero</li>
<li><a href="https://github.com/symfony/symfony/commit/b3dfc62f9d48cc02d9183f8c382adadc6f8f3979">b3dfc62</a>: &#91;HttpKernel&#93; reset router locale to default when finishing main request</li>
<li><a href="https://github.com/symfony/symfony/commit/860203996b51a563216e417aaaf66c9cb7919415">8602039</a>: &#91;Dotenv&#93; fix self-referencing variables with defaults and env key resolution during deferred expansion</li>
<li><a href="https://github.com/symfony/symfony/commit/d1793a6b109acf969c798a4931a40e0cd8eb8fbc">d1793a6</a>: &#91;Messenger&#93; use SignalRegistry::isSupported() in ConsumeMessagesCommand</li>
</ul>

<p><a href="https://github.com/symfony/symfony/commits/7.4">7.4 changelog</a>:</p>

<ul>
<li><a href="https://github.com/symfony/symfony/commit/a8f4940a6551dce21394cd31780871e41ba74c39">a8f4940</a>: &#91;VarDumper&#93; wrong dumper output for Accept: aplication/json requests</li>
</ul>

<p><a href="https://github.com/symfony/symfony/commits/8.1">8.1 changelog</a>:</p>

<ul>
<li><a href="https://github.com/symfony/symfony/commit/3f0ca55a3d9722adc7fc8815b8081a5f3f906396">3f0ca55</a>: &#91;Contracts&#93; add ContainerAwareInterface</li>
<li><a href="https://github.com/symfony/symfony/commit/754e299ec9c129d9f4cff94343de5fd5cacc57f5">754e299</a>: &#91;Messenger&#93; add a --fetch-size option to the messenger:consume command to control how many messages are fetched per iteration</li>
<li><a href="https://github.com/symfony/symfony/commit/23a28cf80812a706c2801357231bd7bde0e29d4b">23a28cf</a>: &#91;Messenger&#93; add MessageExecutionStrategyInterface and refactor Worker to use it</li>
<li><a href="https://github.com/symfony/symfony/commit/510fb07f79cdc460e5ad8d98bc5b3145b7298cf5">510fb07</a>: &#91;Messenger&#93; allow configuring the service reset interval in the messenger:consume command via the --no-reset option</li>
<li><a href="https://github.com/symfony/symfony/commit/cfe04b4673aa5887822672aa90cb94c95e0da25c">cfe04b4</a>: &#91;Runtime&#93; add FrankenPhpWorkerResponseRunner for simple response return</li>
<li><a href="https://github.com/symfony/symfony/commit/2906620358e8ada55c12be38e05ee3126af45094">2906620</a>: &#91;Messenger&#93; add AmqpPriorityStamp for per-message priority on AMQP transport</li>
<li><a href="https://github.com/symfony/symfony/commit/3750e07b661710271fa48f1139d6f58711558f15">3750e07</a>: &#91;HttpKernel&#93; add option to map empty data with MapQueryString and MapRequestPayload</li>
<li><a href="https://github.com/symfony/symfony/commit/ee4f425c6ce2eb164fe0a4a427a8d3d77c78b30b">ee4f425</a>: &#91;Console&#93; expose the original input arguments and options and to unparse options</li>
<li><a href="https://github.com/symfony/symfony/commit/0fed979575b4e20cb54ec5905073f3a81f94cf08">0fed979</a>: &#91;Process&#93; widen the type of Process::$commandline</li>
<li><a href="https://github.com/symfony/symfony/commit/f7a01d8fa85f564bd770b6b9f24fc2acc6f28ae9">f7a01d8</a>: &#91;Console&#93; add optional PSR container parameter to Application</li>
<li><a href="https://github.com/symfony/symfony/commit/a7a89a11b4c2d32ed5630e078e3187ed3db3c55b">a7a89a1</a>: &#91;Form&#93; fix deprecation notice in ValidatorExtensionTest::testPropertiesInitializedWithEarlyReturn test</li>
</ul>

<h2>Newest issues and pull requests</h2>

<ul>
<li><a href="https://github.com/symfony/symfony/pull/63701">[HttpClient] Add option for a custom DNS resolver</a></li>
<li><a href="https://github.com/symfony/symfony/issues/63700">[PHPUnit Bridge] Implement an issue trigger resolver to classify DebugClassLoader deprecations</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63690">[FrameworkBundle][HttpFoundation] Add command to purge session data</a></li>
<li><a href="https://github.com/symfony/symfony/pull/63705">[ObjectMapper] Add support for nested object mapping from target property type</a></li>
</ul>

<h2>Symfony Jobs</h2>

<p>These are some of the most recent Symfony job offers:</p>

<ul>
<li><strong>Symfony Developer</strong> at Design Force Marketing<br>
Full-time - $60,000 – $100,000 / year<br>
Grand Haven Michigan, United States<br>
<a href="https://symfony.com/jobs/5ad3b96">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at ShipMonk<br>
Contract / Freelance - $5,000 – $8,000 / month<br>
Full remote<br>
<a href="https://symfony.com/jobs/2bb5783">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at Vacatia<br>
Full-time - $150,000 – $180,000 / year<br>
Remote + part-time onsite (Portland, Oregon, United States)<br>
<a href="https://symfony.com/jobs/8844fec">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at POLAVIS<br>
Full-time - €30 – €45 / hour<br>
Full remote<br>
<a href="https://symfony.com/jobs/13a5a1a">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at Travis International Road Services<br>
Full-time - €3,800 – €4,500 / month<br>
Remote + part-time onsite (Tilburg, Netherlands)<br>
<a href="https://symfony.com/jobs/8f177bf">View details</a></li>
</ul>

<p>You can <a href="https://symfony.com/jobs">publish a Symfony job offer for free</a> on symfony.com.</p>

<h2>SymfonyCasts Updates</h2>

<p><a href="https://symfonycasts.com/">SymfonyCasts</a> is the official way to learn Symfony.
Select a track for a guided path through 100+ video tutorial courses about
Symfony, PHP and JavaScript.</p>

<p>This week, SymfonyCasts published the following updates:</p>

<ul>
<li>(Video) <a href="https://symfonycasts.com/screencast/doctrine-inheritance/single-table">Doctrine Inheritance: Classes in the Database: Single Table Inheritance</a></li>
</ul>

<h2>They talked about us</h2>

<ul>
<li><a href="https://medium.com/@refaat.alktifan/building-a-production-grade-pimcore-12-bundle-with-studio-ui-integration-ebc5fb004751">Building a Production-Grade Pimcore 12 Bundle with Studio UI Integration</a></li>
<li><a href="https://medium.com/@mostka.j/end-of-id-chaos-type-safe-identifiers-in-symfony-and-doctrine-automated-71bee96cb371">End of ID Chaos: Type-Safe Identifiers in Symfony and Doctrine (Automated)</a></li>
<li><a href="https://medium.com/@jstojiljkovic941/why-we-built-our-own-opentelemetry-bundle-for-symfony-9d1a273c75aa">Why We Built Our Own OpenTelemetry Bundle for Symfony</a></li>
<li><a href="https://yegorshytikov.medium.com/building-rest-apis-in-orocommerce-6-native-json-api-and-custom-api-controllers-6ed761af724a">Building REST APIs in OroCommerce 6: Native JSON:API and Custom API Controllers</a></li>
<li><a href="https://medium.com/@rcsofttech85/who-changed-the-data-the-essential-guide-to-symfony-audit-trails-6774318de8f1">Who Changed the Data? The Essential Guide to Symfony Audit Trails</a></li>
<li><a href="https://medium.com/@youssefbassim/the-decorator-pattern-in-php-from-problem-to-solution-e934a81ba5fe">The Decorator Pattern in PHP: From Problem to Solution</a></li>
</ul>

<h2>Upcoming Symfony Events</h2>

<ul>
<li><a href="https://www.meetup.com/phpug-rhein-neckar/events/312782219/">Sylius Meetup &amp; Hackathon Mannheim 2026</a>: Mannheim, Germany (April 30, 2026)</li>
<li><a href="https://websummercamp.com/2026">Web Summer Camp 2026</a>: Opatija, Croatia (July 2, 2026 – July 4, 2026)</li>
</ul>

<h2>Call to Action</h2>

<ul>
<li>Follow Symfony <a href="https://x.com/symfony">on X</a>, <a href="https://mastodon.social/@symfony">on Mastodon</a>, <a href="https://bsky.app/profile/symfony.com">on Bluesky</a> and <a href="https://www.threads.net/@symfony">on Threads</a> and share this article.</li>
<li><a href="https://feeds.feedburner.com/symfony/blog">Subscribe to the Symfony blog RSS</a> and never miss a Symfony story again.</li>
</ul>

                <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/a-week-of-symfony-1003-march-16-22-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 08:58:00 +0100</pubDate>
            <comments>https://symfony.com/blog/a-week-of-symfony-1003-march-16-22-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Twig 3.24.0 released]]></title>
            <link>https://symfony.com/blog/twig-3-24-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Twig 3.24.0 has just been released with a major new feature for working with
HTML attributes, improved null-safe operator behavior, and variable renaming
in object destructuring.

The html_attr function
Building HTML attributes in templates has always been…</description>
            <content:encoded><![CDATA[
                                <p>Twig 3.24.0 has just been released with a major new feature for working with
HTML attributes, improved null-safe operator behavior, and variable renaming
in object destructuring.</p>
<div class="section">
<h2 id="the-html-attr-function"><a class="headerlink" href="#the-html-attr-function" title="Permalink to this headline">The <code translate="no" class="notranslate">html_attr</code> function</a></h2>
<p>Building HTML attributes in templates has always been tedious: you need to
handle escaping, conditional attributes, merging CSS classes, and boolean
attributes like <code translate="no" class="notranslate">disabled</code> or <code translate="no" class="notranslate">required</code>. The new <code translate="no" class="notranslate">html_attr</code> function
takes care of all of that:</p>
<div translate="no" data-loc="5" class="notranslate codeblock codeblock-length-sm codeblock-html+twig codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> </span></span><span class="hljs-template-variable">{{ html_attr({class: ['btn', 'btn-primary'], id: 'submit'}) }}</span><span class="xml"><span class="hljs-tag">&gt;</span>
    Click me
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

</span><span class="hljs-comment">{# Output: &lt;div class="btn btn-primary" id="submit"&gt;Click me&lt;/div&gt; #}</span></code></pre>
    </div>
</div>
<p>The function accepts multiple attribute maps, merging them automatically.
Boolean values, <code translate="no" class="notranslate">null</code>, and <code translate="no" class="notranslate">aria-*</code>/<code translate="no" class="notranslate">data-*</code> attributes are handled
with sensible defaults: <code translate="no" class="notranslate">false</code> and <code translate="no" class="notranslate">null</code> omit the attribute, <code translate="no" class="notranslate">true</code>
prints the attribute with an empty value, and <code translate="no" class="notranslate">aria-*</code> attributes render
<code translate="no" class="notranslate">"true"</code>/<code translate="no" class="notranslate">"false"</code> strings as expected by the spec:</p>
<div translate="no" data-loc="6" class="notranslate codeblock codeblock-length-sm codeblock-html+twig codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">set</span></span> base = {class: ['btn']} %}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">set</span></span> variant = {class: ['btn-primary'], disabled: true} %}</span><span class="xml">

<span class="hljs-tag">&lt;<span class="hljs-name">button</span> </span></span><span class="hljs-template-variable">{{ html_attr(base, variant) }}</span><span class="xml"><span class="hljs-tag">&gt;</span>Submit<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>

</span><span class="hljs-comment">{# Output: &lt;button class="btn btn-primary" disabled=""&gt;Submit&lt;/button&gt; #}</span></code></pre>
    </div>
</div>
<p>Two companion filters are also available: <code translate="no" class="notranslate">html_attr_merge</code> to merge
attribute maps without rendering them, and <code translate="no" class="notranslate">html_attr_type</code> to handle
multi-valued attributes like comma-separated <code translate="no" class="notranslate">srcset</code> or <code translate="no" class="notranslate">sizes</code>
(thanks to <a href="https://github.com/mpdude" class="reference external" rel="external noopener noreferrer" target="_blank">@mpdude</a> and <a href="https://github.com/polarbirke" class="reference external" rel="external noopener noreferrer" target="_blank">@polarbirke</a>).</p>
<p>See <a href="https://github.com/twigphp/Twig/pull/3930" class="reference external" rel="external noopener noreferrer" target="_blank">#3930</a>.</p>
</div>
<div class="section">
<h2 id="the-html-attr-relaxed-escaping-strategy"><a class="headerlink" href="#the-html-attr-relaxed-escaping-strategy" title="Permalink to this headline">The <code translate="no" class="notranslate">html_attr_relaxed</code> escaping strategy</a></h2>
<p>Some front-end frameworks like Vue.js use special characters in attribute
names: <code translate="no" class="notranslate">:checked</code>, <code translate="no" class="notranslate">@click</code>, <code translate="no" class="notranslate">v-bind:[prop]</code>. The standard
<code translate="no" class="notranslate">html_attr</code> escaping strategy encodes these characters, breaking the
framework integration. The new <code translate="no" class="notranslate">html_attr_relaxed</code> strategy keeps <code translate="no" class="notranslate">:</code>,
<code translate="no" class="notranslate">@</code>, <code translate="no" class="notranslate">[</code>, and <code translate="no" class="notranslate">]</code> unescaped while still protecting against injection:</p>
<div translate="no" data-loc="3" class="notranslate codeblock codeblock-length-sm codeblock-html+twig codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> </span></span><span class="hljs-template-variable">{{ html_attr({':disabled': 'isLoading', '@input': 'validate'})|e('html_attr_relaxed') }}</span><span class="xml"><span class="hljs-tag">&gt;</span>

</span><span class="hljs-comment">{# Output: &lt;input :disabled="isLoading" @input="validate"&gt; #}</span></code></pre>
    </div>
</div>
<p>This strategy is also used internally by the <code translate="no" class="notranslate">html_attr</code> function for
attribute names (thanks to <a href="https://github.com/mpdude" class="reference external" rel="external noopener noreferrer" target="_blank">@mpdude</a>).</p>
<p>See <a href="https://github.com/twigphp/Twig/pull/4743" class="reference external" rel="external noopener noreferrer" target="_blank">#4743</a>.</p>
</div>
<div class="section">
<h2 id="short-circuiting-in-null-safe-operator-chains"><a class="headerlink" href="#short-circuiting-in-null-safe-operator-chains" title="Permalink to this headline">Short-circuiting in null-safe operator chains</a></h2>
<p>The null-safe operator (<code translate="no" class="notranslate">?.</code>) now properly short-circuits the entire
chain when <code translate="no" class="notranslate">null</code> is encountered, matching the behavior of PHP, Symfony
PropertyAccess, and the ExpressionLanguage component. Previously, only
the immediate access was guarded, so <code translate="no" class="notranslate">user?.address.city</code> would still
try to access <code translate="no" class="notranslate">.city</code> on the <code translate="no" class="notranslate">null</code> result. Now, the rest of the chain
is skipped:</p>
<div translate="no" data-loc="2" class="notranslate codeblock codeblock-length-sm codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-template-variable">{{ user?.address.city }}</span><span class="xml">
</span><span class="hljs-comment">{# Returns null if user is null; address.city is not evaluated #}</span></code></pre>
    </div>
</div>
<p>This makes null-safe chains much safer and more predictable (thanks to
<a href="https://github.com/HypeMC" class="reference external" rel="external noopener noreferrer" target="_blank">@HypeMC</a>).</p>
<p>See <a href="https://github.com/twigphp/Twig/pull/4748" class="reference external" rel="external noopener noreferrer" target="_blank">#4748</a>.</p>
</div>
<div class="section">
<h2 id="renaming-variables-in-object-destructuring"><a class="headerlink" href="#renaming-variables-in-object-destructuring" title="Permalink to this headline">Renaming variables in object destructuring</a></h2>
<p>Object destructuring, introduced in Twig 3.23, now supports renaming
variables using the <code translate="no" class="notranslate">key: variable</code> syntax. The key is the property to
extract, and the variable is the local name to assign it to, just like
JavaScript:</p>
<div translate="no" data-loc="4" class="notranslate codeblock codeblock-length-sm codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">do</span></span> {name: userName, email: userEmail} = user %}</span><span class="xml">

</span><span class="hljs-template-variable">{{ userName }}</span><span class="xml">   </span><span class="hljs-comment">{# user.name #}</span><span class="xml">
</span><span class="hljs-template-variable">{{ userEmail }}</span><span class="xml">  </span><span class="hljs-comment">{# user.email #}</span></code></pre>
    </div>
</div>
<p>This is especially useful when destructuring multiple objects that share
the same property names:</p>
<div translate="no" data-loc="2" class="notranslate codeblock codeblock-length-sm codeblock-twig">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">do</span></span> {data: product, error: productError} = loadProduct() %}</span><span class="xml">
</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">do</span></span> {data: stock, error: stockError} = loadStock() %}</span></code></pre>
    </div>
</div>
<p>See <a href="https://github.com/twigphp/Twig/pull/4759" class="reference external" rel="external noopener noreferrer" target="_blank">#4759</a>.</p>
</div>
<div class="section">
<h2 id="full-changelog"><a class="headerlink" href="#full-changelog" title="Permalink to this headline">Full Changelog</a></h2>
<ul>
    <li><a href="https://github.com/twigphp/Twig/pull/3930" class="reference external" rel="external noopener noreferrer" target="_blank">#3930</a> Add an <code translate="no" class="notranslate">html_attr</code> function to make outputting HTML attributes easier (@mpdude, @polarbirke)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4778" class="reference external" rel="external noopener noreferrer" target="_blank">#4778</a> Fix null coalescing operator with imported macros (@fabpot)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4775" class="reference external" rel="external noopener noreferrer" target="_blank">#4775</a> Add getOperatorTokens() to ExpressionParserInterface to separate operator token registration from parser identity (@fabpot)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4774" class="reference external" rel="external noopener noreferrer" target="_blank">#4774</a> Ensure filters/attributes aren't mistaken for operators (@brandonkelly)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4771" class="reference external" rel="external noopener noreferrer" target="_blank">#4771</a> Deprecate passing non AbstractExpression nodes to MatchesBinary (@fabpot)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4769" class="reference external" rel="external noopener noreferrer" target="_blank">#4769</a> Deprecate passing a non-AbstractExpression node to Parser::setParent() (@fabpot)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4759" class="reference external" rel="external noopener noreferrer" target="_blank">#4759</a> Add support for renaming variables in object destructuring (@fabpot)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4748" class="reference external" rel="external noopener noreferrer" target="_blank">#4748</a> Support short-circuiting in null-safe operator chains (@HypeMC)</li>
<li><a href="https://github.com/twigphp/Twig/pull/4743" class="reference external" rel="external noopener noreferrer" target="_blank">#4743</a> Add <code translate="no" class="notranslate">html_attr_relaxed</code> escaping strategy (@mpdude)</li>
</ul>
</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/twig-3-24-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 18 Mar 2026 08:50:00 +0100</pubDate>
            <comments>https://symfony.com/blog/twig-3-24-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
            </channel>
</rss>
