<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>bitExpert Blog</title>
        <link>https://blog.bitexpert.de/blog</link>
        <description>bitExpert Blog</description>
        <lastBuildDate>Thu, 09 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 bitExpert AG.</copyright>
        <item>
            <title><![CDATA[Configuring the Sylius Breadcrumb element]]></title>
            <link>https://blog.bitexpert.de/blog/configuring_sylius_breadcrumb</link>
            <guid>https://blog.bitexpert.de/blog/configuring_sylius_breadcrumb</guid>
            <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Enhance Sylius Admin's user experience by customizing breadcrumbs to display entity titles. Sylius's flexible configuration options make it easy to tailor your admin interface for improved navigation.]]></description>
            <content:encoded><![CDATA[<p>In the <a href="https://www.sylius.com/" target="_blank" rel="noopener noreferrer" class="">Sylius</a> Admin interface, a breadcrumb element is present in the content part of various pages.
This element is rendered using the <code>@SyliusBootstrapAdminUi/shared/crud/update/content/header/breadcrumbs.html.twig</code> Twig template.</p>
<p>Depending on your resource configuration, the breadcrumb element's output might not be ideal, displaying the entity's ID instead of a more user-friendly identifier like the title of the entity.</p>
<p><img decoding="async" loading="lazy" alt="Breadcrumb with ID" src="data:image/png;base64,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" width="581" height="79" class="img_ev3q"></p>
<p>Fortunately, Sylius provides a straightforward way to configure which field to display, enhancing the user experience. To customize the breadcrumb for your resource, you need to create a new configuration.</p>
<p>For a <code>Talk</code> resource, you would use the <code>sylius_admin.talk.update.content.header</code> Twig Hook to configure the <code>breadcrumbs</code> hookable element.
In the configuration for the hookable, you can specify the <code>rendered_field</code> to display a particular property of your entity. For example, to display the <code>title</code> property use the following configuration:</p>
<div class="language-YAML language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">'sylius_admin.talk.update.content.header'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">breadcrumbs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@SyliusBootstrapAdminUi/shared/crud/update/content/header/breadcrumbs.html.twig'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">configuration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">rendered_field</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> title</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">priority</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><br></span></code></pre></div></div>
<p>This configuration results in a more intuitive breadcrumb display, showing the title of the entity instead of its ID:
<img decoding="async" loading="lazy" alt="Breadcrumb with title" src="data:image/png;base64,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" width="673" height="89" class="img_ev3q"></p>
<p>If you want to render static text before the resource name, you can use the <code>rendered_field_prefix</code> configuration. Here's how you can do it:</p>
<div class="language-YAML language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">'sylius_admin.talk.update.content.header'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">breadcrumbs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@SyliusBootstrapAdminUi/shared/crud/update/content/header/breadcrumbs.html.twig'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">configuration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">rendered_field_prefix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'&gt; '</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">rendered_field</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> title</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">priority</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><br></span></code></pre></div></div>
<p>The rendered breadcrumb element will look like this:
<img decoding="async" loading="lazy" alt="Breadcrumb with prefix configuration" src="data:image/png;base64,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" width="718" height="89" class="img_ev3q"></p>
<p>This example demonstrates the customization capabilities of Sylius out of the box, allowing for tailored and user-friendly interfaces without extensive development.</p>]]></content:encoded>
            <category>PHP</category>
            <category>Sylius</category>
            <category>Symfony</category>
        </item>
        <item>
            <title><![CDATA[File uploads with the Sylius Settings plugin]]></title>
            <link>https://blog.bitexpert.de/blog/sylius_settings_file_upload</link>
            <guid>https://blog.bitexpert.de/blog/sylius_settings_file_upload</guid>
            <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Enhance the Sylius Settings plugin with file upload capabilities using Symfony's Data Transformer feature. Learn how to seamlessly integrate file uploads into your Sylius project with a custom transformer solution.]]></description>
            <content:encoded><![CDATA[<p>In one of our Sylius projects, we are using the <a href="https://github.com/monsieurbiz/SyliusSettingsPlugin" target="_blank" rel="noopener noreferrer" class="">Sylius Settings plugin</a>  by our friends from <a href="https://monsieurbiz.com/fr/" target="_blank" rel="noopener noreferrer" class="">Monsieur Biz</a> to manage settings efficiently.</p>
<p>This plugin has been instrumental in configuring "global" variables that merchants can modify without needing to rebuild or restart the Sylius application.</p>
<p>A recent feature request by the merchant required us to implement a document upload and download feature. The merchant needed to upload a document that customers could then download.
However, the Settings plugin does not support file uploads by default. Given that the plugin leverages Symfony Forms under the hood, we explored the possibility of integrating into the Symfony Form flow to upload files to a specific location.</p>
<p>Initially, we attempted to use the <code>PRE_SUBMIT</code> and <code>POST_SUBMIT</code> events to develop the requested feature. Unfortunately, this approach did not yield the desired results.
The main logic within the Settings entity is designed to work with objects implementing <code>DateTimeInterface</code> or <code>JsonSerializable</code>, but not with file objects directly.</p>
<p>After careful consideration, we discovered a straightforward solution: Using a <a href="https://symfony.com/doc/current/form/data_transformers.html" target="_blank" rel="noopener noreferrer" class="">Data Transformer</a> for the file upload process.
A Data Transformer acts as a "translator" between the application's logic and the user's view, converting data from one format to another.
Although this might not be the most convenient approach, it effectively addresses our specific use case.</p>
<p>In our <code>DocumentSettingsType</code> class, we configured the file upload field as follows:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">declare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">strict_types</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Type</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Settings</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Transformer</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">UploadedSettingsFileToFilenameTransformer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">MonsieurBiz</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">SyliusSettingsPlugin</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">AbstractSettingsType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">MonsieurBiz</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">SyliusSettingsPlugin</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">SettingsTypeInterface</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">Symfony</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Component</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Extension</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Core</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Type</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">FileType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">Symfony</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Component</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">FormBuilderInterface</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name-definition class-name">DocumentsSettingsType</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">AbstractSettingsType</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">SettingsTypeInterface</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">__construct</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword type-declaration" style="color:#00009f">string</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$kernelProjectDir</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">buildForm</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name type-declaration">FormBuilderInterface</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$builder</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword type-hint" style="color:#00009f">array</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$options</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:#00009f">void</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">addWithDefaultCheckbox</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$builder</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:#e3116c">'file_template'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name static-context">FileType</span><span class="token operator" style="color:#393A34">::</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string single-quoted-string" style="color:#e3116c">'label'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:#e3116c">'admin.ui.form.settings.file_template'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string single-quoted-string" style="color:#e3116c">'required'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token constant boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string single-quoted-string" style="color:#e3116c">'data_class'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$builder</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#e3116c">'file_template'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">addModelTransformer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">UploadedSettingsFileToFilenameTransformer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token property" style="color:#36acaa">kernelProjectDir</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>For the <code>file_template</code> form field, we register the <code>UploadedSettingsFileToFilenameTransformer</code> to take care of the file upload logic. The implementation of the <code>UploadedSettingsFileToFilenameTransformer</code> class looks like this:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token delimiter important">&lt;?php</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">declare</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">strict_types</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">namespace</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Transformer</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">App</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Controller</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">DocumentsController</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">Symfony</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Component</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Form</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">DataTransformerInterface</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token package">Symfony</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">Component</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">HttpFoundation</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">File</span><span class="token package punctuation" style="color:#393A34">\</span><span class="token package">UploadedFile</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">readonly</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name-definition class-name">UploadedSettingsFileToFilenameTransformer</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">DataTransformerInterface</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">__construct</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword type-declaration" style="color:#00009f">string</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$kernelProjectDir</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">transform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:#00009f">mixed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">reverseTransform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword return-type" style="color:#00009f">mixed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token variable" style="color:#36acaa">$value</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">instanceof</span><span class="token plain"> </span><span class="token class-name">UploadedFile</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$value</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$filename</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">uniqid</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">.</span><span class="token plain"> </span><span class="token string single-quoted-string" style="color:#e3116c">'.'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">.</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$value</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">guessExtension</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token variable" style="color:#36acaa">$value</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">move</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token property" style="color:#36acaa">kernelProjectDir</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">.</span><span class="token plain"> </span><span class="token class-name static-context">DocumentsController</span><span class="token operator" style="color:#393A34">::</span><span class="token constant" style="color:#36acaa">STORAGE_DIR</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$filename</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$filename</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>In our Data Transformer implementation, the <code>transform()</code> method returns null because we don't need to convert the file name back to an <code>UploadedFile</code> object.
The <code>reverseTransform()</code> method handles the file upload and returns the filename afterward.</p>]]></content:encoded>
            <category>PHP</category>
            <category>Sylius</category>
            <category>Symfony</category>
        </item>
        <item>
            <title><![CDATA[Announcing bitexpert/phpstan-sylius 0.3.0]]></title>
            <link>https://blog.bitexpert.de/blog/phpstan_sylius_0_3_0</link>
            <guid>https://blog.bitexpert.de/blog/phpstan_sylius_0_3_0</guid>
            <pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We've just released an updated version of our phpstan-sylius extension, bringing improved compatibility with the latest Sylius Stack features.]]></description>
            <content:encoded><![CDATA[<p>As I prepared for my live coding demo at the <a class="" href="https://blog.bitexpert.de/blog/ecommerce_opensource_summit_2026">E-Commerce Open Source Summit</a> in Paris later this week, I stumbled upon an interesting challenge:
Our <a href="https://github.com/bitExpert/phpstan-sylius" target="_blank" rel="noopener noreferrer" class="">phpstan-sylius</a> extension was not fully compatible with the latest features of the <a href="https://stack.sylius.com/" target="_blank" rel="noopener noreferrer" class="">Sylius Stack</a> release.</p>
<p>To fully leverage the principles of conference-driven development, I chose to launch a new version of the phpstan-sylius extension.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-enhancements-in-the-latest-release">Key enhancements in the latest release<a href="https://blog.bitexpert.de/blog/phpstan_sylius_0_3_0#key-enhancements-in-the-latest-release" class="hash-link" aria-label="Direct link to Key enhancements in the latest release" title="Direct link to Key enhancements in the latest release" translate="no">​</a></h3>
<p>The newest version of the extension introduces several notable improvements:</p>
<ul>
<li class="">Supports for the <code>#[AsGrid]</code> attribute: This includes considering the resourceClass configuration option to map grids to their corresponding resource classes</li>
<li class="">Check the enum grid filter for the resource class properties</li>
</ul>
<p>To try out the extension, you can install the latest version via Composer:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">composer.phar require </span><span class="token parameter variable" style="color:#36acaa">--dev</span><span class="token plain"> bitexpert/phpstan-sylius</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>PHP</category>
            <category>Sylius</category>
            <category>PHPStan</category>
        </item>
        <item>
            <title><![CDATA[PHPUnit 13: Managing return values for parameter sets]]></title>
            <link>https://blog.bitexpert.de/blog/phpunit13_return_values_for_parameter_sets</link>
            <guid>https://blog.bitexpert.de/blog/phpunit13_return_values_for_parameter_sets</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to simplify your testing workflow with PHPUnit 13's latest features. This post covers a key improvement: easily mocking multiple method calls with varying parameters.]]></description>
            <content:encoded><![CDATA[<p>Recently, my good friend <a href="https://phpc.social/@sebastian" target="_blank" rel="noopener noreferrer" class="">Sebastian Bergmann</a> published an article about how to use an alternative implementation of <code>withConsecutive()</code> calls in PHPUnit 13.</p>
<p>This article was particularly helpful as I had just upgraded one of our projects to PHPUnit 13 and needed to test multiple method calls.</p>
<p>However, I found that the article lacked information on managing return values. After testing a few approaches without success, I reached out to Sebastian, who kindly pointed me to the relevant documentation. In return, I promised to write a quick blog post covering my findings.</p>
<p>The newly introduced <code>withParameterSetsInOrder()</code> method allows you to configure a mock object to accept multiple parameter sets. Here's an example:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">$issuesMock</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">createMock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name static-context">Issues</span><span class="token operator" style="color:#393A34">::</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$issuesMock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">expects</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">exactly</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">method</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#e3116c">'create'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">withParameterSetsInOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$projectId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$title</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$description</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$projectId2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$title2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$description2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>If the order of the parameter sets doesn't matter, you can use the <code>withParameterSetsInAnyOrder()</code> method instead.</p>
<p>To define the return values for each call, use the <code>willReturn()</code> method and list all returning values as separate parameters:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">$issuesMock</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">createMock</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name static-context">Issues</span><span class="token operator" style="color:#393A34">::</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$issuesMock</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">expects</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">$this</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">exactly</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">method</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string single-quoted-string" style="color:#e3116c">'create'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">withParameterSetsInOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$projectId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$title</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$description</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$projectId2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$title2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token variable" style="color:#36acaa">$description2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">willReturn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>This will return the values <code>1</code> and <code>2</code> for the first and second calls to the mocked <code>create()</code> method, respectively.</p>
<p>In conclusion, the <code>withParameterSetsInOrder()</code> and <code>willReturn()</code> methods in PHPUnit 13 provide a convenient way to configure mock objects for multiple parameter sets and define return values for each call.</p>]]></content:encoded>
            <category>PHP</category>
            <category>PHPUnit</category>
        </item>
        <item>
            <title><![CDATA[Ecommerce Open Source Summit 2026]]></title>
            <link>https://blog.bitexpert.de/blog/ecommerce_opensource_summit_2026</link>
            <guid>https://blog.bitexpert.de/blog/ecommerce_opensource_summit_2026</guid>
            <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Join me at the Ecommerce Open Source Summit in Paris on March 26th, where I'll be sharing expert insights on how to accelerate development with the powerful Sylius Stack components.]]></description>
            <content:encoded><![CDATA[<p>The Friends of Presta organization will host the <a href="https://member.friendsofpresta.org/evenements/eo2s-2026" target="_blank" rel="noopener noreferrer" class="">Ecommerce Open Source Summit</a> 2026 in Paris at the 26th of March. This event promises to be an exciting gathering of like-minded individuals passionate about ecommerce and open-source technology.</p>
<p>I am thrilled to announce that I will be attending and speaking at the summit, where I will share insights on how to speed up development using the <a href="https://stack.sylius.com/" target="_blank" rel="noopener noreferrer" class="">Sylius Stack</a> components.</p>
<p>For those unfamiliar, Sylius Stack offers a powerful set of Symfony-based packages that enable developers to create sophisticated UIs and backend logic with minimal effort.</p>
<p>To demonstrate the capabilities of Sylius Stack, my session will take an unconventional approach - no slides!</p>
<p>Instead, I will do a live coding session, providing a hands-on look at how Sylius Stack can streamline development processes. This interactive approach will allow attendees to see firsthand the benefits of using Sylius Stack and how it can revolutionize their development workflow.</p>
<p>See you in Paris!</p>]]></content:encoded>
            <category>Sylius</category>
            <category>Conference</category>
            <category>e-commerce</category>
        </item>
        <item>
            <title><![CDATA[Sylius Hackathon & Meetup in Mannheim]]></title>
            <link>https://blog.bitexpert.de/blog/sylius_meetup_hackathon_mannheim_2026</link>
            <guid>https://blog.bitexpert.de/blog/sylius_meetup_hackathon_mannheim_2026</guid>
            <pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Join the Sylius community on April 30th in Mannheim for a Hackathon & Meetup featuring expert talks and networking.]]></description>
            <content:encoded><![CDATA[<p>Join us on <a href="https://www.meetup.com/phpug-rhein-neckar/events/312782219/" target="_blank" rel="noopener noreferrer" class="">April 30th in Mannheim</a> for an exciting Sylius Hackathon &amp; Meetup! 🎉 This year, we're taking it to the next level by combining our traditional meetup with a hackathon event.</p>
<p><img decoding="async" loading="lazy" alt="Sylius Meetup &amp;amp; Hackathon Mannheim 2026" src="https://blog.bitexpert.de/assets/images/event-55aad78cbf7bbdb528946ed4b6964bb5.jpg" width="1280" height="720" class="img_ev3q"></p>
<p>Whether you're a seasoned developer or just starting out, this is your chance to contribute to <a href="https://www.sylius.com/" target="_blank" rel="noopener noreferrer" class="">Sylius</a>, learn from the experts, and have a blast with like-minded individuals.</p>
<p>Meetup Highlights:</p>
<ul>
<li class="">Tideways Performance Monitoring: Benjamin Außenhofer will share insights on how to optimize your Sylius site's performance</li>
<li class="">Laioutr Introduction: Sebastian Langer from Laioutr will introduce us to their innovative platform and demonstrate how to seamlessly connect it to Sylius</li>
<li class="">Sylius, but different: I will showcase two exceptional Sylius implementations, highlighting the platform's flexibility and versatility</li>
</ul>
<p>Hackathon Fun:</p>
<ul>
<li class="">Contribute to Sylius and make a real impact on the community</li>
<li class="">Meet fellow developers, share knowledge, and learn from each other</li>
<li class="">Who knows? You might even get to meet a member of the Sylius core team!</li>
</ul>
<p>Don't miss this amazing opportunity to network, learn, and have fun with the Sylius community!</p>
<p>When: April 30th 10:00 (the meetup starts at 18:00)<br>
<!-- -->Where: Mannheim (bitExpert office)<br>
<!-- -->What to expect: Sylius Hackathon, Meetup, and plenty of fun<br>
<!-- -->Sign up here: <a href="https://www.meetup.com/phpug-rhein-neckar/events/312782219/" target="_blank" rel="noopener noreferrer" class="">Meetup</a></p>
<p>A huge THANK YOU to our amazing sponsors <a href="https://www.mollie.com/" target="_blank" rel="noopener noreferrer" class="">Mollie</a>, <a href="https://www.laioutr.com/" target="_blank" rel="noopener noreferrer" class="">Laioutr</a>, <a href="https://www.bitexpert.de/" target="_blank" rel="noopener noreferrer" class="">bitExpert</a>, and <a href="https://www.bitexpert.de/" target="_blank" rel="noopener noreferrer" class="">Sylius</a> who make this event possible.</p>]]></content:encoded>
            <category>Mannheim</category>
            <category>phpugmrn</category>
            <category>Sylius</category>
        </item>
        <item>
            <title><![CDATA[IBM Champion 2026]]></title>
            <link>https://blog.bitexpert.de/blog/ibm_champion_2026</link>
            <guid>https://blog.bitexpert.de/blog/ibm_champion_2026</guid>
            <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[I've been named an IBM Champion for 2026, and will continue sharing expertise on Hashicorp tools like Nomad, Vault, and Boundary. Stay tuned for upcoming blog posts and insights on infrastructure and technology.]]></description>
            <content:encoded><![CDATA[<p>I'm excited to share that I've been named an IBM Champion for 2026, building on my previous recognition as a <a class="" href="https://blog.bitexpert.de/blog/hashicorp_ambassador_2025">Hashicorp Ambassador 2025</a>.</p>
<p><img decoding="async" loading="lazy" alt="IBM Champion 2026" src="https://blog.bitexpert.de/assets/images/ibm_champion-78df93f73d01124390b44a49013d8369.jpg" width="800" height="800" class="img_ev3q"></p>
<p>As a long-time user of Hashicorp tools, including <a href="https://www.nomadproject.io/" target="_blank" rel="noopener noreferrer" class="">Nomad</a>, <a href="https://www.vaultproject.io/" target="_blank" rel="noopener noreferrer" class="">Vault</a>, and <a href="https://www.boundaryproject.io/" target="_blank" rel="noopener noreferrer" class="">Boundary</a>, I'm passionate about sharing my experiences and learnings with the community. These tools remain a crucial part of our infrastructure, and I'm excited to continue exploring their capabilities.</p>
<p>In the coming months, I'll be publishing a series of blog posts focused on Nomad, so be sure to stay tuned!</p>
<p>I'm honored to receive this recognition and look forward to ongoing knowledge-sharing and collaboration with the community.</p>]]></content:encoded>
            <category>Hashicorp</category>
            <category>Community</category>
            <category>Nomad</category>
            <category>Boundary</category>
            <category>IBM Champion</category>
        </item>
        <item>
            <title><![CDATA[PHPUGFFM 02/26 meetup]]></title>
            <link>https://blog.bitexpert.de/blog/phpugffm_meetup_march_2026</link>
            <guid>https://blog.bitexpert.de/blog/phpugffm_meetup_march_2026</guid>
            <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The PHPUG Frankfurt meetup is scheduled for March 19th at the DE-CIX office, featuring talks on 'Fellowship of Twig' and 'How to run LLMs locally' to help developers build interactive UIs and run large language models locally.]]></description>
            <content:encoded><![CDATA[<p>Save the date: the <a href="https://www.phpugffm.de/veranstaltungen/phpugffm-ii-2026/" target="_blank" rel="noopener noreferrer" class="">PHPUG Frankfurt meetup</a> is happening again on March 19th!</p>
<p>This time, we're gathering at the <a href="https://www.de-cix.net/" target="_blank" rel="noopener noreferrer" class="">DE-CIX office</a> in Frankfurt, where we have an exciting lineup of talks in store for you.</p>
<p>First up, Stephan Hochdörfer will present "Fellowship of Twig", a comprehensive introduction to Twig, Symfony UX, and Sylius Twig Hooks. Learn how to build interactive UIs with ease and take your development skills to the next level.</p>
<p>After a short break, Thomas Bley will take the stage to share his expertise on "How to run LLMs locally".</p>
<p>Join us in Frankfurt for an evening of learning, networking, and fun! Secure your spot by signing up here: <a href="https://www.phpugffm.de/veranstaltungen/phpugffm-ii-2026/" target="_blank" rel="noopener noreferrer" class="">https://www.phpugffm.de/veranstaltungen/phpugffm-ii-2026/</a></p>
<p>We look forward to seeing you there!</p>]]></content:encoded>
            <category>PHP</category>
            <category>Usergroup</category>
            <category>Frankfurt</category>
            <category>phpugffm</category>
        </item>
        <item>
            <title><![CDATA[How to update the OIDC config in Nomad?]]></title>
            <link>https://blog.bitexpert.de/blog/nomad_update_oidc_config</link>
            <guid>https://blog.bitexpert.de/blog/nomad_update_oidc_config</guid>
            <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to refresh your OpenID Connect (OIDC) configuration in Nomad when your OIDC secret expires, with a step-by-step guide on updating the auth method with a new client secret.]]></description>
            <content:encoded><![CDATA[<p>In a previous post, I <a class="" href="https://blog.bitexpert.de/blog/nomad_oidc_entra_id">covered</a> configuring Nomad to use OpenID Connect with Entra ID. However, when your OIDC secret expires, you'll need to refresh the OIDC config. But how do you do it?</p>
<p>Initially, I thought updating the OIDC config only required sending the changed properties, specifically the <code>OIDCClientSecret</code> property. Unfortunately, this approach didn't work as expected.</p>
<p>It turns out that even for an update, you need to send the complete OIDC config to Nomad again. This means creating a new OIDC config and updating your existing one to include the new secret.</p>
<p>Here's an example of what the updated config might look like:</p>
<div class="language-JSON language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"OIDCDiscoveryURL"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://login.microsoftonline.com/[TENANT_ID]]/v2.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"OIDCClientID"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[CLIENT_ID]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"OIDCClientSecret"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"[CLIENT_SECRET]"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"BoundAudiences"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"[CLIENT_ID]"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"AllowedRedirectURIs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"https://example.com/oidc/callback"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"https://example.com/ui/settings/tokens"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"ListClaimMappings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"groups"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"groups"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Once you have your updated config, you can run the <code>auth-method update</code> command for the auth method <code>oidc2</code> (or whatever name you chose when creating the auth method):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">nomad acl auth-method update </span><span class="token parameter variable" style="color:#36acaa">-config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">@./config.json oidc2</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>Devops</category>
            <category>Nomad</category>
            <category>Entra ID</category>
        </item>
        <item>
            <title><![CDATA[Hello 2FA Sylius Plugin!]]></title>
            <link>https://blog.bitexpert.de/blog/announcing_sylius_2fa</link>
            <guid>https://blog.bitexpert.de/blog/announcing_sylius_2fa</guid>
            <pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Our Sylius 2FA Plugin offers secure two-factor authentication for Sylius users, with flexible methods like Google Authenticator and email. Enhance your store's security with our easy-to-install plugin, compatible with Sylius 2.0 and higher.]]></description>
            <content:encoded><![CDATA[<p>Earlier this month, we released the first version of our <a href="https://github.com/bitExpert/sylius-2fa" target="_blank" rel="noopener noreferrer" class="">2FA Plugin</a> for Sylius.</p>
<p>This plugin was created to address a need that arose in a recent project, where the existing two-factor authentication plugins for Sylius were either incompatible with the latest Sylius version or no longer maintained.</p>
<p>The plugin is built on top of the <a href="https://symfony.com/bundles/SchebTwoFactorBundle/current/index.html" target="_blank" rel="noopener noreferrer" class="">SchebTwoFactorBundle</a>, which is widely regarded as the de facto standard for two-factor authentication in the Symfony ecosystem. By leveraging this established bundle, we aimed to provide a reliable and secure solution for Sylius users.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="https://blog.bitexpert.de/blog/announcing_sylius_2fa#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li class="">Compatible with Sylius 2.0 and higher</li>
<li class="">Admin users and shop users can enable two-factor authentication for their accounts</li>
<li class="">Choose between Google Authenticator or email as an authentication method</li>
<li class="">During login users can choose which authentication method to use</li>
</ul>
<p>Setting up two-factor authentication with our plugin is straightforward, thanks to a 3-step wizard:
<img decoding="async" loading="lazy" alt="Setup workflow" src="https://blog.bitexpert.de/assets/images/setup_workflow-e7417a9a505ed8b4dc2b4d7ede35fe2b.png" width="2500" height="488" class="img_ev3q"></p>
<p>During the login process, users can choose which configured authentication method to use:
<img decoding="async" loading="lazy" alt="Login Auth workflow" src="https://blog.bitexpert.de/assets/images/login-1888bde09fedd1b487b153b5ba19e878.png" width="1016" height="488" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://blog.bitexpert.de/blog/announcing_sylius_2fa#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<p>Install the plugin via Composer and follow the <a href="https://github.com/bitExpert/sylius-2fa?tab=readme-ov-file#installation" target="_blank" rel="noopener noreferrer" class="">setup instructions</a>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">composer</span><span class="token plain"> require bitexpert/sylius-2fa-plugin</span><br></span></code></pre></div></div>
<p>Let us know what you think about the plugin. We are happy to hear your feedback!</p>]]></content:encoded>
            <category>PHP</category>
            <category>Sylius</category>
            <category>Symfony</category>
        </item>
        <item>
            <title><![CDATA[PHPUGMRN 01/26 meetup]]></title>
            <link>https://blog.bitexpert.de/blog/phpugmrn_february_2026</link>
            <guid>https://blog.bitexpert.de/blog/phpugmrn_february_2026</guid>
            <pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Join the PHP User Group Rhein-Neckar's first meetup of 2026 on February 26th in Mannheim, Germany, for a day of networking, learning, and discussion with fellow PHP enthusiasts and professionals.]]></description>
            <content:encoded><![CDATA[<p>Save the date! Our first meetup in the <a href="https://www.meetup.com/phpug-rhein-neckar/events/305478333/" target="_blank" rel="noopener noreferrer" class="">Rhein-Neckar metropolitan region</a> for 2026 is just around the corner, taking place on February 26th, only two weeks from now.</p>
<p>We're thankful to <a href="https://www.october-labs.de/" target="_blank" rel="noopener noreferrer" class="">October Labs GmbH</a> for hosting us once again.</p>
<p>Interested in attending? Simply sign up on our <a href="https://www.meetup.com/phpug-rhein-neckar/events/312782216/" target="_blank" rel="noopener noreferrer" class="">meetup page</a> to secure your spot!</p>]]></content:encoded>
            <category>PHP</category>
            <category>Usergroup</category>
            <category>MRN</category>
            <category>phpugmrn</category>
        </item>
        <item>
            <title><![CDATA[Techradar 2026 update]]></title>
            <link>https://blog.bitexpert.de/blog/techradar_update_2026</link>
            <guid>https://blog.bitexpert.de/blog/techradar_update_2026</guid>
            <pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Discover the latest updates to our Techradar portfolio, featuring new solutions and tools. Get an objective assessment of our technology portfolio and explore the changes in our Languages & Frameworks, Tools, and Platforms & Operations quadrants.]]></description>
            <content:encoded><![CDATA[<p>It's time for another update to our <a href="https://blog.bitexpert.de/techradar/index.html" target="_blank" rel="noopener noreferrer" class="">Techradar</a>, where we share our latest thoughts and strategies on our key technology-focused areas. It's been <a class="" href="https://blog.bitexpert.de/blog/techradar_update_2025">a year</a> since our last update, and we're excited to share the changes and advancements we've made.</p>
<p>For those who may not be familiar, our TechRadar is a tool that helps us assess our technology portfolio objectively. It's divided into four key focus areas:
<a href="https://blog.bitexpert.de/techradar/languages-and-frameworks.html" target="_blank" rel="noopener noreferrer" class="">Languages &amp; Frameworks</a>, <a href="https://blog.bitexpert.de/techradar/methods-and-patterns.html" target="_blank" rel="noopener noreferrer" class="">Methods &amp; Patterns</a>, <a href="https://blog.bitexpert.de/techradar/tools.html" target="_blank" rel="noopener noreferrer" class="">Tools</a>, and <a href="https://blog.bitexpert.de/techradar/platforms-and-services.html" target="_blank" rel="noopener noreferrer" class="">Platforms &amp; Operations</a>.</p>
<p>In the "Languages &amp; Frameworks" quadrant, the following changes occurred:</p>
<ul>
<li class="">Magento: We've moved Magento, Hyvä Themes, and TechDivision Pacemaker to the "hold" state. This doesn't mean we won't be working on Magento projects anymore, but it's no longer a core focus for us.</li>
<li class=""><a href="https://stack.sylius.com/" target="_blank" rel="noopener noreferrer" class="">Sylius Stack</a> and <a href="https://ux.symfony.com/" target="_blank" rel="noopener noreferrer" class="">Symfony UX</a>: We've moved these technologies to the "trial" state, as we've seen promising results in recent projects and plan to invest more in them.</li>
<li class=""><a href="https://ai.symfony.com/" target="_blank" rel="noopener noreferrer" class="">Symfony AI</a>: We've added Symfony AI to the "assess" state, recognizing the growing importance of AI in our projects and the potential benefits of having a tool from the Symfony ecosystem.</li>
<li class="">Spring Boot: After years of using Spring Boot, we've finally moved it to the "adopt" state, reflecting our confidence in its capabilities</li>
</ul>
<p>In the "Tools" quadrant, the following changes happened:</p>
<ul>
<li class="">Bun and Playwright: We've moved these tools to the "trial" state for further evaluation.</li>
<li class=""><a href="https://documenso.com/" target="_blank" rel="noopener noreferrer" class="">Documenso</a>: We've added Documenso to the "assess" state, recognizing its potential value for us.</li>
<li class="">JetBrains AI: We've decided to drop JetBrains AI, as it didn't meet our expectations.</li>
<li class="">OpenCode: We've added <a href="https://opencode.ai/" target="_blank" rel="noopener noreferrer" class="">OpenCode</a> to the "assess" state as a potential replacement for JetBrains AI.</li>
<li class="">Onyx: We're evaluating <a href="https://www.onyx.app/" target="_blank" rel="noopener noreferrer" class="">Oynx</a> as a promising replacement for our current OpenWebUI stack.</li>
</ul>
<p>These changes reflect our ongoing efforts to stay up-to-date with the latest technologies and trends, and to ensure that our tech stack remains aligned with our goals and priorities. We're excited to see how these changes will impact our projects and look forward to sharing more updates in the future.</p>]]></content:encoded>
            <category>bitExpert</category>
            <category>Blog</category>
            <category>Techradar</category>
        </item>
        <item>
            <title><![CDATA[E-Commerce Berlin Expo 2026]]></title>
            <link>https://blog.bitexpert.de/blog/ecommerce_berlin_expo_2026</link>
            <guid>https://blog.bitexpert.de/blog/ecommerce_berlin_expo_2026</guid>
            <pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Attend the E-Commerce Berlin Expo on February 17-18 to learn how AI-powered searchandising solutions like Gally can boost sales and drive business growth at the SCHUFA booth.]]></description>
            <content:encoded><![CDATA[<p>I am heading to Messe Berlin this February 17–18 for the <a href="https://ecommerceberlin.com/" target="_blank" rel="noopener noreferrer" class="">E-Commerce Berlin Expo</a> to catch the latest insights at their biggest 10th-anniversary edition yet.</p>
<p>In addition to attending the conference, I've been invited by our partner <a href="https://www.schufa.de/" target="_blank" rel="noopener noreferrer" class="">SCHUFA</a> to speak at their booth about the benefits of <a href="https://elasticsuite.io/products/gally/" target="_blank" rel="noopener noreferrer" class="">Gally</a>, our AI-powered searchandising solution. I'll be sharing how Gally can help merchants strategically increase sales and drive business growth.</p>
<p><img decoding="async" loading="lazy" alt="SCHUFA - AI Searchandising with Gally " src="https://blog.bitexpert.de/assets/images/schufa_ai_searchandising-181c308f5006478ecbf8e1a47817e41f.png" width="985" height="516" class="img_ev3q"></p>
<p>You can catch my talks at the SCHUFA booth on:</p>
<ul>
<li class="">February 17th at 14:00</li>
<li class="">February 18th at 11:00</li>
</ul>
<p>I'm looking forward to meeting you there! Don't miss out on the opportunity to learn more about how Gally can boost your sales - see you at the SCHUFA booth!</p>]]></content:encoded>
            <category>e-commerce</category>
            <category>Conference</category>
            <category>Berlin</category>
            <category>Gally</category>
        </item>
        <item>
            <title><![CDATA[How to define index prefixes in Gally?]]></title>
            <link>https://blog.bitexpert.de/blog/define_gally_index_prefixes</link>
            <guid>https://blog.bitexpert.de/blog/define_gally_index_prefixes</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p><a href="https://github.com/Elastic-Suite/gally" target="_blank" rel="noopener noreferrer" class="">Gally</a> is our preferred searchandising solution for our projects.
