Wir lieben Dependency Injection in TYPO3 v10

Daniel Goerz

Dependency Injection (DI) führt zu Code, den man besser warten, testen, lesen und erweitern kann. Bisher war DI in TYPO3 nur im Extbase-Kontext verfügbar, nicht jedoch im restlichen Core. Mit TYPO3 v10 hat sich das geändert. Ab jetzt ist die symfony DI-Komponente Teil des Cores. Ein weiterer Grund, Projekte auf die neueste TYPO3-Version zu aktualisieren.

 

Was ist Dependency Injection?

DI ist ein weit verbreitetes Konzept aus der Software-Architektur. Im Kern geht es um das Management und die Struktur der Abhängigkeiten von Objekten untereinander. Muss eine Anwendung beispielsweise einen Newsletter verschicken, so sollte der Anwendungsteil, der für den Newsletter zuständig, ist nicht die konkrete Transportmethode hardcoden, sondern hierfür eine Abhängigkeit definieren, die beim Instanzieren des Objektes aufgelöst wird. Die Abhängigkeiten werden also zur Laufzeit „injected“. So ist es zu einem späteren Zeitpunkt möglich, die Versandart zu wechseln, indem ein anderer Mailservice verwendet wird, ohne dass die Applikation umgeschrieben werden muss. 

Separation of concerns — mache nur einen Job, den aber gut

DI ist Teil eines anderen Patterns: „Separation of Concerns“ (auf deutsch vielleicht „Abgrenzung von Zuständigkeiten“), welches besagt, dass Services und Objekte immer nur eine einzige, klar definierte Aufgabe erledigen sollten. So kann man bei großen Anwendungen komplexe Abläufe in kleine, gut verdauliche Häppchen aufteilen.

Ein weitere Vorteil von DI ist, dass es einfacher wird, Tests für die Anwendung zu schreiben, mittels der Technik des sogenannten „Mockings“ (auf deutsch vielleicht „nachahmen“). Dabei werden Abhängigkeiten des zu testenden Objekts mit ihren Antworten in unterschiedlichen Szenarien simuliert. Um beim Newsletter-Beispiel zu bleiben: Es ist nicht notwendig tatsächlich eine E-Mail zu versenden um das Verhalten der Anwendung im Falle eines gescheiterten E-Mail-Versandes zu testen. Statt dessen injectet man anstelle der E-Mail-Transport-Abhängigkeit einfach einen „Mock“, ein Dummy-Objekt, welches den Fehlerfall simuliert.

Wie bereits erwähnt, macht DI es leichter, Komponenten auszutauschen, ohne dabei ganze Teile der Anwendung neu schreiben zu müssen. DI ermöglicht grundsätzlich saubereres Programmieren.

Symfony-Komponenten flachen TYPO3s Lernkurve ab

Entscheidend bei der Einführung von DI im gesamten TYPO3 Core ist die Tatsache, dass wir bewusst auf die bereits existierende symfony DI-Komponente gesetzt haben und nicht die Eigenimplementierung, die wir aus Extbase kennen, auf den restlichen Core ausgedehnt haben. Dies hat mehrere Vorteile: Es erweitert den Kreis der Entwicklerinnen, die bereits Erfahrung mit der Technologie haben, da Symfony-Komponenten in der PHP-Welt weit verbreitet sind und große Popularität genießen. Dies sollte es Agenturen leichter machen, Entwicklerinnen zu finden und für Neueinsteigerinnen ist die Lernkurve flacher. Außerdem ist die Symfony-Komponente bereits vorbildlich dokumentiert.

Das Rad nicht neu zu erfinden und auf eine bewährte Lösung zu setzen, ermöglicht es der TYPO3-Community außerdem, sich mehr der Entwicklung der CMS-Aspekte von TYPO3 zu widmen und sich nicht auch noch um eine eigene Implementierung eines gelösten Problems  kümmern zu müssen.

DI in b13 Projekten

Die neuen Möglichkeiten der DI-Komponente setzen wir bei b13 bereits in mehreren Projekten ein. In einem Projekt habe ich beispielsweise den CacheManager als Factory in der Services.yaml konfiguriert, damit ich das bereits fertig aufgelöste Cache-Frontend in meinen Controller injecten konnte. Wer sich für die Details interessiert kann diese in einem (englischsprachigen) Blog-Artikel nachlesen. 

Worauf wartet ihr? Zeit auf v10 zu upgraden

Der Core wird die neuen DI-Konzepte nach und nach an immer mehr Stellen einsetzen. Auch Extensions können die neuen Vorteile bereits nutzen und die Extbase DI hinter sich lassen. Denn irgendwann wird die Extbase DI sicherlich komplett verschwinden, da es wenig Sinn macht, langfristig zwei Lösungen für dasselbe Problem bereitzustellen. Es ist also eine gute Idee, neuen Code bereits auf der v10 zu schreiben um zukunftssicher unterwegs zu sein.

Dependency Injection ist ein weiteres Beispiel dafür, dass TYPO3 mehr und mehr auf Standards setzt und eine „state-of-the-art“ Entwicklung ermöglicht. Upgradet also so schnell wie möglich. Ihr macht damit eure Entwicklerinnen, Redakteurinnen und Kundinnen glücklich und müsst später nicht so viel Code umbauen!

Kontaktiere uns für ein Upgrade auf TYPO3 v10

Let's connect