<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Symfony on besserentwickeln.de</title><link>https://besserentwickeln.de/tags/symfony/</link><description>Recent content in Symfony on besserentwickeln.de</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>Philipp Tuchardt</copyright><lastBuildDate>Thu, 13 Mar 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://besserentwickeln.de/tags/symfony/index.xml" rel="self" type="application/rss+xml"/><item><title>Twig Macros</title><link>https://besserentwickeln.de/p/twig-macros/</link><pubDate>Thu, 13 Mar 2025 00:00:00 +0000</pubDate><guid>https://besserentwickeln.de/p/twig-macros/</guid><description>&lt;h1 id="eine-einsteiger-anleitung-zu-twig-macros">Eine Einsteiger-Anleitung zu Twig Macros
&lt;/h1>&lt;h2 id="was-sind-twig-macros">Was sind Twig Macros?
&lt;/h2>&lt;p>Twig Macros sind wiederverwendbare Funktionen innerhalb von Twig-Templates. Sie helfen dabei, Code zu vereinfachen, indem sie Wiederholungen reduzieren und die Wartbarkeit verbessern – ähnlich wie Funktionen in Programmiersprachen.&lt;/p>
&lt;h2 id="ein-macro-definieren">Ein Macro definieren
&lt;/h2>&lt;p>Ein Twig Macro wird mit dem Tag &lt;code>{% macro %}&lt;/code> definiert. Es kann, genau wie eine Funktion, Parameter entgegennehmen.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-twig" data-lang="twig">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{%&lt;/span> &lt;span class="k">macro&lt;/span> &lt;span class="nv">button&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">text&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nv">url&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="nv">class&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x"> &amp;lt;a href=&amp;#34;&lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">url&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">&amp;#34; class=&amp;#34;btn &lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">class&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">&amp;#34;&amp;gt;&lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">text&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">&amp;lt;/a&amp;gt;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{%&lt;/span> &lt;span class="k">endmacro&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dieses Macro erzeugt eine Button-Komponente, die mehrfach mit unterschiedlichen Werten wiederverwendet werden kann.&lt;/p>
&lt;h2 id="macros-im-selben-template-verwenden">Macros im selben Template verwenden
&lt;/h2>&lt;p>Auch innerhalb der Datei, in der das Macro definiert ist, muss es zuerst importiert werden.
&lt;code>{% import _self as macros %}&lt;/code> macht die eigenen Macros unter dem Namespace &lt;code>macros&lt;/code> verfügbar:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-twig" data-lang="twig">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{%&lt;/span> &lt;span class="k">import&lt;/span> &lt;span class="nv">_self&lt;/span> &lt;span class="nv">as&lt;/span> &lt;span class="nv">macros&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">macros.button&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;Click me&amp;#39;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="s1">&amp;#39;btn-primary&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>Der frühere Aufruf über &lt;code>{{ _self.button(...) }}&lt;/code> ist seit Twig 2.11 veraltet und
funktioniert in Twig 3 (und damit in aktuellen Symfony-/Shopware-Versionen) nicht mehr.&lt;/p>&lt;/blockquote>
&lt;h2 id="macros-in-einer-separaten-datei-speichern">Macros in einer separaten Datei speichern
&lt;/h2>&lt;p>Für eine bessere Organisation können Macros in einer separaten Datei (z. B. &lt;code>macros.twig&lt;/code>) gespeichert und bei Bedarf importiert werden.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-twig" data-lang="twig">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">{%&lt;/span> &lt;span class="k">import&lt;/span> &lt;span class="s1">&amp;#39;macros.twig&amp;#39;&lt;/span> &lt;span class="nv">as&lt;/span> &lt;span class="nv">macros&lt;/span> &lt;span class="cp">%}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="x">&lt;/span>&lt;span class="cp">{{&lt;/span> &lt;span class="nv">macros.button&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s1">&amp;#39;Learn More&amp;#39;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="s1">&amp;#39;https://example.com&amp;#39;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="s1">&amp;#39;btn-secondary&amp;#39;&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="cp">}}&lt;/span>&lt;span class="x">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="vorteile-von-twig-macros">Vorteile von Twig Macros
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Code-Wiederverwendung&lt;/strong>: Vermeidet das Duplizieren gleicher Strukturen.&lt;/li>
&lt;li>&lt;strong>Bessere Lesbarkeit&lt;/strong>: Hält Templates sauberer und strukturierter.&lt;/li>
&lt;li>&lt;strong>Einfache Wartung&lt;/strong>: Macros einmal aktualisieren und die Änderungen überall übernehmen.&lt;/li>
&lt;/ul></description></item><item><title>Shopware 6 Subscriber Beispiel</title><link>https://besserentwickeln.de/n/shopware-6-subscriber-beispiel/</link><pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate><guid>https://besserentwickeln.de/n/shopware-6-subscriber-beispiel/</guid><description>&lt;p>Pfad: &lt;code>MyTheme/src/Subscriber/ProductListingSubscriber.php&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-php" data-lang="php">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;lt;?&lt;/span>&lt;span class="nx">php&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">namespace&lt;/span> &lt;span class="nx">MyTheme\Subscriber&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">use&lt;/span> &lt;span class="nx">Shopware\Core\Content\Product\Events\ProductListingCriteriaEvent&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">use&lt;/span> &lt;span class="nx">Symfony\Component\EventDispatcher\EventSubscriberInterface&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">ProductListingSubscriber&lt;/span> &lt;span class="k">implements&lt;/span> &lt;span class="nx">EventSubscriberInterface&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">public&lt;/span> &lt;span class="k">static&lt;/span> &lt;span class="k">function&lt;/span> &lt;span class="nf">getSubscribedEvents&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="k">array&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">ProductListingCriteriaEvent&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="na">class&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="s1">&amp;#39;onProductListingCriteria&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">public&lt;/span> &lt;span class="k">function&lt;/span> &lt;span class="nf">onProductListingCriteria&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">ProductListingCriteriaEvent&lt;/span> &lt;span class="nv">$event&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">void&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$criteria&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nv">$event&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">getCriteria&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$criteria&lt;/span>&lt;span class="o">-&amp;gt;&lt;/span>&lt;span class="na">addAssociation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;properties&amp;#39;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Pfad: &lt;code>src/Resources/config/services.xml&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; ?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;container&lt;/span> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://symfony.com/schema/dic/services&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:xsi=&lt;/span>&lt;span class="s">&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xsi:schemaLocation=&lt;/span>&lt;span class="s">&amp;#34;http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;services&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;service&lt;/span> &lt;span class="na">id=&lt;/span>&lt;span class="s">&amp;#34;MyTheme\Subscriber\ProductListingSubscriber&amp;#34;&lt;/span> &lt;span class="na">public=&lt;/span>&lt;span class="s">&amp;#34;true&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;tag&lt;/span> &lt;span class="na">name=&lt;/span>&lt;span class="s">&amp;#34;kernel.event_subscriber&amp;#34;&lt;/span>&lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/service&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/services&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/container&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Nicht vergessen, den Cache zu leeren :)&lt;/p></description></item></channel></rss>