It is <a href="https://machalliance.org/" target="_blank" rel="noopener noreferrer" class="">MACH</a> ready and perfectly designed for Composable Commerce use-cases. But how flexible is Gally?</p>
<p>A recent project sparked an interesting question: Is it possible to use a single OpenSearch cluster for multiple environments, such as test, staging, and production instances, instead of deploying a separate instance for each setup.</p>
<p>Fortunately, the answer is yes.</p>
<p>To achieve this, you can define an index prefix in the <code>config/packages/gally.yaml</code> configuration file like so:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">gally</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">indices_settings</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">prefix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> test_</span><br></span></code></pre></div></div>
<p>Alternatively, you can utilize the new backoffice functionality in <a href="https://github.com/Elastic-Suite/gally/releases/tag/v2.2.0" target="_blank" rel="noopener noreferrer" class="">Gally 2.2</a> to define index prefixes. To do so, follow these steps:</p>
<ul>
<li class="">Go to the Settings page.</li>
<li class="">Navigate to Configurations &gt; Index.</li>
<li class="">In the Index prefix field, enter your preferred prefix.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Gally Backoffice Configuration page" src="https://blog.bitexpert.de/assets/images/gally_backoffice-458fef2dbdccb1276a56940434cf97fb.png" width="800" height="478" class="img_ev3q"></p>
<p>This approach is particularly beneficial for smaller setups, as it allows you to manage just one OpenSearch instance, streamlining your searchandising infrastructure.</p>]]></content:encoded>
            <category>PHP</category>
            <category>Gally</category>
            <category>Symfony</category>
            <category>Elasticsearch</category>
        </item>
        <item>
            <title><![CDATA[SpeaKonf 2026]]></title>
            <link>https://blog.bitexpert.de/blog/speakonf_2026</link>
            <guid>https://blog.bitexpert.de/blog/speakonf_2026</guid>
            <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[SpeaKonf, a unique unconference for speakers, is taking place on March 20th, 2026, in Darmstadt, Germany, offering a platform for individuals to share experiences, learn about public speaking, and connect with like-minded professionals.]]></description>
            <content:encoded><![CDATA[<p>Are you interested in public speaking but don't know where to start? Are you a professional and share your experiences with others? Let's talk about it. At <a href="https://www.speakonf.de/" target="_blank" rel="noopener noreferrer" class="">SpeaKonf</a> – THE unconference for speakers.</p>
<p>SpeaKonf – an idea I had 10 years ago, but never found the time to develop it further.</p>
<p>Thanks to <a href="https://www.jug-da.de/" target="_blank" rel="noopener noreferrer" class="">JUG Darmstadt</a> and <a href="https://www.linkedin.com/in/falk-sippach/?" target="_blank" rel="noopener noreferrer" class="">Falk Sippach</a>, the event is taking place for the fourth time in Darmstadt, Germany on the 20th of March 2026. And once again <a href="https://www.bitexpert.de/" target="_blank" rel="noopener noreferrer" class="">we</a> are supporting the event.</p>
<p>Sounds interesting? Secure your spot at SpeaKonf by getting your tickets <a href="https://www.speakonf.de/#anmeldung" target="_blank" rel="noopener noreferrer" class="">here</a>. We look forward to seeing you in Darmstadt in March!</p>]]></content:encoded>
            <category>Usergroup</category>
            <category>MRN</category>
        </item>
        <item>
            <title><![CDATA[What are Anonymous Template Component Prefixes in Sylius?]]></title>
            <link>https://blog.bitexpert.de/blog/sylius_anonymous_component_template_prefixes</link>
            <guid>https://blog.bitexpert.de/blog/sylius_anonymous_component_template_prefixes</guid>
            <pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to use anonymous template components in Sylius to streamline template management. Define custom prefixes and directory structures to improve code organization and simplify maintenance.]]></description>
            <content:encoded><![CDATA[<p>Before diving into anonymous template components, let's start with the basics.
A template component, also known as a <a href="https://symfony.com/bundles/ux-twig-component/current/index.html" target="_blank" rel="noopener noreferrer" class="">Twig Component</a>, allows you to bind an object to a template.
This makes it easier to render and reuse UI elements, such as modals or category sidebars, across multiple areas of your application.</p>
<p>In contrast to traditional Twig Components, which require both a class and a template, <a href="https://symfony.com/bundles/ux-twig-component/current/index.html#anonymous-components" target="_blank" rel="noopener noreferrer" class="">anonymous template components</a> are self-contained templates that define the component directly within the template itself.</p>
<p>Consider a file named <code>templates/components/Button/Primary.html.twig</code> with the following content:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">button</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">{{</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">attributes.defaults({class:</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">'primary'})</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">}}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {% block content %}{% endblock %}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">button</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>The file's location and directory structure allow us to reference this component as <code>Button:Primary</code>.
To include this component in a template, you can use the following syntax:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag namespace" style="color:#00009f;opacity:0.7">twig:</span><span class="token tag namespace" style="color:#00009f;opacity:0.7">Button:</span><span class="token tag" style="color:#00009f">Primary</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">I am a button!</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag namespace" style="color:#00009f;opacity:0.7">twig:</span><span class="token tag namespace" style="color:#00009f;opacity:0.7">Button:</span><span class="token tag" style="color:#00009f">Primary</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>In the context of anonymous template components, the component name is tightly coupled with the directory structure.
However, Sylius provides a flexible solution to this constraint. With Sylius, you can:</p>
<ul>
<li class="">define custom prefixes for your components</li>
<li class="">specify a custom directory structure where these components are stored</li>
</ul>
<p>This feature allows for greater control and organization of your components, making it easier to manage and maintain your template components.</p>
<p>To take advantage of Sylius's anonymous template component feature, you need to define a prefix and its corresponding directory structure in your configuration.
For example, you can add the following configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">sylius_ui</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">twig_ux</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">anonymous_component_template_prefixes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">my_shop</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'shop/shared/my_components'</span><br></span></code></pre></div></div>
<p>This configuration tells Sylius to look for templates with the <code>my_shop</code> prefix in the <code>shop/shared/my_components</code> directory.</p>
<p>Once you've defined the prefix and directory structure, you can create a template in the specified directory.
For instance, you can create a <code>my_button.html.twig</code> template in the <code>shop/shared/my_components</code> directory.</p>
<p>To use this template in your Twig template, reference it using the component file name and the defined prefix:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{{ component('my_shop:my_button') }}</span><br></span></code></pre></div></div>
<p>By using anonymous component prefixes, you can keep your templates organized and structured in a way that makes sense for your Sylius application, making it easier to maintain and manage your codebase.</p>]]></content:encoded>
            <category>PHP</category>
            <category>Sylius</category>
            <category>Symfony</category>
            <category>Twig</category>
        </item>
        <item>
            <title><![CDATA[PHP Version Constraints for Renovate Bot]]></title>
            <link>https://blog.bitexpert.de/blog/renovate_bot_php_version_constraints</link>
            <guid>https://blog.bitexpert.de/blog/renovate_bot_php_version_constraints</guid>
            <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lean how to fix Renovate Bot dependency update issues after PHP 8.5 upgrades by configuring language constraints in your renovate.json file.]]></description>
            <content:encoded><![CDATA[<p>Following the release of PHP 8.5, we encountered some problems with <a href="https://github.com/renovatebot/renovate" target="_blank" rel="noopener noreferrer" class="">Renovate Bot</a>'s dependency updates.
It appeared that Renovate Bot was using the latest PHP version for running dependency upgrades, which caused quite a few dependency updates to fail.</p>
<p>While checking the <a href="https://docs.renovatebot.com/language-constraints-and-upgrading/" target="_blank" rel="noopener noreferrer" class="">docs</a>, I realized that Renovate Bot does not apply language constraints to upgrades at all.</p>
<p>Fortunately, Renovate Bot allows you to define language constraints for dependency upgrades, providing a solution to this problem. To resolve the issue, we added the following configuration to the <code>renovate.json</code> file:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"constraints"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"php"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8.4.x"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"composer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2.x"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>By implementing this constraint configuration, we can ensure that Renovate Bot consistently uses PHP 8.4 and Composer 2 for dependency updates.</p>
<p>However, this setup has a trade-off: once PHP 8.4 and Composer 2 become outdated, Renovate will no longer automatically update them. Instead, you will need to manually update these versions to keep them current.</p>]]></content:encoded>
            <category>PHP</category>
            <category>Devops</category>
            <category>Renovate</category>
        </item>
        <item>
            <title><![CDATA[ConFoo 2026]]></title>
            <link>https://blog.bitexpert.de/blog/confoo_2026</link>
            <guid>https://blog.bitexpert.de/blog/confoo_2026</guid>
            <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[I'll be presenting at ConFoo 2026 in Montreal, Canada, on building e-commerce search solutions with Gally and leveraging Twig, Twig Hooks, and Live Components for interactive frontend development.]]></description>
            <content:encoded><![CDATA[<p>Happy to announce that I will be speaking at the <a href="https://confoo.ca/" target="_blank" rel="noopener noreferrer" class="">ConFoo 2026</a> developer conference in Montreal, Canada in February this year.</p>
<p>Two of my talk proposals have been accepted. In the <a href="https://confoo.ca/en/2026/session/enhancing-your-customers-search-experience-with-gally" target="_blank" rel="noopener noreferrer" class="">first talk</a>, I'll be talking about how Gally is enhancing your customers' search experience.</p>
<p><a href="https://confoo.ca/en/2026/session/enhancing-your-customers-search-experience-with-gally" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Enhancing your customers&amp;#39; search experience with Gally" src="https://blog.bitexpert.de/assets/images/enhancing-your-customers-search-experience-with-gally-b367f46b2683a6c7864079486aa786ba.png" width="1925" height="1257" class="img_ev3q"></a></p>
<p>What is <a href="https://github.com/Elastic-Suite/gally" target="_blank" rel="noopener noreferrer" class="">Gally</a>? Gally is a highly advanced searchandising engine built on top of Symfony, API Platform, and Elasticsearch that allows you to build an API-first e-commerce search engine with ease.  I will walk you through the process of setting up and configuring Gally as well as the Gally bundle for Sylius.</p>
<p>The <a href="https://confoo.ca/en/2026/session/the-fellowship-of-twig" target="_blank" rel="noopener noreferrer" class="">second talk</a> is brand new talk with the title "The Fellowship of Twig".</p>
<p><a href="https://confoo.ca/en/2026/session/the-fellowship-of-twig" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="The Fellowship of Twig" src="https://blog.bitexpert.de/assets/images/the-fellowship-of-twig-f0b985d30b06bc3edd1c4750592e54c0.png" width="1925" height="1257" class="img_ev3q"></a></p>
<p>This talk explores the powerful combination of  <a href="https://twig.symfony.com/" target="_blank" rel="noopener noreferrer" class="">Twig</a>, <a href="https://stack.sylius.com/twig-hooks/getting-started" target="_blank" rel="noopener noreferrer" class="">Twig Hooks</a>, and <a href="https://ux.symfony.com/live-component" target="_blank" rel="noopener noreferrer" class="">Live Components</a>, enabling backend developers to create highly interactive and reusable frontend components without relying on a complex JavaScript framework.</p>
<p>See you in February!</p>]]></content:encoded>
            <category>PHP</category>
            <category>Conference</category>
            <category>Frankfurt</category>
            <category>DDEV</category>
            <category>Symfony</category>
        </item>
        <item>
            <title><![CDATA[Hello Docusaurus Search!]]></title>
            <link>https://blog.bitexpert.de/blog/hello_docusaurus_search</link>
            <guid>https://blog.bitexpert.de/blog/hello_docusaurus_search</guid>
            <pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Our blog is getting an upgrade with a new search function to help readers find content easily. The search bar, powered by docusaurus-search-local, improves user experience and accessibility.]]></description>
            <content:encoded><![CDATA[<p>For the past three years, we've maintained a consistent schedule of publishing at least one blog post every week.
As we approach our blog's <a class="" href="https://blog.bitexpert.de/blog/bitexpert-blog-kehrt-zurueck">20th anniversary</a> in October this year, we think it's time for an upgrade.</p>
<p>We're excited to introduce a new feature that makes it easier for you to find what you're looking for: a search function.
You can now search all our blog posts using the search bar located in the top right corner of this page.</p>
<p>Initially, we're using the <a href="https://github.com/easyops-cn/docusaurus-search-local" target="_blank" rel="noopener noreferrer" class="">docusaurus-search-local</a> package to power our search.
As we continue to improve, we may upgrade to a more advanced search engine in the future.</p>
<p>We'd love to hear your thoughts on this new feature. Let us know what you think!</p>]]></content:encoded>
            <category>bitExpert</category>
            <category>Blog</category>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[Refresh Sylius Image Cache]]></title>
            <link>https://blog.bitexpert.de/blog/refresh_sylius_image_cache</link>
            <guid>https://blog.bitexpert.de/blog/refresh_sylius_image_cache</guid>
            <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to refresh the image cache in Sylius after transferring images between instances, ensuring proper frontend display. Use the liip:imagine:cache:resolve command to generate the image cache.]]></description>
            <content:encoded><![CDATA[<p>After transferring images from one Sylius instance to another, I need to refresh the image cache so that <a href="https://www.sylius.com/" target="_blank" rel="noopener noreferrer" class="">Sylius</a> can correctly display the images on the frontend. How can I achieve this?</p>
<p>Following some research and testing, I discovered the necessary commands to complete the task.</p>
<p>To generate the image cache for each file in the <code>public/media/image directory</code>, you can use the Symfony Console command <code>liip:imagine:cache:resolve</code>, which takes a file as an argument and updates its corresponding cache:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> public/media</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">find</span><span class="token plain"> image </span><span class="token parameter variable" style="color:#36acaa">-type</span><span class="token plain"> f </span><span class="token parameter variable" style="color:#36acaa">-print0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">xargs</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-0</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-I</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> php </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">/bin/console liip:imagine:cache:resolve </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>]]></content:encoded>
            <category>PHP</category>
            <category>Symfony</category>
            <category>Sylius</category>
        </item>
    </channel>
</rss>