{"id":17292,"date":"2026-10-26T09:00:00","date_gmt":"2026-10-26T08:00:00","guid":{"rendered":"https:\/\/wata.es\/?p=17292"},"modified":"2026-09-10T08:41:00","modified_gmt":"2026-09-10T06:41:00","slug":"das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle","status":"publish","type":"post","link":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/","title":{"rendered":"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Das Strategy-Muster<\/strong> ist eines jener Muster, die dann Sinn machen, wenn das Problem es erfordert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Idee ist einfach: Man hat dieselbe gesch\u00e4ftliche Absicht, aber mehrere M\u00f6glichkeiten, diese umzusetzen. Solange der Umfang \u00fcberschaubar bleibt, ist das in der Regel kein Problem. Das Problem beginnt, wenn diese Variationen zunehmen, sich in einer zentralen Klasse vermischen und jeder neue Fall dazu f\u00fchrt, dass immer mehr Entscheidungen an derselben Stelle angesammelt werden.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">In Symfony-Projekten kommt das h\u00e4ufig vor: eine Operation, die sich je nach Kanal, Anbieter, Format oder einer bestimmten Gesch\u00e4ftsregel \u00e4ndert. Und genau hier kann das Strategy-Muster eine n\u00fctzliche M\u00f6glichkeit sein, Verhaltensweisen zu trennen, ohne das Design unn\u00f6tig zu verkomplizieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Schl\u00fcssel liegt nicht darin, das Muster zu verwenden, nur weil es existiert, sondern darin, zu erkennen, wann es wirklich dabei hilft, Verantwortlichkeiten zu verteilen und den Code in einem \u00fcberschaubaren Zustand zu halten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das eigentliche Problem ist nicht das <code>\u201eif\u201c<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <code>\u201eif\u201c<\/code> ist kein Problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zwei \u201eif\u201c-Anweisungen auch nicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Problem beginnt erst, wenn ein und dieselbe Gesch\u00e4ftslogik auf verschiedene Arten ausgef\u00fchrt werden kann und all diese Varianten letztendlich in einer einzigen Klasse zusammengefasst werden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>je nach Kanal;<\/li>\n\n\n\n<li>je nach Anbieter;<\/li>\n\n\n\n<li>je nach Kundentyp;<\/li>\n\n\n\n<li>je nach Land;<\/li>\n\n\n\n<li>je nach Format;<\/li>\n\n\n\n<li>je nach Vorgang;<\/li>\n\n\n\n<li>je nach Ausf\u00fchrungskontext.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">An dieser Stelle beginnt der Code auf ziemlich vorhersehbare Weise an Qualit\u00e4t zu verlieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die Klasse wird immer gr\u00f6\u00dfer;<\/li>\n\n\n\n<li>der Konstruktor f\u00fcllt sich zunehmend mit Abh\u00e4ngigkeiten;<\/li>\n\n\n\n<li>das Hinzuf\u00fcgen eines neuen Falls erfordert \u00c4nderungen am alten Code;<\/li>\n\n\n\n<li>das Testen einer bestimmten Variante wird zunehmend umst\u00e4ndlich;<\/li>\n\n\n\n<li>und der Hauptdienst wird zu einem Sammelpunkt f\u00fcr Entscheidungen.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist das Szenario, in dem <strong>das Strategy-Muster<\/strong> in der Regel Sinn macht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist das Strategy-Muster?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Idee ist recht einfach: Wenn du mehrere Verhaltensweisen f\u00fcr denselben Zweck hast, packe nicht die gesamte Logik in eine zentrale Klasse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Du definierst eine gemeinsame Schnittstelle, erstellst eine Implementierung pro Variante und delegierst die Ausf\u00fchrung an die jeweils passende.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit anderen Worten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>eine Absicht;<\/li>\n\n\n\n<li>mehrere m\u00f6gliche Implementierungen;<\/li>\n\n\n\n<li>eine Auswahl zur Laufzeit je nach Kontext.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Der Wert des Musters liegt nicht in der theoretischen Definition, sondern darin, was es verhindert: Klassen mit zu vielen Verantwortlichkeiten, endlos wachsende Bedingungen und Logik, die schwer zu erweitern oder zu testen ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nicht jedes variable Verhalten erfordert eine Strategy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An dieser Stelle sollte man einen Moment innehalten, denn genau hier besteht die gr\u00f6\u00dfte Gefahr, das Design zu \u00fcberfrachten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verhaltensvariationen zu erkennen und automatisch auf das Strategy-Muster zur\u00fcckzugreifen, ist meist ein Fehler. In manchen F\u00e4llen ist die beste L\u00f6sung kein Resolver mit mehreren Strategien, sondern <strong>Polymorphismus<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn das Verhalten naturgem\u00e4\u00df zum Objekt selbst geh\u00f6rt, ist es sicherlich sinnvoller, es dort zu belassen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beispielsweise ist eine Berechnung der Versandkosten je nach Spediteur kein guter Grund, eine \u201eStrategy\u201c zu rechtfertigen. Wenn jeder Spediteur seine eigene Logik hat und dies ein nat\u00fcrlicher Bestandteil seiner Zust\u00e4ndigkeit ist, w\u00e4re es wahrscheinlich sinnvoller, dies wie folgt zu modellieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface Carrier\n{\n\u00a0\u00a0\u00a0 public function calculateShippingCost(float $weight): float;\n}\nfinal class SeurCarrier implements Carrier\n{\n\u00a0\u00a0\u00a0 public function calculateShippingCost(float $weight): float\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 5 + ($weight * 0.80);\n\u00a0\u00a0\u00a0 }\n}\nend class DhlCarrier implements Carrier\n{\n\u00a0\u00a0\u00a0 public function calculateShippingCost(float $weight): float\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 7 + ($weight * 0.65);\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und die Verwendung w\u00e4re ganz einfach:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$cost = $carrier-&gt;calculateShippingCost($weight);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ist weder eine zus\u00e4tzliche Ebene zum Durchlaufen von Strategien noch eine <code>`supports()`<\/code>-Methode erforderlich, um zu entscheiden, welche Strategie angewendet wird. Das Verhalten ist bereits dort, wo es sein sollte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist ein wichtiger Unterschied: Es geht nicht darum, zwischen <code>\u201eif\u201c<\/code> und \u201eStrategy\u201c zu w\u00e4hlen, sondern darum, die richtige Abstraktion zu w\u00e4hlen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und manchmal ist die richtige Abstraktion nicht \u201eStrategy\u201c, sondern einfach ein besseres Modell.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wann lohnt sich der Einsatz von \u201eStrategy\u201c?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u201eStrategy\u201c eignet sich am besten, wenn die Auswahl des Verhaltens <strong>nicht von Natur aus zu einer bestimmten Entit\u00e4t geh\u00f6rt<\/strong>, sondern von au\u00dfen bestimmt wird \u2013 durch den Kontext, durch Anwendungsregeln oder durch dynamische Komposition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Beispiel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>wenn sich eine Gesch\u00e4ftsrichtlinie je nach \u00e4u\u00dferen Bedingungen \u00e4ndert;<\/li>\n\n\n\n<li>wenn mehrere Implementierungen eine gemeinsame Absicht verfolgen, aber nicht Teil desselben Dom\u00e4nenmodells sind;<\/li>\n\n\n\n<li>wenn Sie Integrationen mit Drittanbietern entkoppeln;<\/li>\n\n\n\n<li>wenn die Entscheidung in einem Anwendungsdienst getroffen wird;<\/li>\n\n\n\n<li>wenn Sie Varianten hinzuf\u00fcgen m\u00f6chten, ohne eine zentrale Klasse erneut zu \u00f6ffnen.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In solchen Szenarien lohnt es sich in der Regel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum es so gut zu Symfony passt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Symfony erleichtert die saubere Umsetzung dieses Musters erheblich, da der Service-Container bereits f\u00fcr die Arbeit mit mehreren Implementierungen ausgelegt ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Du kannst:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mehrere Klassen zu haben, die dieselbe Schnittstelle implementieren;<\/li>\n\n\n\n<li>sie automatisch registrieren;<\/li>\n\n\n\n<li>sie mit Tags versehen;<\/li>\n\n\n\n<li>sie als iterierbare Objekte einzubinden;<\/li>\n\n\n\n<li>die passende Implementierung zu ermitteln, ohne sich an bestimmte Klassen zu binden.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use Symfony\\Component\\DependencyInjection\\Attribute\\TaggedIterator;\nfinal class DiscountResolver\n{\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 #&#91;TaggedIterator('app.discount_strategy')]\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private iterable $strategies\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und in <code>services.yaml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n\u00a0\u00a0\u00a0 App\\Discount\\Strategy\\:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resource: '..\/src\/Discount\/Strategy\/*'\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 tags: &#91;'app.discount_strategy']<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In Symfony l\u00e4uft das ganz nat\u00fcrlich ab. Man muss keine seltsame Infrastruktur aufbauen oder eigene Mechanismen zur Erkennung von Implementierungen erfinden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese gute Integration in das Framework ist einer der Gr\u00fcnde, warum sich das Muster in diesem \u00d6kosystem besonders gut eignet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Praktische Anwendungsf\u00e4lle des Strategy-Musters in Symfony<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Benachrichtigungen nach Kanal<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist einer der eindeutigsten Anwendungsf\u00e4lle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Man verfolgt dieselbe gesch\u00e4ftliche Absicht: etwas zu benachrichtigen. Doch die Art und Weise, wie dies geschieht, h\u00e4ngt vom jeweiligen Kanal ab:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>E-Mail;<\/li>\n\n\n\n<li>SMS;<\/li>\n\n\n\n<li>Push-Benachrichtigung;<\/li>\n\n\n\n<li>Slack;<\/li>\n\n\n\n<li>Webhook.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hier unterscheidet sich die Implementierung erheblich, die Abh\u00e4ngigkeiten sind in der Regel unterschiedlich und die Entscheidung wird normalerweise au\u00dferhalb des Objekts selbst getroffen. Man modelliert nicht das nat\u00fcrliche Verhalten einer Entit\u00e4t, sondern legt eine Versandrichtlinie fest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier passt \u201eStrategy\u201c gut.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface NotificationStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(string $channel): bool;\n\u00a0\u00a0\u00a0 public function send(Notification $notification): void;\n}\nfinal class EmailNotificationStrategy implements NotificationStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private MailerInterface $mailer\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function supports(string $channel): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $channel === 'email';\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function send(Notification $notification): void\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Versand per E-Mail\n\u00a0\u00a0\u00a0 }\n}\nend class SmsNotificationStrategy implements NotificationStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private SmsClient $smsClient\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function supports(string $channel): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $channel === 'sms';\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function send(Notification $notification): void\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Versand per SMS\n\u00a0\u00a0\u00a0 }\n}\nend class NotificationSender\n{\n\u00a0\u00a0\u00a0 \/**\n\u00a0\u00a0\u00a0\u00a0 * @param iterable&lt;NotificationStrategyInterface> $strategies\n\u00a0\u00a0\u00a0\u00a0 *\/\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private iterable $strategies\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function send(string $channel, Notification $notification): void\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach ($this->strategies as $strategy) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($strategy->supports($channel)) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $strategy->send($notification);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new \\RuntimeException(sprintf('Kanal \u201e%s\u201c wird nicht unterst\u00fctzt', $channel));\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Integrationen mit externen Anbietern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein weiterer sehr typischer Fall.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Funktional gesehen m\u00f6chtest du \u201edas Gleiche\u201c tun, aber der Anbieter \u00e4ndert sich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zahlungsgateways;<\/li>\n\n\n\n<li>externe Spediteure;<\/li>\n\n\n\n<li>CRMs;<\/li>\n\n\n\n<li>Signatursysteme;<\/li>\n\n\n\n<li>Verifizierungsdienste;<\/li>\n\n\n\n<li>Identit\u00e4tsanbieter.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In solchen Szenarien f\u00fchrt der Versuch, die gesamte Logik zu zentralisieren, meist zu einer Klasse voller Verzweigungen, HTTP-Clients, Anpassungen der Nutzdaten und spezifischer Fehlerbehandlung.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Aufteilung nach Strategien ist in der Regel wesentlich sinnvoller.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface PaymentStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(string $provider): bool;\n\u00a0\u00a0\u00a0 public function charge(PaymentRequest $request): PaymentResult;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jeder Anbieter kapselt sein Verhalten, seine Abh\u00e4ngigkeiten und sein Mapping. Der Anwendungsfall oder der Anwendungsdienst ermittelt lediglich, welcher Anbieter ben\u00f6tigt wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exporte in verschiedenen Formaten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sehr h\u00e4ufig in Verwaltungs- und Backoffice-Anwendungen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ziel ist dasselbe: Daten zu exportieren. Aber es ist nicht dasselbe, in folgende Formate zu exportieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSV;<\/li>\n\n\n\n<li>Excel;<\/li>\n\n\n\n<li>JSON;<\/li>\n\n\n\n<li>XML;<\/li>\n\n\n\n<li>PDF.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hier wird die Wahl des Verhaltens in der Regel durch den Anwendungskontext bestimmt und nicht durch eine nat\u00fcrliche Zust\u00e4ndigkeit einer Dom\u00e4nenentit\u00e4t. Und jedes Format kann eigene Bibliotheken, Strukturen und Verarbeitungsschritte erfordern.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Schnittstelle ExportStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(string $format): bool;\n\u00a0\u00a0\u00a0 public function export(array $data): string;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jedes Format in seiner eigenen Klasse, jede Implementierung isoliert und ein wesentlich \u00fcbersichtlicherer Hauptdienst.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kontextbezogene Gesch\u00e4ftsregeln<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist eine der interessantesten Anwendungen, auch wenn sie weniger auff\u00e4llig ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beispiel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rabatte gem\u00e4\u00df Gesch\u00e4ftsregeln gew\u00e4hren;<\/li>\n\n\n\n<li>Festlegung einer Verarbeitungsrichtlinie je nach Herkunft;<\/li>\n\n\n\n<li>je nach \u00dcbergang eine unterschiedliche Validierung durchf\u00fchren;<\/li>\n\n\n\n<li>eine Aktion je nach Art des Vorgangs ausw\u00e4hlen;<\/li>\n\n\n\n<li>je nach Kanal oder Umgebung eine andere Regel anwenden.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In diesen F\u00e4llen ist es wichtig, dass die Verhaltensabweichung <strong>nicht eindeutig einer bestimmten Entit\u00e4t zugeordnet ist<\/strong>, sondern einer Richtlinie, die von der Anwendung umgesetzt werden muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ist \u201eStrategy\u201c in der Regel eine gute M\u00f6glichkeit, die Logik zu kapseln, ohne alles in denselben Dienst zu packen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Beispiel mit Rabatten<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>Schnittstelle DiscountStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(Order $order): bool;\n\u00a0\u00a0\u00a0 public function apply(Order $order): int;\n}\nfinal class PremiumDiscountStrategy implements DiscountStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(Order $order): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $order->customer()->isPremium();\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function apply(Order $order): int\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return (int) round($order->subtotal() * 0.10);\n\u00a0\u00a0\u00a0 }\n}\nend class CampaignDiscountStrategy implements DiscountStrategyInterface\n{\n\u00a0\u00a0\u00a0 public function supports(Order $order): bool\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $order->hasActiveCampaign();\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function apply(Order $order): int\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 500;\n\u00a0\u00a0\u00a0 }\n}\nend class DiscountResolver\n{\n\u00a0\u00a0\u00a0 \/**\n\u00a0\u00a0\u00a0\u00a0 * @param iterable&lt;DiscountStrategyInterface> $strategies\n\u00a0\u00a0\u00a0\u00a0 *\/\n\u00a0\u00a0\u00a0 public function __construct(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 private iterable $strategies\n\u00a0\u00a0\u00a0 ) {\n\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0 public function resolve(Order $order): int\n\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foreach ($this->strategies as $strategy) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($strategy->supports($order)) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $strategy->apply($order);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return 0;\n\u00a0\u00a0\u00a0 }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Wann sollte das Strategy-Muster nicht verwendet werden?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Punkt ist genauso wichtig wie die anderen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht alles erfordert ein Strategy-Muster. Und in manchen Teams besteht eine gewisse Tendenz, Muster einzuf\u00fchren, noch bevor das Problem auftritt, das deren Einsatz rechtfertigen w\u00fcrde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du zwei einfache, stabile F\u00e4lle hast und die Logik minimal ist, l\u00f6sen wahrscheinlich ein <code>\u201ematch\u201c<\/code> oder sogar ein <code>\u201eif\u201c<\/code> das Problem besser.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return match ($type) {\n\u00a0\u00a0\u00a0 'fixed' => 100,\n\u00a0\u00a0\u00a0 'percent' => 200,\n\u00a0\u00a0\u00a0 default => 0,\n};<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Daf\u00fcr braucht es keine Schnittstelle, drei Implementierungen und keinen Resolver. Man sollte etwas, das noch einfach ist, nicht unn\u00f6tig komplizieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Strategy zahlt sich erst dann aus, wenn mehrere der folgenden Bedingungen erf\u00fcllt sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die Logik der einzelnen F\u00e4lle wird immer umfangreicher;<\/li>\n\n\n\n<li>jede Variante ben\u00f6tigt eigene Abh\u00e4ngigkeiten;<\/li>\n\n\n\n<li>die Anzahl der F\u00e4lle kann weiter steigen;<\/li>\n\n\n\n<li>das separate Testen jedes Verhaltens bringt einen Mehrwert;<\/li>\n\n\n\n<li>die Bearbeitung eines Falls erfordert immer das erneute \u00d6ffnen derselben Klasse;<\/li>\n\n\n\n<li>die Auswahl des Verhaltens erfolgt \u00fcber einen Anwendungsdienst oder eine externe Richtlinie.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Anzeichen daf\u00fcr, dass es in einem Symfony-Projekt n\u00fctzlich sein k\u00f6nnte<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt ziemlich eindeutige Anzeichen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Der Hauptdienst f\u00e4ngt an, zu viele Entscheidungen zu treffen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn dein <code>CheckoutService<\/code>, <code>NotificationService<\/code>, <code>ExportService<\/code> oder \u00c4hnliches zu viele \u201etypspezifische\u201c Verzweigungen ansammelt, steht in der Regel eine Abstraktion noch aus.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Der Konstruktor f\u00fcllt sich zunehmend mit Abh\u00e4ngigkeiten, die nicht immer genutzt werden<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn eine einzelne Klasse zu viele Abh\u00e4ngigkeiten ben\u00f6tigt, weil sie zu viele Varianten unterst\u00fctzt, l\u00e4sst sich die Verteilung der Verantwortlichkeiten fast immer verbessern.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Das Hinzuf\u00fcgen eines neuen Falls bedeutet immer, dass man dieselbe heikle Klasse bearbeiten muss<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn jede neue Variante eine \u00c4nderung an einem zentralen Dienst erfordert, der bereits zu viele Entscheidungen miteinander vermischt, erzeugst du einen unn\u00f6tigen Reibungspunkt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Das Testen einer bestimmten Variante wird immer m\u00fchsamer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du zum Testen eines bestimmten Zweigs einen halben Kontext aufbauen musst, weil die Logik in einer gro\u00dfen Klasse eingebettet ist, ist diese Logik wahrscheinlich an der falschen Stelle platziert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Echte Vorteile des Strategy-Musters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Vorteile sind nicht nur theoretischer Natur. In realen Projekten machen sie sich deutlich bemerkbar, wenn das Muster richtig angewendet wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der erste Vorteil ist <strong>die Wartbarkeit<\/strong>. Jedes Verhalten befindet sich in einer eigenen Klasse und belastet den zentralen Dienst nicht mehr.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der zweite Vorteil ist <strong>die Erweiterbarkeit<\/strong>. Das Hinzuf\u00fcgen einer neuen Variante besteht in der Regel darin, eine neue Implementierung zu erstellen, und nicht darin, einen besonders sensiblen Teil erneut zu \u00f6ffnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der dritte Vorteil ist <strong>die Testbarkeit<\/strong>. Das Testen isolierter Verhaltensweisen ist wesentlich komfortabler als das Testen eines Dienstes mit mehreren miteinander verflochtenen Verzweigungen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der vierte Vorteil ist <strong>die \u00dcbersichtlichkeit<\/strong>. Wenn jemand neu in das Projekt einsteigt, ist es in der Regel einfacher, das System anhand der einzelnen Varianten zu verstehen, wenn diese jeweils gekapselt sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und der f\u00fcnfte Vorteil in Symfony ist, dass <strong>es sehr gut zum Container und zum Servicesystem passt<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">H\u00e4ufige Fehler bei der Anwendung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Man sollte das Konzept auch nicht idealisieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zu fr\u00fches \u00dcberdesign<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dies ist der h\u00e4ufigste Fehler. Die Anwendung von \u201eStrategy\u201c auf etwas, das noch zu einfach ist, sorgt nur f\u00fcr Un\u00fcbersichtlichkeit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Die Auswahlkriterien nicht gut kontrollieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn mehrere Strategien auf denselben Fall <code>mit \u201etrue\u201c<\/code> antworten k\u00f6nnen und du keine klare Richtlinie hast, f\u00fchrst du Unklarheiten ein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Fall solltest du entscheiden, ob es nur eine g\u00fcltige Strategie geben soll, ob Priorit\u00e4ten gesetzt werden m\u00fcssen oder ob du tats\u00e4chlich mehrere Strategien umsetzen musst.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fragmentierung, ohne das Design wirklich zu verbessern<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Trennung von Verantwortlichkeiten ist gut und richtig. Wenn man jedoch, um einem einfachen Ablauf zu folgen, zwischen zu vielen kleinen Klassen hin- und herspringen muss, die kaum etwas beitragen, steigen die kognitiven Kosten und das Design verschlechtert sich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Es nutzen, um ein schlechtes Modell zu kaschieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Manchmal ist das Problem nicht das Fehlen eines Musters. Vielmehr ist die Dom\u00e4ne schlecht modelliert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und das Erstellen weiterer Dienste behebt das nicht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testen: Wo es sich meist am meisten lohnt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Einer der Bereiche, in denen dieses Muster am deutlichsten zum Tragen kommt, sind Tests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine bestimmte Strategie l\u00e4sst sich in der Regel leicht isoliert testen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function test_premium_discount_is_applied(): void\n{\n\u00a0\u00a0\u00a0 $order = $this->createPremiumOrderWithSubtotal(10000);\n\u00a0\u00a0\u00a0 $strategy = new PremiumDiscountStrategy();\n\u00a0\u00a0\u00a0 self::assertTrue($strategy->supports($order));\n\u00a0\u00a0\u00a0 self::assertSame(1000, $strategy->apply($order));\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und auch der Resolver l\u00e4sst sich ganz einfach testen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public function test_it_uses_the_first_supported_strategy(): void\n{\n\u00a0\u00a0\u00a0 $strategy = $this->createMock(DiscountStrategyInterface::class);\n\u00a0\u00a0\u00a0 $strategy->method('supports')->willReturn(true);\n\u00a0\u00a0\u00a0 $strategy->method('apply')->willReturn(500);\n\u00a0\u00a0\u00a0 $resolver = new DiscountResolver(&#91;$strategy]);\n\u00a0\u00a0\u00a0 self::assertSame(500, $resolver->resolve($order));\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist in der Regel wesentlich komfortabler, als eine zentrale Klasse mit mehreren Verzweigungen und zu vielen vermischteten Abh\u00e4ngigkeiten zu testen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Strategy-Muster<\/strong> ist dann von Nutzen, wenn es verhindert, dass eine einzige Klasse zu viele Verhaltensvarianten und zu viele gesch\u00e4ftliche Entscheidungen in sich vereint.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Symfony passt es besonders gut, da das Framework die Arbeit mit mehreren Implementierungen, Tags und der Injektion von Strategien erheblich erleichtert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aber gerade deshalb sollte man es mit Bedacht einsetzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nicht jede Verhaltensvariante erfordert eine Strategie. Wenn das Verhalten zum Objekt selbst geh\u00f6rt, ist es sicherlich sinnvoller, zun\u00e4chst auf Polymorphismus zur\u00fcckzugreifen. Wenn das Problem weiterhin einfach ist, reicht vielleicht schon ein <code>\u201ematch\u201c<\/code> aus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Strategy-Muster lohnt sich, wenn die Auswahl des Verhaltens von au\u00dfen bestimmt wird, vom Kontext abh\u00e4ngt, einer Anwendungsrichtlinie entspricht oder wenn das System wachsen soll, ohne dass eine zentrale Klasse zu einem Engpass bei der Wartung wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In solchen F\u00e4llen funktioniert es in der Regel sehr gut. Und bei <strong>WATA Factory<\/strong> ist es ein Muster, das wir genau in solchen Szenarien einsetzen: wenn wir Verhaltensweisen entkoppeln, die Weiterentwicklung des Systems erleichtern und den Code so gestalten m\u00fcssen, dass er wachsen kann, ohne an Klarheit zu verlieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Denn letztendlich liegt der Schl\u00fcssel nicht in der Anwendung von Mustern. Er liegt darin, L\u00f6sungen zu w\u00e4hlen, die auch dann noch Sinn ergeben, wenn sich das Projekt weiterentwickelt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Strategy-Muster ist eines jener Muster, die dann Sinn machen, wenn das Problem es erfordert. Die Idee ist einfach: Man hat dieselbe gesch\u00e4ftliche Absicht, aber mehrere M\u00f6glichkeiten, diese umzusetzen. Solange der Umfang \u00fcberschaubar bleibt, ist das in der Regel kein Problem. Das Problem beginnt, wenn diese Variationen zunehmen, sich in einer zentralen Klasse vermischen und [&hellip;]<\/p>\n","protected":false},"author":45,"featured_media":17275,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[68,181],"tags":[],"class_list":["post-17292","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-neuigkeiten","category-technologie"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle - WATA Factory<\/title>\n<meta name=\"description\" content=\"Wann sich das Strategy Pattern in Symfony eignet, wie es implementiert wird und welche Vorteile es in realen Projekten bietet.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle - WATA Factory\" \/>\n<meta property=\"og:description\" content=\"Wann sich das Strategy Pattern in Symfony eignet, wie es implementiert wird und welche Vorteile es in realen Projekten bietet.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/\" \/>\n<meta property=\"og:site_name\" content=\"WATA Factory\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/watafactory\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-26T08:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Victor Galo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@watafactory\" \/>\n<meta name=\"twitter:site\" content=\"@watafactory\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Victor Galo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"9\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/\"},\"author\":{\"name\":\"Victor Galo\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#\\\/schema\\\/person\\\/2fe4cf3f05ff348d077f2b64ea1d4727\"},\"headline\":\"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle\",\"datePublished\":\"2026-10-26T08:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/\"},\"wordCount\":2094,\"publisher\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"articleSection\":[\"Neuigkeiten\",\"Technologie\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/\",\"url\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/\",\"name\":\"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle - WATA Factory\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"datePublished\":\"2026-10-26T08:00:00+00:00\",\"description\":\"Wann sich das Strategy Pattern in Symfony eignet, wie es implementiert wird und welche Vorteile es in realen Projekten bietet.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#primaryimage\",\"url\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"contentUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Schedule-Strategy-Pattern-in-Symfony.webp\",\"width\":1024,\"height\":576,\"caption\":\"Illustration des Strategy Patterns in Symfony mit verschiedenen Strategien, die mit einer Anwendung verbunden sind.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wata.es\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/wata.es\\\/de\\\/\",\"name\":\"WATA Factory\",\"description\":\"IT Consulting &amp; Outsourcing for your company\",\"publisher\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wata.es\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#organization\",\"name\":\"WATA Factory\",\"url\":\"https:\\\/\\\/wata.es\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/logowata.png\",\"contentUrl\":\"https:\\\/\\\/wata.es\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/logowata.png\",\"width\":688,\"height\":176,\"caption\":\"WATA Factory\"},\"image\":{\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/watafactory\\\/\",\"https:\\\/\\\/x.com\\\/watafactory\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/wata\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wata.es\\\/de\\\/#\\\/schema\\\/person\\\/2fe4cf3f05ff348d077f2b64ea1d4727\",\"name\":\"Victor Galo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g\",\"caption\":\"Victor Galo\"},\"url\":\"https:\\\/\\\/wata.es\\\/de\\\/author\\\/v-galowata-es\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle - WATA Factory","description":"Wann sich das Strategy Pattern in Symfony eignet, wie es implementiert wird und welche Vorteile es in realen Projekten bietet.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/","og_locale":"de_DE","og_type":"article","og_title":"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle - WATA Factory","og_description":"Wann sich das Strategy Pattern in Symfony eignet, wie es implementiert wird und welche Vorteile es in realen Projekten bietet.","og_url":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/","og_site_name":"WATA Factory","article_publisher":"https:\/\/www.facebook.com\/watafactory\/","article_published_time":"2026-10-26T08:00:00+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","type":"image\/webp"}],"author":"Victor Galo","twitter_card":"summary_large_image","twitter_creator":"@watafactory","twitter_site":"@watafactory","twitter_misc":{"Verfasst von":"Victor Galo","Gesch\u00e4tzte Lesezeit":"9\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#article","isPartOf":{"@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/"},"author":{"name":"Victor Galo","@id":"https:\/\/wata.es\/de\/#\/schema\/person\/2fe4cf3f05ff348d077f2b64ea1d4727"},"headline":"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle","datePublished":"2026-10-26T08:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/"},"wordCount":2094,"publisher":{"@id":"https:\/\/wata.es\/de\/#organization"},"image":{"@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#primaryimage"},"thumbnailUrl":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","articleSection":["Neuigkeiten","Technologie"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/","url":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/","name":"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle - WATA Factory","isPartOf":{"@id":"https:\/\/wata.es\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#primaryimage"},"image":{"@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#primaryimage"},"thumbnailUrl":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","datePublished":"2026-10-26T08:00:00+00:00","description":"Wann sich das Strategy Pattern in Symfony eignet, wie es implementiert wird und welche Vorteile es in realen Projekten bietet.","breadcrumb":{"@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#primaryimage","url":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","contentUrl":"https:\/\/wata.es\/wp-content\/uploads\/2026\/10\/Schedule-Strategy-Pattern-in-Symfony.webp","width":1024,"height":576,"caption":"Illustration des Strategy Patterns in Symfony mit verschiedenen Strategien, die mit einer Anwendung verbunden sind."},{"@type":"BreadcrumbList","@id":"https:\/\/wata.es\/de\/das-strategy-muster-in-symfony-wann-man-es-einsetzt-und-konkrete-anwendungsfaelle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wata.es\/de\/"},{"@type":"ListItem","position":2,"name":"Das Strategy-Muster in Symfony: Wann man es einsetzt und konkrete Anwendungsf\u00e4lle"}]},{"@type":"WebSite","@id":"https:\/\/wata.es\/de\/#website","url":"https:\/\/wata.es\/de\/","name":"WATA Factory","description":"IT Consulting &amp; Outsourcing for your company","publisher":{"@id":"https:\/\/wata.es\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wata.es\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/wata.es\/de\/#organization","name":"WATA Factory","url":"https:\/\/wata.es\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/wata.es\/de\/#\/schema\/logo\/image\/","url":"https:\/\/wata.es\/wp-content\/uploads\/2019\/12\/logowata.png","contentUrl":"https:\/\/wata.es\/wp-content\/uploads\/2019\/12\/logowata.png","width":688,"height":176,"caption":"WATA Factory"},"image":{"@id":"https:\/\/wata.es\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/watafactory\/","https:\/\/x.com\/watafactory","https:\/\/www.linkedin.com\/company\/wata\/"]},{"@type":"Person","@id":"https:\/\/wata.es\/de\/#\/schema\/person\/2fe4cf3f05ff348d077f2b64ea1d4727","name":"Victor Galo","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5faa9d6a28e2ec94ae73bbd2358ed9b3f4080791f503a4013e3c98390500e70b?s=96&d=mm&r=g","caption":"Victor Galo"},"url":"https:\/\/wata.es\/de\/author\/v-galowata-es\/"}]}},"_links":{"self":[{"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/posts\/17292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/users\/45"}],"replies":[{"embeddable":true,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/comments?post=17292"}],"version-history":[{"count":5,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/posts\/17292\/revisions"}],"predecessor-version":[{"id":17302,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/posts\/17292\/revisions\/17302"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/media\/17275"}],"wp:attachment":[{"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/media?parent=17292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/categories?post=17292"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wata.es\/de\/wp-json\/wp\/v2\/tags?post=17292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}