<?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, 18 Jul 2026 04:16:42 +0200</pubDate>
        <lastBuildDate>Wed, 15 Jul 2026 10:00:00 +0200</lastBuildDate>
        <language>en</language>
                        <item>
            <title><![CDATA[SymfonyCon Warsaw 2026: The first 4 speakers are live! 🔥]]></title>
            <link>https://symfony.com/blog/symfonycon-warsaw-2026-the-first-4-speakers-are-live?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    


SymfonyCon Warsaw 2026, our next annual international Symfony conference, will take place on:


November 24 &amp;amp; 25 with two days of hands-on workshops to learn, practice, and enhance your skills in small groups.
November 26 &amp;amp; 27 with three English-speaking…</description>
            <content:encoded><![CDATA[
                                <p><a class="block text-center" href="https://live.symfony.com/2026-warsaw-con/">
    <img src="https://symfony.com/uploads/assets/blog/NL-BLOG-Banner-38.png" alt="Nl Blog Banner 38">
</a></p>

<p>SymfonyCon Warsaw 2026, our next annual international Symfony conference, will take place on:</p>

<ul>
<li>November 24 &amp; 25 with two days of hands-on workshops to learn, practice, and enhance your skills in small groups.</li>
<li>November 26 &amp; 27 with three English-speaking tracks, an Unconference track, and a lively community evening.</li>
</ul>

<hr />

<h3>🎤 Speaker announcements</h3>

<p>The Call for Papers is officially closed, and wow... we are blown away by your submissions! Thank you to everyone who submitted a talk or a workshop. We are thrilled to kick off the countdown by <strong>revealing our first 4 speakers</strong> on our page! <strong><a href="https://live.symfony.com/2026-warsaw-con/">Go check them out</a>! 👀</strong></p>

<p>This is just the beginning — the full schedule will be unveiled step-by-step over the coming weeks. Stay tuned!</p>

<p>Here is a quick reminder of what’s waiting for you in Warsaw:</p>

<p>✔️ 3 parallel tracks featuring around 50 international speakers covering the latest in Symfony &amp; PHP.</p>

<p>✔️ The Unconference track: As always, this is your stage! Claim your slot by emailing us at <code>events@symfony.com</code> and set the stage for an unforgettable experience. Each unconference talk lasts 20 minutes.</p>

<h3>🏨 Looking for a place to stay?</h3>

<p>The official conference hotel offers special preferential rates and flexible conditions for our attendees. Make sure to use our <strong><a href="https://www.hilton.com/en/book/reservation/rooms/?ctyhocn=WAWHIHI&amp;arrivalDate=2026-11-23&amp;departureDate=2026-11-29&amp;groupCode=GSYMDP&amp;room1NumAdults=1">dedicated link</a></strong> to book your room and stay right where the action happens!</p>

<h3>🥳 Save the date for the Community Party!</h3>

<p>Because SymfonyCon isn't just about code, we are happy to confirm that our traditional Community Party will take place on the evening of <strong>Thursday, November 26</strong>. Get ready for a great night of networking, fun, and connecting with peers!</p>

<h3>💻 Hackday</h3>

<p>Ready to contribute? The Hackday on <strong>Saturday, November 28</strong> (free and open to all!) will take place at "The Brain Embassy - Czackiego" thanks to the support of Baksla.sh. Bring your laptop and your good mood!</p>

<h3>🎟️ Get your tickets</h3>

<p>Regular tickets are still available, but not for long. <strong><a href="https://live.symfony.com/2026-warsaw-con/registration/">Secure your spot now and join the ultimate Symfony week!</a></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/symfonycon-warsaw-2026-the-first-4-speakers-are-live?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Eloïse Charrier ]]></dc:creator>
            <pubDate>Wed, 15 Jul 2026 10:00:00 +0200</pubDate>
            <comments>https://symfony.com/blog/symfonycon-warsaw-2026-the-first-4-speakers-are-live?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Symfony UX 3.3.0 released]]></title>
            <link>https://symfony.com/blog/symfony-ux-3-3-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Symfony UX 3.3.0 is out. This release brings first-class support for Symfony
Reprise in StimulusBundle, two new Shadcn components for the Toolkit (Sonner
and Combobox), and a batch of quality-of-life improvements to the ux:install
command and to how component…</description>
            <content:encoded><![CDATA[
                                <p>Symfony UX 3.3.0 is out. This release brings first-class support for Symfony
Reprise in StimulusBundle, two new Shadcn components for the Toolkit (Sonner
and Combobox), and a batch of quality-of-life improvements to the <code translate="no" class="notranslate">ux:install</code>
command and to how component documentation is parsed and linted.</p>
<div class="section">
<h2 id="stimulusbundle-symfony-reprise-support"><a class="headerlink" href="#stimulusbundle-symfony-reprise-support" title="Permalink to this headline">StimulusBundle: Symfony Reprise support</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/Kocal">
                <img src="https://github.com/Kocal.png" alt="Hugo Alliaume">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/Kocal">Hugo Alliaume</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/ux/pull/3705">#3705</a>
                                                </span>
            </div>
</div>
<p><a href="https://github.com/symfony/reprise" class="reference external" rel="external noopener noreferrer" target="_blank">Symfony Reprise</a> is the new Vite and
Rsbuild integration for Symfony assets. It is brand new and still very much
experimental (its first commit landed in September 2025 and the repository only
just went public), so expect things to move fast and APIs to change. That said,
StimulusBundle already supports it as a first-class asset system, alongside
AssetMapper and Webpack Encore. Point the Reprise plugin at your
<code translate="no" class="notranslate">controllers.json</code> and start the app from <code translate="no" class="notranslate">@symfony/reprise/stimulus</code>:</p>
<div translate="no" data-loc="4" class="notranslate codeblock codeblock-length-sm codeblock-javascript">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-comment">// vite.config.js (or rsbuild.config.js)</span>
Symfony({
    <span class="hljs-attr">stimulus</span>: <span class="hljs-string">'./assets/controllers.json'</span>,
})</code></pre>
    </div>
</div>
<p>As part of this change, <code translate="no" class="notranslate">@symfony/stimulus-bridge</code> is no longer a default npm
peer dependency: it is specific to Webpack Encore, and Reprise projects would
pull it in for nothing. Only <code translate="no" class="notranslate">@hotwired/stimulus</code> remains; Encore users now
install the bridge manually.</p>
</div>
<div class="section">
<h2 id="stimulusbundle-preserved-stimulusfetch-039-lazy-039-comments"><a class="headerlink" href="#stimulusbundle-preserved-stimulusfetch-039-lazy-039-comments" title="Permalink to this headline">StimulusBundle: preserved <code translate="no" class="notranslate">stimulusFetch: 'lazy'</code> comments</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/IndraGunawan">
                <img src="https://github.com/IndraGunawan.png" alt="Indra Gunawan">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/IndraGunawan">Indra Gunawan</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/ux/pull/3702">#3702</a>
                                                </span>
            </div>
</div>
<p>The <code translate="no" class="notranslate">stimulusFetch: 'lazy'</code> directive that marks a controller as lazy-loaded
is now detected even when it uses a preserved comment marker
(<code translate="no" class="notranslate">/*! stimulusFetch: 'lazy' */</code>). Tools like <code translate="no" class="notranslate">tsc</code> and <code translate="no" class="notranslate">esbuild</code> emit that
form to keep important comments from being stripped during compilation, so
lazy controllers written in TypeScript now behave as expected.</p>
</div>
<div class="section">
<h2 id="toolkit-two-new-shadcn-components"><a class="headerlink" href="#toolkit-two-new-shadcn-components" title="Permalink to this headline">Toolkit: two new Shadcn components</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/makraz">
                <img src="https://github.com/makraz.png" alt="Hamza Makraz">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/makraz">Hamza Makraz</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/ux/pull/3477">#3477</a>
                     and                                     <a target="_blank" href="https://github.com/symfony/ux/pull/3482">#3482</a>
                                                </span>
            </div>
</div>
<p>The Shadcn kit gains two components:</p>
<ul>
    <li><strong>Sonner</strong> is an opinionated toast notification component for showing
transient feedback.</li>
<li><strong>Combobox</strong> combines an input with a searchable, filterable list of options
for autocomplete-style selection. Install either one with <code translate="no" class="notranslate">ux:install</code>.</li>
</ul>
<div translate="no" data-loc="2" class="notranslate codeblock codeblock-length-sm codeblock-terminal codeblock-bash">
        <div class="codeblock-scroll">
        
        <pre class="codeblock-code"><code><span class="hljs-prompt">$ </span>php bin/console ux:install sonner --kit=shadcn
<span class="hljs-prompt">$ </span>php bin/console ux:install combobox --kit=shadcn</code></pre>
    </div>
</div>
</div>
<div class="section">
<h2 id="toolkit-friendlier-ux-install"><a class="headerlink" href="#toolkit-friendlier-ux-install" title="Permalink to this headline">Toolkit: friendlier <code translate="no" class="notranslate">ux:install</code></a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/Kocal">
                <img src="https://github.com/Kocal.png" alt="Hugo Alliaume">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/Kocal">Hugo Alliaume</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/ux/pull/3700">#3700</a>
                                                </span>
            </div>
</div>
<p>Recipe names are stored in lower-case, so <code translate="no" class="notranslate">ux:install Alert</code> used to fail with
a raw "does not exist in any official kits" error. Recipe lookup is now
case-insensitive: <code translate="no" class="notranslate">Alert</code> resolves to the <code translate="no" class="notranslate">alert</code> recipe, both without
<code translate="no" class="notranslate">--kit</code> (the "which kit?" prompt) and with an explicit <code translate="no" class="notranslate">--kit=shadcn</code>. When
a recipe genuinely does not exist in any official kit, the error now suggests the
closest alternatives found across all kits instead of leaving you guessing.</p>
</div>
<div class="section">
<h2 id="toolkit-better-prop-and-block-documentation"><a class="headerlink" href="#toolkit-better-prop-and-block-documentation" title="Permalink to this headline">Toolkit: better <code translate="no" class="notranslate">@prop</code> and <code translate="no" class="notranslate">@block</code> documentation</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/Kocal">
                <img src="https://github.com/Kocal.png" alt="Hugo Alliaume">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/Kocal">Hugo Alliaume</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/ux/pull/3694">#3694</a>
                                                </span>
            </div>
</div>
<p>Component documentation comments now have a single, well-defined format. A new
<code translate="no" class="notranslate">ComponentDocParser</code> reads the <code translate="no" class="notranslate">{# @prop #}</code> and <code translate="no" class="notranslate">{# @block #}</code> comments
at the top of a Twig component, and a companion <code translate="no" class="notranslate">ComponentDocChecker</code> lints them
for consistency (capitalized descriptions ending with a period, valid types, and
no more hand-written "Defaults to ..." strings):</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-comment">{# @prop defaultValue string Define the open Tabs at initial rendering. #}</span><span class="xml">
</span><span class="hljs-comment">{# @prop orientation 'horizontal'|'vertical' Define the visual orientation. #}</span><span class="xml">
</span><span class="hljs-comment">{# @block content The default block. #}</span><span class="xml">
</span><span class="hljs-template-tag">{%- <span class="hljs-name">props</span> defaultValue = <span class="hljs-string">''</span>, orientation = <span class="hljs-string">'horizontal'</span> -%}</span></code></pre>
    </div>
</div>
<p>Default values are now read directly from the <code translate="no" class="notranslate">{% props %}</code> tag, so they are
no longer duplicated in the description. The same parser can power both the UX
website and the Toolkit linter, and it gives LLMs a clear structure to fix
documentation issues against.</p>
</div>
<div class="section">
<h2 id="shadcn-tooltip-fixes"><a class="headerlink" href="#shadcn-tooltip-fixes" title="Permalink to this headline">Shadcn tooltip fixes</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/Kocal">
                <img src="https://github.com/Kocal.png" alt="Hugo Alliaume">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/Kocal">Hugo Alliaume</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/symfony/ux/pull/3696">#3696</a>
                                                </span>
            </div>
</div>
<p>The Shadcn <code translate="no" class="notranslate">tooltip</code> now dismisses itself on scroll and resize, and no longer
intercepts pointer events while hidden, so it stops swallowing clicks on the
elements underneath it.</p>
</div>
<div class="section">
<h2 id="notable-bug-fixes"><a class="headerlink" href="#notable-bug-fixes" title="Permalink to this headline">Notable bug fixes</a></h2>
<p>LiveComponent no longer returns a 500 error on malformed hydration payloads,
handles nullable collection properties correctly, and stops the data-loading
scanner from ignoring <code translate="no" class="notranslate">data-live-ignore</code> subtrees. Autocomplete fixes a
<code translate="no" class="notranslate">LIKE ESCAPE</code> clause that broke search on PostgreSQL.</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/symfony/ux/pull/3705" class="reference external" rel="external noopener noreferrer" target="_blank">#3705</a> [StimulusBundle] Add support for Symfony Reprise (@Kocal)</li>
<li><a href="https://github.com/symfony/ux/pull/3702" class="reference external" rel="external noopener noreferrer" target="_blank">#3702</a> [StimulusBundle] Support preserved <code translate="no" class="notranslate">/*! stimulusFetch: 'lazy' */</code> syntax (@IndraGunawan)</li>
<li><a href="https://github.com/symfony/ux/pull/3703" class="reference external" rel="external noopener noreferrer" target="_blank">#3703</a> [StimulusBundle] Sort custom controllers to keep the generated loader deterministic (@Amoifr)</li>
<li><a href="https://github.com/symfony/ux/pull/3676" class="reference external" rel="external noopener noreferrer" target="_blank">#3676</a> [LiveComponent] Avoid 500 errors on malformed hydration payloads (@Amoifr)</li>
<li><a href="https://github.com/symfony/ux/pull/3688" class="reference external" rel="external noopener noreferrer" target="_blank">#3688</a> [LiveComponent] Fix data-loading scanner ignoring data-live-ignore subtrees (@Amoifr)</li>
<li><a href="https://github.com/symfony/ux/pull/3690" class="reference external" rel="external noopener noreferrer" target="_blank">#3690</a> [LiveComponent] Fix support for nullable collection properties on component (@rogierknoester)</li>
<li><a href="https://github.com/symfony/ux/pull/3700" class="reference external" rel="external noopener noreferrer" target="_blank">#3700</a> [Toolkit] Resolve <code translate="no" class="notranslate">ux:install</code> recipe name case-insensitively and suggest alternatives (@Kocal)</li>
<li><a href="https://github.com/symfony/ux/pull/3696" class="reference external" rel="external noopener noreferrer" target="_blank">#3696</a> [Toolkit][Shadcn] Dismiss the <code translate="no" class="notranslate">tooltip</code> on scroll and resize, and stop it from intercepting pointer events while hidden (@Kocal)</li>
<li><a href="https://github.com/symfony/ux/pull/3694" class="reference external" rel="external noopener noreferrer" target="_blank">#3694</a> [Toolkit] Refactor (again) but improve <code translate="no" class="notranslate">@prop</code> and <code translate="no" class="notranslate">@block</code> comments format (@Kocal)</li>
<li><a href="https://github.com/symfony/ux/pull/3685" class="reference external" rel="external noopener noreferrer" target="_blank">#3685</a> [Autocomplete] Fix LIKE ESCAPE clause breaking search on PostgreSQL (@Amoifr)</li>
<li><a href="https://github.com/symfony/ux/pull/3477" class="reference external" rel="external noopener noreferrer" target="_blank">#3477</a> [Shadcn] Add Sonner (@makraz)</li>
<li><a href="https://github.com/symfony/ux/pull/3693" class="reference external" rel="external noopener noreferrer" target="_blank">#3693</a> [Toolkit] Make component rendering snapshots independent from the libxml version (@Kocal)</li>
<li><a href="https://github.com/symfony/ux/pull/3482" class="reference external" rel="external noopener noreferrer" target="_blank">#3482</a> [Toolkit][Shadcn] Add Combobox (@makraz)</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/symfony-ux-3-3-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Wed, 15 Jul 2026 08:17:00 +0200</pubDate>
            <comments>https://symfony.com/blog/symfony-ux-3-3-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[New SymfonyCasts Course: Upgrading to Symfony 8]]></title>
            <link>https://symfony.com/blog/new-symfonycasts-course-upgrading-to-symfony-8?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>One of Symfony&#039;s greatest strengths is its upgrade process. Thanks to the 
backward compatibility promise and deprecation system, major upgrades 
are smooth, predictable, and, dare I say it, enjoyable!

Our newest tutorial is now available - and completely…</description>
            <content:encoded><![CDATA[
                                <p>One of Symfony's greatest strengths is its upgrade process. Thanks to the 
backward compatibility promise and deprecation system, major upgrades 
are smooth, predictable, and, dare I say it, enjoyable!</p>

<p>Our newest tutorial is now available - and <strong>completely free</strong>:</p>

<p>👉 <strong><a href="https://symfonycasts.com/screencast/symfony8-upgrade">Upgrading to Symfony 8</a></strong></p>

<p>In this course, we take a real Symfony application and guide it through
the entire upgrade process. You'll learn how to identify and fix
deprecations, modernize dependencies, prepare for PHP 8.4, and upgrade to
Symfony 8 with confidence.</p>

<p>By the end, you'll have a practical, repeatable process that you can apply
to your own applications - making future upgrades smaller, safer, and much
less stressful.</p>

<h2>What This Course Covers</h2>

<p>This course follows a real-world Symfony application through the upgrade
process, some of the things you'll learn include:</p>

<ul>
<li>Understanding Symfony's backward compatibility promise</li>
<li>Finding and fixing deprecations</li>
<li>Using automated tests to upgrade safely</li>
<li>Updating Composer dependencies</li>
<li>Preparing your application for Symfony 8 and PHP 8.4</li>
<li>Modernizing Doctrine integrations</li>
<li>Cleaning up deprecated configuration and APIs</li>
<li>Verifying third-party bundle compatibility</li>
</ul>

<p>As a <a href="https://symfonycasts.com/screencast/symfony8-upgrade/composer-audit"><strong>bonus chapter</strong></a>,
we also cover something that's become increasingly
important for every PHP developer: dependency security.</p>

<p>Recent advances in AI-assisted security auditing have dramatically
increased the number of vulnerabilities being discovered across the entire
software ecosystem. That's good news - issues are being found and fixed
faster than ever - but it also means it's more important than ever to stay
on top of dependency updates.</p>

<p>In the bonus chapter, you'll learn how to use Composer's built-in
<code>composer audit</code> command to identify known vulnerabilities, understand
security advisories, and keep your applications secure as part of your
regular maintenance workflow.</p>

<h2>Who Is This For?</h2>

<p>This course is perfect if you:</p>

<ul>
<li>Maintain Symfony applications that need to stay current</li>
<li>Want a repeatable process for framework upgrades</li>
<li>Feel intimidated by major version upgrades</li>
<li>Want to better understand Symfony's upgrade philosophy</li>
<li>Care about keeping your dependencies secure</li>
</ul>

<p>Whether you're upgrading your first application or your fiftieth, this
course will help make the process predictable and approachable.</p>

<h2>What's Next on SymfonyCasts?</h2>

<p>If this course leaves you wanting more, we're already releasing the next
chapter in your Symfony journey.</p>

<ul>
<li><strong><a href="https://symfonycasts.com/screencast/symfony8-security">Symfony Security: The Basics</a></strong> -
learn the fundamentals of Symfony's security system, including
authentication, login forms, user providers, password hashing, CSRF
protection, and more.</li>
</ul>

<p>And coming soon:</p>

<ul>
<li><strong><a href="https://symfonycasts.com/screencast/e2e-testing">E2E Testing</a></strong> -
a practical guide to browser testing, including authentication,
JavaScript interactions, debugging tools, and complete user flows from
end to end.</li>
</ul>

<p>In the meantime, check out a couple of our recent blog posts:</p>

<ul>
<li><p><strong><a href="https://symfonycasts.com/blog/honest-entities">Keeping Doctrine Entities Honest</a></strong> -
Should your Doctrine entities always represent valid domain objects?
We explore a different approach that separates persistence from user
input using Symfony's ObjectMapper.</p></li>
<li><p><strong><a href="https://symfonycasts.com/blog/brontie-your-ai-companion">Meet Brontie, Your AI Companion</a></strong> -
Meet our new AI-powered course assistant that can answer questions about
the current chapter, explain concepts, and help you learn faster without
leaving the course.</p></li>
</ul>

<p>Happy upgrading!</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-symfonycasts-course-upgrading-to-symfony-8?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Kevin Bond ]]></dc:creator>
            <pubDate>Mon, 13 Jul 2026 21:40:00 +0200</pubDate>
            <comments>https://symfony.com/blog/new-symfonycasts-course-upgrading-to-symfony-8?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[A Week of Symfony #1019 (July 6–12, 2026)]]></title>
            <link>https://symfony.com/blog/a-week-of-symfony-1019-july-6-12-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>This week, development activity focused on various improvements, such as enhancing the DX of AssetMapper in debug mode and allowing developers to disable redirects on logout. There were also proposals to improve Messenger with a new command and to add pipe…</description>
            <content:encoded><![CDATA[
                                <p>This week, development activity focused on various improvements, such as <a href="https://github.com/symfony/symfony/commit/d56fec85da23b3e8b893c505c427048549e26b39">enhancing the DX of AssetMapper</a> in debug mode and allowing developers to <a href="https://github.com/symfony/symfony/commit/71d1fa7cbb93c31465b7645fd304de71ca6f2e8c">disable redirects on logout</a>. There were also proposals to <a href="https://github.com/symfony/symfony/pull/64829">improve Messenger with a new command</a> and to add <a href="https://github.com/symfony/symfony/pull/64844">pipe operator compatibility</a> to the Validator component.</p>

<h2>Symfony development highlights</h2>

<p>This week, 48 pull requests were merged (31 in code and 17 in docs) and 25 issues were closed (12 in code and 13 in docs). Excluding merges, 22 authors made 5,573 additions and 2,979 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/8bce4feb83a710eea4df0c5bb3282297417678ac">8bce4fe</a>: &#91;Cache&#93; remove always-true method_exists() check in FilesystemCommonTrait::__destruct()</li>
<li><a href="https://github.com/symfony/symfony/commit/2aa4d7dc48489bc8ade6d83534229dde0fef0413">2aa4d7d</a>: &#91;Scheduler&#93; fix jitter shouldn't make scheduler miss runs</li>
<li><a href="https://github.com/symfony/symfony/commit/cf7a2d1f31f9932e55644713c37a15ff89653358">cf7a2d1</a>: &#91;Serializer&#93; fix support check for nested array items</li>
<li><a href="https://github.com/symfony/symfony/commit/fd30af703bc126ab8f15a2800819022111eb826a">fd30af7</a>: &#91;Console&#93; fix SymfonyStyle questions when using output sections</li>
<li><a href="https://github.com/symfony/symfony/commit/62cd8e92649217fd8f50b8cc93dd8a7f8a996af9">62cd8e9</a>: &#91;Console&#93; fall back to "stty sane" when restoring the captured terminal state fails</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/7c9773ce62bab38744fef715ccd985c577d9875f">7c9773c</a>: &#91;Notifier&#93; add handling for the Prelude bridge to UnsupportedSchemeException</li>
<li><a href="https://github.com/symfony/symfony/commit/fa6e7fb43fc7a93741dbb5e8b223c485700206cf">fa6e7fb</a>: &#91;Tui&#93; repaint the full screen on resize so multiplexer reattaches are not blank</li>
</ul>

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

<ul>
<li><a href="https://github.com/symfony/symfony/commit/f504f7ef0e64cfea0a3b1d303acb6762ba270a70">f504f7e</a>: &#91;FrameworkBundle&#93; unregister its service when the EnumMappingMetadataFactory class does not exist</li>
<li><a href="https://github.com/symfony/symfony/commit/15b0727068f7f5d473e6aa097f7541bc9cf67e53">15b0727</a>: &#91;HttpClient&#93; remove unused code in AsyncResponse::__destruct()</li>
<li><a href="https://github.com/symfony/symfony/commit/71d1fa7cbb93c31465b7645fd304de71ca6f2e8c">71d1fa7</a>: &#91;Security&#93; allow disabling redirect on logout</li>
<li><a href="https://github.com/symfony/symfony/commit/d56fec85da23b3e8b893c505c427048549e26b39">d56fec8</a>: &#91;AssetMapper&#93; ignore compiled assets in debug mode</li>
<li><a href="https://github.com/symfony/symfony/commit/a1115aa08f98619351aab9658978373612b9cfab">a1115aa</a>: &#91;Serializer&#93; allow associative csv_headers to map and reorder columns when encoding</li>
</ul>

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

<ul>
<li><a href="https://github.com/symfony/symfony/pull/64844">[Validator] Make Validation invokable for use with the pipe operator</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64829">[Messenger] Add messenger:show command to inspect pending messages</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64866">[FrameworkBundle][Messenger] Add option to disable the RejectRedeliveredMessageMiddleware</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 ATH<br>
Contract / Freelance - €25 – €50 / hour<br>
Full remote<br>
<a href="https://symfony.com/jobs/4a82fc1">View details</a></li>
<li><strong>Lead Symfony Developer</strong> at DocuPet<br>
Full-time - CA$140,000 – CA$180,000 / year<br>
Full remote<br>
<a href="https://symfony.com/jobs/b6a97b9">View details</a></li>
<li><strong>DevOps for a Symfony project</strong> at Cloudpepper<br>
Full-time - $150,000 – $180,000 / year<br>
Full remote<br>
<a href="https://symfony.com/jobs/a9262d7">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/symfony8-security/logout-csrf">Symfony Security: The Basics: Protecting Logout with CSRF</a></li>
</ul>

<h2>They talked about us</h2>

<ul>
<li><a href="https://dev.to/kaikina/markdown-for-agents-self-hosted-one-symfony-subscriber-instead-of-a-cloudflare-plan-13cd">Markdown for Agents, Self-Hosted: One Symfony Subscriber Instead of a Cloudflare Plan</a></li>
<li><a href="https://dev.to/refaatalktifan/pimcore-upgrade-10-to-12-the-real-migration-path-3k8">Pimcore Upgrade 10 to 12: The Real Migration Path</a></li>
<li><a href="https://habr.com/ru/articles/1055764/">Контракт из кода, клиент из контракта: избавляемся от тройного дублирования в API</a></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-1019-july-6-12-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Sun, 12 Jul 2026 09:33:00 +0200</pubDate>
            <comments>https://symfony.com/blog/a-week-of-symfony-1019-july-6-12-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[A Week of Symfony #1018 (June 29 – July 5, 2026)]]></title>
            <link>https://symfony.com/blog/a-week-of-symfony-1018-june-29-july-5-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>This week, Symfony released Twig 3.28.0, with improvements to macros and the sandbox. In addition, we published a case study on using Symfony in the industrial sector. Lastly, we proposed a redesign of the exception page for Symfony applications.

Symfony…</description>
            <content:encoded><![CDATA[
                                <p>This week, Symfony released <a href="https://symfony.com/blog/twig-3-28-0-released">Twig 3.28.0</a>, with improvements to macros and the sandbox. In addition, we published <a href="https://symfony.com/blog/case-study-driving-green-innovation-how-symfony-empowered-veolia-s-digital-shift-in-industrial-waste-management">a case study</a> on using Symfony in the industrial sector. Lastly, we proposed <a href="https://github.com/symfony/symfony/pull/64766">a redesign of the exception page</a> for Symfony applications.</p>

<h2>Symfony development highlights</h2>

<p>This week, 33 pull requests were merged (21 in code and 12 in docs) and 25 issues were closed (18 in code and 7 in docs). Excluding merges, 18 authors made 5,518 additions and 4,348 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/8cb818215f84dd8ba5d3f1d430576b9e717f295f">8cb8182</a>: &#91;Yaml&#93; fix parsing of integers with a leading plus sign</li>
<li><a href="https://github.com/symfony/symfony/commit/f64a1a750100148a6e99a3953696333216646e78">f64a1a7</a>: &#91;PropertyInfo&#93; prevent PhpDocTypeHelper to wrongly assume keys type</li>
<li><a href="https://github.com/symfony/symfony/commit/4442aebcbdceec87680cee0692661603083f2d85">4442aeb</a>: &#91;HttpFoundation&#93; add RFC5737 and RFC3849 to IpUtils::PRIVATE_SUBNETS</li>
<li><a href="https://github.com/symfony/symfony/commit/041613db3ac53bf8ba4b84d0308d8634506fe3c9">041613d</a>: &#91;HttpFoundation&#93; add additional IP ranges for RFC2544 and RFC5180</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/c8ddb250f05c6656b630881f4383b01fe8a78446">c8ddb25</a>: &#91;Tui&#93; fix wrapping lines that end with whitespace followed by ANSI codes exceeding the width</li>
<li><a href="https://github.com/symfony/symfony/commit/c38eb1ce1ee5818d9ef89ec563db47fccf5a3a90">c38eb1c</a>: &#91;Console&#93; fix #[MapDateTime] arguments resolved as strings by BuiltinTypeValueResolver</li>
</ul>

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

<ul>
<li><a href="https://github.com/symfony/symfony/commit/1f6b2d5d6ee434984d37b086a4b4f82acebaf397">1f6b2d5</a>: &#91;HttpFoundation&#93; fold UriSigner version into the signature without a reserved parameter</li>
<li><a href="https://github.com/symfony/symfony/commit/ff431bba816e11fb6ea052fe2cebc849cb43267a">ff431bb</a>: &#91;ObjectMapper&#93; enable converting backed enums to their scalar values</li>
<li><a href="https://github.com/symfony/symfony/commit/e8d42cfecce19f6b452a084a788638d0cad48546">e8d42cf</a>: &#91;DependencyInjection&#93; allow computing #[AutoconfigureTag] attributes per tagged service</li>
<li><a href="https://github.com/symfony/symfony/commit/f78996a439ce86f373593cd115b17225342d3730">f78996a</a>: &#91;Yaml&#93; improve the error message for an unterminated quoted string</li>
<li><a href="https://github.com/symfony/symfony/commit/b4cc349565c47ffd540046f1685b632a3877eb47">b4cc349</a>: &#91;Translation&#93; update CrowdinProvider HTTP client’s base URI</li>
</ul>

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

<ul>
<li><a href="https://github.com/symfony/symfony/pull/64766">[ErrorHandler] Redesign the exception page</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64782">[Mailer] Add RemoteTemplateEmail to send emails rendered from providers</a></li>
<li><a href="https://github.com/symfony/symfony/issues/64776">[Mapping Query Parameters] Allow default values if validation fails</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64779">[Validator] Add a new constraint to validate values with inline closures</a></li>
<li><a href="https://github.com/symfony/symfony/issues/64777">[Messenger] Add a messenger:show command for pending messages</a></li>
</ul>

<h2>Symfony Jobs</h2>

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

<ul>
<li><strong>Lead Symfony Developer</strong> at DocuPet<br>
Full-time - CA$140,000 – CA$180,000 / year<br>
Full remote<br>
<a href="https://symfony.com/jobs/b6a97b9">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at KRUU GmbH<br>
Full-time - €60,000 – €75,000 / month<br>
Remote + part-time onsite (Bad Friedrichshall, Germany)<br>
<a href="https://symfony.com/jobs/b149b01">View details</a></li>
<li><strong>DevOps for a Symfony project</strong> at Cloudpepper<br>
Full-time - $150,000 – $180,000 / year<br>
Full remote<br>
<a href="https://symfony.com/jobs/a9262d7">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/symfony8-upgrade/composer-audit">Upgrading to Symfony 8: Composer Audit and Security Updates</a></li>
</ul>

<h2>They talked about us</h2>

<ul>
<li><a href="https://dev.to/gabrielanhaia/migrating-laravel-to-symfony-without-rewriting-your-domain-cde">Migrating Laravel to Symfony Without Rewriting Your Domain</a></li>
<li><a href="https://dev.to/symfinity/ui-kernel-design-tokens-as-symfony-infrastructure-31m">UI Kernel: Design Tokens as Symfony infrastructure</a></li>
<li><a href="https://dev.to/tito10047/the-problem-with-calendars-in-livewire-and-ux-live-components-51oe">The Problem with Calendars in Livewire and UX Live Components</a></li>
<li><a href="https://dev.to/gabrielanhaia/symfony-console-commands-as-thin-adapters-over-use-cases-5bkd">Symfony Console Commands as Thin Adapters Over Use Cases</a></li>
<li><a href="https://dev.to/johndivam/symfony-validating-secure-your-api-requests-45i8">Symfony: Validating &amp; Secure your API Requests</a></li>
<li><a href="https://antonio-turdo.medium.com/your-symfony-events-have-a-contract-generate-the-asyncapi-docs-from-your-code-e0100168f520">Your Symfony events have a contract: generate the AsyncAPI docs from your code</a></li>
<li><a href="https://medium.com/@ahmedbhs/ce-quobjectmapper-r%C3%A9sout-et-ce-qu-il-casse-3ce10e72a24d">Ce qu’ObjectMapper résout, et ce qu’il casse</a></li>
<li><a href="https://jolicode.com/blog/profiler-un-consumer-avec-blackfire">Profiler un consumer avec Blackfire</a></li>
</ul>

<h2>Upcoming Symfony Events</h2>

<ul>
<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-1018-june-29-july-5-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Sun, 05 Jul 2026 09:18:00 +0200</pubDate>
            <comments>https://symfony.com/blog/a-week-of-symfony-1018-june-29-july-5-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Twig 3.28.0 released]]></title>
            <link>https://symfony.com/blog/twig-3-28-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>Twig 3.28.0 is out. This release sharpens error reporting with column numbers,
brings back dynamic macro calls through the dot operator, and continues to
polish the sandbox with less runtime overhead and finer-grained allow-listing.
As usual, it also ships…</description>
            <content:encoded><![CDATA[
                                <p>Twig 3.28.0 is out. This release sharpens error reporting with column numbers,
brings back dynamic macro calls through the dot operator, and continues to
polish the sandbox with less runtime overhead and finer-grained allow-listing.
As usual, it also ships a batch of deprecations that pave the way for Twig 4.0.</p>
<div class="section">
<h2 id="column-numbers-in-syntax-errors"><a class="headerlink" href="#column-numbers-in-syntax-errors" title="Permalink to this headline">Column numbers in syntax errors</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/fabpot">
                <img src="https://github.com/fabpot.png" alt="Fabien Potencier">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/fabpot">Fabien Potencier</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/twigphp/twig/pull/4834">#4834</a>
                                                </span>
            </div>
</div>
<p>Until now, a Twig error only told you which line was at fault. On a dense line,
that left you scanning for the actual problem. Twig now tracks the source offset
of every token, so errors can point at the exact column.</p>
<p>The column is exposed through the new <code translate="no" class="notranslate">Error::getTemplateColumn()</code> method, and
the underlying token offset through <code translate="no" class="notranslate">Token::getOffset()</code>.</p>
</div>
<div class="section">
<h2 id="dynamic-macro-names-through-the-dot-operator"><a class="headerlink" href="#dynamic-macro-names-through-the-dot-operator" title="Permalink to this headline">Dynamic macro names through the dot operator</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/fabpot">
                <img src="https://github.com/fabpot.png" alt="Fabien Potencier">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/fabpot">Fabien Potencier</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/twigphp/twig/pull/4838">#4838</a>
                                                </span>
            </div>
</div>
<p>Calling a macro whose name is only known at runtime used to rely on the
<code translate="no" class="notranslate">attribute()</code> function, which was deprecated in favor of the dot operator; but
the dot operator did not support macros. That gap is now closed:</p>
<div translate="no" data-loc="5" 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">import</span></span> <span class="hljs-string">"forms.html.twig"</span> as forms %}</span><span class="xml">

</span><span class="hljs-template-tag">{% <span class="hljs-name"><span class="hljs-keyword">set</span></span> field = <span class="hljs-string">"text"</span> %}</span><span class="xml">

</span><span class="hljs-template-variable">{{ forms.(field)(name, value) }}</span></code></pre>
    </div>
</div>
<p>The parenthesized expression is evaluated and used as the macro name, so you can
pick a macro dynamically without falling back to a deprecated function.</p>
</div>
<div class="section">
<h2 id="sandbox-mark-callables-and-tags-as-always-allowed"><a class="headerlink" href="#sandbox-mark-callables-and-tags-as-always-allowed" title="Permalink to this headline">Sandbox: mark callables and tags as always allowed</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/fabpot">
                <img src="https://github.com/fabpot.png" alt="Fabien Potencier">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/fabpot">Fabien Potencier</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/twigphp/twig/pull/4816">#4816</a>
                     and                                     <a target="_blank" href="https://github.com/twigphp/twig/pull/4819">#4819</a>
                                                </span>
            </div>
</div>
<p>Some filters, functions, tests, and tags are pure and inherently safe in a
sandboxed template. Forcing every security policy to allow-list them by hand
is noisy and error-prone.</p>
<p>Filters, functions, and tests now accept an <code translate="no" class="notranslate">always_allowed_in_sandbox</code>
option, and token parsers can implement <code translate="no" class="notranslate">isAlwaysAllowedInSandbox()</code>. When
set, the sandbox skips recording the name entirely, so it never reaches the
policy's security check: no allow-list entry required and no runtime cost. The
security policy also gains a dedicated allow-list for tests, with the safe
built-in tests flagged as always allowed so they keep working out of the box.</p>
</div>
<div class="section">
<h2 id="faster-sandboxed-templates"><a class="headerlink" href="#faster-sandboxed-templates" title="Permalink to this headline">Faster sandboxed templates</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/fabpot">
                <img src="https://github.com/fabpot.png" alt="Fabien Potencier">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/fabpot">Fabien Potencier</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/twigphp/twig/pull/4823">#4823</a>
                                                </span>
            </div>
</div>
<p>The sandbox used to wrap every argument of every callable with a <code translate="no" class="notranslate">__toString</code>
check. Twig now wraps an argument only when its PHP parameter type can actually
coerce a value to a string. Arguments typed as <code translate="no" class="notranslate">int</code>, for instance, are left
untouched, which cuts the amount of generated code and speeds up sandboxed
rendering. The approach stays conservative: untyped, <code translate="no" class="notranslate">mixed</code>, <code translate="no" class="notranslate">string</code>,
<code translate="no" class="notranslate">array</code>, <code translate="no" class="notranslate">iterable</code>, <code translate="no" class="notranslate">object</code>, <code translate="no" class="notranslate">Stringable</code>, and unknown class types all
keep their check.</p>
</div>
<div class="section">
<h2 id="stricter-template-correctness-checks"><a class="headerlink" href="#stricter-template-correctness-checks" title="Permalink to this headline">Stricter template correctness checks</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/fabpot">
                <img src="https://github.com/fabpot.png" alt="Fabien Potencier">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/fabpot">Fabien Potencier</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/twigphp/twig/pull/4292">#4292</a>
                                                </span>
            </div>
</div>
<p>Being able to parse and compile a template does not mean it is semantically
correct. A new <code translate="no" class="notranslate">CorrectnessNodeVisitor</code> centralizes those checks and
deprecates a few constructs that happened to work but were never meant to:
using a <code translate="no" class="notranslate">block</code> tag inside a capture node such as <code translate="no" class="notranslate">set</code>, and using a
<code translate="no" class="notranslate">macro</code>, <code translate="no" class="notranslate">extends</code>, or <code translate="no" class="notranslate">use</code> tag somewhere other than the root of a
template.</p>
</div>
<div class="section">
<h2 id="markup-is-now-effectively-final"><a class="headerlink" href="#markup-is-now-effectively-final" title="Permalink to this headline">Markup is now effectively final</a></h2>
<div class="blog-post-contributor-info">
    <div class="blog-post-contributor-avatar">
                    <a target="_blank" href="https://github.com/fabpot">
                <img src="https://github.com/fabpot.png" alt="Fabien Potencier">
            </a>
            </div>
    <div class="blog-post-contributor-contents">
        <span>Contributed by</span>
                    <a target="_blank" class="blog-post-contributor-name" href="https://github.com/fabpot">Fabien Potencier</a>
                                        <span class="blog-post-contributor-prs"> in
                                    <a target="_blank" href="https://github.com/twigphp/twig/pull/4840">#4840</a>
                                                </span>
            </div>
</div>
<p><code translate="no" class="notranslate">Twig\Markup</code> is now marked <code translate="no" class="notranslate">@final</code> and will become truly final in Twig
4.0.</p>
</div>
<div class="section">
<h2 id="notable-bug-fixes"><a class="headerlink" href="#notable-bug-fixes" title="Permalink to this headline">Notable bug fixes</a></h2>
<ul>
    <li>The <code translate="no" class="notranslate">include()</code> function now returns a <code translate="no" class="notranslate">Markup</code> object, so a result assigned
to a variable is no longer re-escaped when printed.</li>
<li>Nested <code translate="no" class="notranslate">block()</code> calls now
resolve against the overriding template when a block rendered through
<code translate="no" class="notranslate">block(name, template)</code> calls <code translate="no" class="notranslate">parent()</code>.</li>
<li>Printed expressions are cast to string so values that cannot be converted (arrays, non-<code translate="no" class="notranslate">Stringable</code> objects)
report a usable stack trace at the print location.</li>
<li>Backed enums are now rendered using their backing value in the <code translate="no" class="notranslate">html_attr</code> function.</li>
<li>Empty <code translate="no" class="notranslate">Markup</code> values are no longer treated as truthy in boolean expressions.</li>
</ul>
</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/4850" class="reference external" rel="external noopener noreferrer" target="_blank">#4850</a> Render backed enums using their backing value in the <code translate="no" class="notranslate">html_attr</code> function (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4841" class="reference external" rel="external noopener noreferrer" target="_blank">#4841</a> Fix Markup truthiness in boolean expressions (@xtrime-ru)</li>
<li><a href="https://github.com/twigphp/twig/pull/4842" class="reference external" rel="external noopener noreferrer" target="_blank">#4842</a> Fix a PHP 8.5 <code translate="no" class="notranslate">chr()</code> deprecation when decoding octal string escapes (@austinderrick)</li>
<li><a href="https://github.com/twigphp/twig/pull/4292" class="reference external" rel="external noopener noreferrer" target="_blank">#4292</a> Introduce a CorrectnessNodeVisitor to validate that templates are semantically correct (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4840" class="reference external" rel="external noopener noreferrer" target="_blank">#4840</a> Mark Markup as final (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4838" class="reference external" rel="external noopener noreferrer" target="_blank">#4838</a> Allow calling a macro with a dynamic name via the dot operator (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4835" class="reference external" rel="external noopener noreferrer" target="_blank">#4835</a> Fix markdown_to_html mangling content that starts with a blank line (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4819" class="reference external" rel="external noopener noreferrer" target="_blank">#4819</a> Add an allow-list for tests to the sandbox security policy (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4816" class="reference external" rel="external noopener noreferrer" target="_blank">#4816</a> Add an always_allowed_in_sandbox flag for filters, functions, and tags (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4834" class="reference external" rel="external noopener noreferrer" target="_blank">#4834</a> Track the source offset of each token and expose it in syntax errors (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4825" class="reference external" rel="external noopener noreferrer" target="_blank">#4825</a> Make the include() function return a Markup object (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4830" class="reference external" rel="external noopener noreferrer" target="_blank">#4830</a> Fix nested block() resolution when a directly rendered block calls parent() (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4828" class="reference external" rel="external noopener noreferrer" target="_blank">#4828</a> Stop reporting a skipped test in IntegrationTestCase when there is no legacy test to run (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4824" class="reference external" rel="external noopener noreferrer" target="_blank">#4824</a> Cast printed expressions to string so unconvertible values report a usable stack trace at the print location (@stof, @fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4826" class="reference external" rel="external noopener noreferrer" target="_blank">#4826</a> Make IntegrationTestCase and NodeTestCase compatible with PHPUnit 11 (@fabpot)</li>
<li><a href="https://github.com/twigphp/twig/pull/4823" class="reference external" rel="external noopener noreferrer" target="_blank">#4823</a> Skip the sandbox <code translate="no" class="notranslate">__toString</code> check on arguments whose PHP parameter type cannot implicitly coerce to string (@fabpot)</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-28-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Fabien Potencier ]]></dc:creator>
            <pubDate>Fri, 03 Jul 2026 22:52:00 +0200</pubDate>
            <comments>https://symfony.com/blog/twig-3-28-0-released?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[Case Study: Driving Green Innovation: How Symfony Empowered Veolia’s Digital Shift in Industrial Waste Management]]></title>
            <link>https://symfony.com/blog/case-study-driving-green-innovation-how-symfony-empowered-veolia-s-digital-shift-in-industrial-waste-management?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>
    


When dealing with over 10 million tons of hazardous waste every year, IT operational efficiency is a prerquisite and a critical environmental and public health responsibility

As the European leader in treating hazardous industrial waste and restoring…</description>
            <content:encoded><![CDATA[
                                <p><a href="https://www.webnet.fr" title="Logo" style="display: flex; justify-content: center; align-items: center; width: 100%;">
    <img src="https://symfony.com/uploads/assets/blog/logo.svg" alt="Logo">
</a></p>

<p>When dealing with over 10 million tons of hazardous waste every year, IT operational efficiency is a prerquisite and a critical environmental and public health responsibility</p>

<p>As the European leader in treating hazardous industrial waste and restoring polluted sites, <strong><a href="https://www.hazardouswasteeurope.veolia.com/fr">Veolia | Hazardous Waste Europe</a></strong> faced a major digital hurdle. Their legacy tool used by their sales representatives to subscribe their clients to the waste management functionalities of the customer portal, Optilia, was beginning to hit its performance and ergonomic limits.</p>

<p>To transform this cornerstone of their commercial operations, Veolia turned to technical expert <strong><a href="https://www.webnet.fr/">Webnet</a></strong>. The mission: overhaul and build a brand-new, lightning-fast, intuitive, and secure back-office platform.</p>

<p>Here is how Webnet leveraged the power, modularity, and technical consistency of Symfony to deliver a highly scalable cloud solution in just 10 months:</p>

<h3>The Strategy: Technical Continuity and Full Personalization</h3>

<p>When Webnet audited the project requirements, the decision to build the new Optilia back-office on Symfony emerged naturally for three strategic reasons:</p>

<ol>
<li><p><strong>Unifying the Ecosystem</strong>: Symfony was already the powerhouse driving the Optilia front-office portal. Opting for Symfony for the back-office ensured complete architectural continuity, which heavily simplified long-term maintenance and future feature scalability.</p></li>
<li><p><strong>Absolute Freedom</strong>: Industrial waste management involves highly specific workflows, unique data structures, and complex compliance tracking. Symfony provided the engineering team with complete flexibility to craft customized business features without dealing with framework constraints.</p></li>
<li><p><strong>Proven Team Expertise</strong>: As a seasoned expert in custom web application development, Webnet knew they could rely on the modern foundations of Symfony to guarantee code quality, robust security, and rapid development cycles.</p></li>
</ol>

<h3>Under the Hood: The Symfony Components Driving the Back-Office</h3>

<p>To fulfill Veolia high standards of responsiveness and administrative control, Webnet deployed a multi-disciplinary team, including 4 dedicated PHP/Symfony developers.</p>

<p>The team designed a robust stack combining PHP, Symfony, PostgreSQL, and AWS Cloud hosting. Instead of over-engineering the platform with heavy external layers, the team cleverly picked specific Symfony components to address their core technical challenges:</p>

<ul>
<li>🎨 <strong>symfony/ux-live-component &amp; symfony/stimulus-bundle</strong>: Built a highly reactive, snappy interface with real-time UI updates, completely bypassing the need for a complex JavaScript framework.</li>
<li>🚀 <strong>symfony/asset-mapper &amp; symfonycasts/sass-bundle</strong>: Streamlined modern asset compilation and native versioning without introducing any Node.js dependencies.</li>
<li>⚙️ <strong>symfony/messenger &amp; symfony/scheduler</strong>: Offloaded heavy data processing to asynchronous queues and smoothly automated recurring background routines.</li>
<li>⚙️ <strong>🔒 symfony/security-bundle</strong>: Provided robust, enterprise-grade access control to enforce strict authorization rules across internal sales teams.</li>
</ul>

<h3>Results: High Adoption and Technical Scalability</h3>

<p>Ten months after the development kick-off, the new back-office platform went live. Webnet comprehensive approach, blending expert engineering with user training and change management—resulted in immediate success:</p>

<ol>
<li><p><strong>Dramatically Faster Operations</strong>: Sales teams transitioned from a sluggish legacy system to a fast, intuitive experience, slashing wait times and accelerating subscription workflows.</p></li>
<li><p><strong>Enthusiastic User Adoption</strong>: The ergonomic UX delivered through Symfony UX renewed team enthusiasm and drove instant internal adoption.</p></li>
<li><p><strong>Stronger Client Relationships</strong>: The enhanced administration capabilities of the Optilia extranet gave clients greater transparency over environmental reporting.</p></li>
<li><p><strong>Future-Proof Architecture</strong>: Powered by AWS and the modularity of Symfony, the system is highly available and ready to evolve alongside fluctuating industrial waste volumes and shifting European regulations.</p></li>
</ol>

<p>By choosing Symfony, Webnet and Veolia proved that enterprise-grade environmental management tools can be both technologically sophisticated yet simple and intuitive to use.</p>

<hr />

<p><strong>Technical stack</strong></p>

<ul>
<li>Symfony</li>
<li>PostgreSQL</li>
<li>AWS Cloud hosting</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/case-study-driving-green-innovation-how-symfony-empowered-veolia-s-digital-shift-in-industrial-waste-management?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Eloïse Charrier ]]></dc:creator>
            <pubDate>Thu, 02 Jul 2026 14:30:00 +0200</pubDate>
            <comments>https://symfony.com/blog/case-study-driving-green-innovation-how-symfony-empowered-veolia-s-digital-shift-in-industrial-waste-management?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
                        <item>
            <title><![CDATA[A Week of Symfony #1017 (June 22–28, 2026)]]></title>
            <link>https://symfony.com/blog/a-week-of-symfony-1017-june-22-28-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</link>
            <description>This week, maintenance versions 6.4.42, 7.4.14, 8.0.14, and 8.1.1 were released. In addition, development activity for the upcoming Symfony 8.2 version was intense, adding new features such as a Cron constraint for validating cron expressions, single-use…</description>
            <content:encoded><![CDATA[
                                <p>This week, maintenance versions <a href="https://symfony.com/blog/symfony-6-4-42-released">6.4.42</a>, <a href="https://symfony.com/blog/symfony-7-4-14-released">7.4.14</a>, <a href="https://symfony.com/blog/symfony-8-0-14-released">8.0.14</a>, and <a href="https://symfony.com/blog/symfony-8-1-1-released">8.1.1</a> were released. In addition, development activity for the upcoming Symfony 8.2 version was intense, adding new features such as a <a href="https://github.com/symfony/symfony/commit/73c8e67a26c3c819dc07fd636ec18938266c55e1">Cron constraint</a> for validating cron expressions, <a href="https://github.com/symfony/symfony/commit/d0e391402bfe6849b1c659d4effb4c928a93ad68">single-use signed URLs</a>, a visual indicator for <a href="https://github.com/symfony/symfony/commit/7bf037c0de4066d52eeec463820e8d099cb3d563">dumped variables</a> in the profiler, and support for <a href="https://github.com/symfony/symfony/commit/1b0f4f1e0593f7098e227bbe4a5999f64858c9ea">passing non-string parameters</a> to constraints.</p>

<h2>Symfony development highlights</h2>

<p>This week, 51 pull requests were merged (40 in code and 11 in docs) and 26 issues were closed (18 in code and 8 in docs). Excluding merges, 24 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/92dbe51dbe310ea6c5464c2888304421a034173b">92dbe51</a>: &#91;Validator&#93; add translated messages for the Cron constraint</li>
<li><a href="https://github.com/symfony/symfony/commit/1a7bb416737af21e258d93371c1ce325f4e968b6">1a7bb41</a>: &#91;Serializer&#93; fix GetSetMethodNormalizer denormalization of constructor only objects</li>
<li><a href="https://github.com/symfony/symfony/commit/dcb96d2b05292985831f9581b555d51c07e5b4ff">dcb96d2</a>: &#91;VarExporter&#93; adapt ProxyHelper tests to PHP 8.6 null byte rendering in default values</li>
<li><a href="https://github.com/symfony/symfony/commit/10fd24636ef0ecb1de10f773e4491b8028e8c6c1">10fd246</a>: &#91;String&#93; fix splice() on multibyte strings</li>
<li><a href="https://github.com/symfony/symfony/commit/1b9152373d2db6e5885bf2c6438354451393ca99">1b91523</a>: &#91;Filesystem&#93; trim trailing whitespace from the tempnam() prefix</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/ae1bb52b960bfa497cff887dcfca5ab77f1910ea">ae1bb52</a>: &#91;Security&#93; fix PHPDoc of OidcTokenGenerateCommand::addGenerator</li>
</ul>

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

<ul>
<li><a href="https://github.com/symfony/symfony/commit/6a74266fbe372ec1235e91338cb6e45ce5e839d8">6a74266</a>: &#91;Mailer&#93; reorder EsmtpTransport authenticators to prefer PLAIN over obsolete LOGIN</li>
<li><a href="https://github.com/symfony/symfony/commit/043c9936f045dc01e48114d6a7d327e979e4ae4a">043c993</a>: &#91;Translation&#93; make LocoProvider::read() fetch every locale when passed none</li>
<li><a href="https://github.com/symfony/symfony/commit/e2cc5dbe2efccb1a8055a24a43c81f2f35c7a2af">e2cc5db</a>: &#91;HttpFoundation&#93; deprecate not passing an expiry to UriSigner::sign()</li>
<li><a href="https://github.com/symfony/symfony/commit/513fc8a34480903e5e078ac507d5aabc261b3873">513fc8a</a>: &#91;Notifier&#93; allow set region SweegoOptions</li>
<li><a href="https://github.com/symfony/symfony/commit/73c8e67a26c3c819dc07fd636ec18938266c55e1">73c8e67</a>: &#91;Validator&#93; add Cron constraint to validate cron expressions</li>
<li><a href="https://github.com/symfony/symfony/commit/5c1b56d06508b4dabb9725a1de2c511e8a7e2ba7">5c1b56d</a>: &#91;JsonStreamer&#93; add BcMath\Number and GMP value object</li>
<li><a href="https://github.com/symfony/symfony/commit/840decc8219ea6e526d33a598f180efd867210c7">840decc</a>: &#91;TypeInfo&#93; add type narrowing on Type::accepts()</li>
<li><a href="https://github.com/symfony/symfony/commit/4f7bc17a849a1ec10ebdc3caed61ceffb011a54d">4f7bc17</a>: &#91;FrameworkBundle&#93; add --dispatchers option to debug:event-dispatcher command</li>
<li><a href="https://github.com/symfony/symfony/commit/b4319d0fe98b2e699394e6d4bfd74b14c34d7d30">b4319d0</a>: &#91;HttpFoundation&#93; refactor DEFAULT_ENCODING_OPTIONS to use expression</li>
<li><a href="https://github.com/symfony/symfony/commit/7bf037c0de4066d52eeec463820e8d099cb3d563">7bf037c</a>: &#91;HttpKernel, WebProfilerBundle&#93; add dump icon in result list</li>
<li><a href="https://github.com/symfony/symfony/commit/b18300d74593944f4d617b5f997611922c151025">b18300d</a>: &#91;Workflow&#93; add $disabledEvents to permanently silence events at the workflow level</li>
<li><a href="https://github.com/symfony/symfony/commit/33d63a5d3945d7d7c497cc226e9896ae9d420e9f">33d63a5</a>: &#91;DoctrineBridge&#93; add IterableToArrayCollection transformer for Object Mapper</li>
<li><a href="https://github.com/symfony/symfony/commit/1b0f4f1e0593f7098e227bbe4a5999f64858c9ea">1b0f4f1</a>: &#91;Validator&#93; allow non-string values in ConstraintViolationBuilderInterface::setParameter()</li>
<li><a href="https://github.com/symfony/symfony/commit/dce1b899ab0c0e4cef9159c083ef535387a8db12">dce1b89</a>: &#91;FrameworkBundle&#93; deprecate the framework.ide config option</li>
<li><a href="https://github.com/symfony/symfony/commit/c8461c34b7c90d4d124c292bc99ed535093db03c">c8461c3</a>: &#91;FrameworkBundle&#93; don't reference potentially missing WorkflowEvents class</li>
<li><a href="https://github.com/symfony/symfony/commit/c0615aef827f1c7e9ff243e423cd7f568d5a04b3">c0615ae</a>: &#91;DoctrineBridge&#93; store whether a query ran on a primary</li>
<li><a href="https://github.com/symfony/symfony/commit/c35bfc298c2e4ad5785e958966b27bef6d14fc3b">c35bfc2</a>: &#91;FrameworkBundle&#93; fix service _instanceof type</li>
<li><a href="https://github.com/symfony/symfony/commit/ce9ef6b5375364292f063162179ef026637c3ae8">ce9ef6b</a>: &#91;Mailer&#93; improve error message when SMTP server lacks SMTPUTF8 support</li>
<li><a href="https://github.com/symfony/symfony/commit/d0e391402bfe6849b1c659d4effb4c928a93ad68">d0e3914</a>: &#91;HttpFoundation&#93; allow creating single-use signed urls</li>
<li><a href="https://github.com/symfony/symfony/commit/8e12009eae3dd34db84c707fee3c024d2b7fa4f8">8e12009</a>: &#91;Serializer&#93; deprecate denormalizing non-list arrays into list-typed properties</li>
</ul>

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

<ul>
<li><a href="https://github.com/symfony/symfony/pull/64703">[FrameworkBundle] Add an interactive debug command</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64704s">[DependencyInjection] Write a CACHEDIR.TAG file in the build directory</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64720/changes">[JsonStreamer] Scan tokens in bulk in the read Lexer</a></li>
<li><a href="https://github.com/symfony/symfony/issues/64719">[MapQueryParameter] support of default value</a></li>
<li><a href="https://github.com/symfony/symfony/pull/64723">[ConsoleCommand] Feature Request: Verbosity-aware command visibility</a></li>
</ul>

<h2>Symfony Jobs</h2>

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

<ul>
<li><strong>Lead Symfony Developer</strong> at DocuPet<br>
Full-time - CA$140,000 – CA$180,000 / year<br>
Full remote<br>
<a href="https://symfony.com/jobs/b6a97b9">View details</a></li>
<li><strong>Backend Symfony Developer</strong> at KRUU GmbH<br>
Full-time - €60,000 – €75,000 / month<br>
Remote + part-time onsite (Bad Friedrichshall, Germany)<br>
<a href="https://symfony.com/jobs/b149b01">View details</a></li>
<li><strong>DevOps for a Symfony project</strong> at Cloudpepper<br>
Full-time - $150,000 – $180,000 / year<br>
Full remote<br>
<a href="https://symfony.com/jobs/a9262d7">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/symfony8-security/login-logout-links">Symfony Security: The Basics: app.user and Login/Logout Links</a></li>
<li>(Video) <a href="https://symfonycasts.com/screencast/symfony8-security/password-hashing">Symfony Security: The Basics: Understanding Password Hashing</a></li>
</ul>

<h2>They talked about us</h2>

<ul>
<li><a href="https://baksla.sh/blog/fixing-symfony-ux-security-vulnerabilities">How a Symfony UX Security Fix Actually Happens</a></li>
<li><a href="https://medium.com/@serotoninja/omnia-ipsum-unified-placeholder-content-for-symfony-f8dfb1a89a6b">Omnia Ipsum: Unified placeholder content for Symfony</a></li>
<li><a href="https://bpacholek.medium.com/its-nuts-build-a-dynamic-website-using-symfony-nats-and-nuts-d2a928bc10c3">It's NUTS: build a dynamic website using Symfony, NATS and NUTS.</a></li>
<li><a href="https://medium.com/@s.zegers/getting-started-with-doctrine-field-encryption-in-symfony-d82f829bdd6f">Getting Started with Doctrine Field Encryption in Symfony</a></li>
<li><a href="https://medium.com/@serotoninja/why-i-started-building-symfony-native-packages-instead-of-doing-infrastructure-again-and-again-6f5c7e9f425d">Why building Symfony-native packages instead of doing infrastructure again and again</a></li>
<li><a href="https://medium.com/@serotoninja/why-symfony-projects-feel-more-fragmented-than-ever-eec6f7573e33">Why Symfony projects feel more fragmented than ever</a></li>
<li><a href="https://medium.com/@serotoninja/the-rule-behind-every-symfinity-package-49bc6220d191">The rule behind every Symfinity package</a></li>
<li><a href="https://medium.com/@ahmedbhs/%C3%A9crire-un-mod%C3%A8le-propre-en-php-avant-apr%C3%A8s-php-8-4-3efd56e1f5ec">Écrire un modèle propre en PHP : avant / après PHP 8.4</a></li>
</ul>

<h2>Upcoming Symfony Events</h2>

<ul>
<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-1017-june-22-28-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed</guid>
            <dc:creator><![CDATA[ Javier Eguiluz ]]></dc:creator>
            <pubDate>Sun, 28 Jun 2026 09:40:00 +0200</pubDate>
            <comments>https://symfony.com/blog/a-week-of-symfony-1017-june-22-28-2026?utm_source=Symfony%20Blog%20Feed&amp;utm_medium=feed#comments-list</comments>
        </item>
            </channel>
</rss>
