Magento 2 ist seit zwei Wochen verfügbar, und jeder hat nun Gelegenheit, sich mit den Besonderheiten der neuen Software zu beschäftigen. Schon im Vorfeld war einiges über die verwendeten Technologien bekannt. Mit der Unterstützung von PHP 5.5 bzw. bald PHP 7, dem Datenbanksystem mySQL 5.6, der neuesten Webserver-Versionen von Nginx und Apache sowie dem Einsatz von Varnish und Redis Cache bereits in der CE ist Magento 2.0 sicher eines der modernsten Shopsoftwaresysteme. Viele weitere Neuerungen wie die innovative Architektur, das Thema Dependency Injections oder eine testgetriebene Entwicklung hat Tim Hahn in seinem Beitrag bereits angerissen. Heute werde ich ein paar dieser Neuerungen etwas genauer betrachten.

 

Module in Magento 2 Erweiterbarkeit und Wartbarkeit

Eines vorweg: Magento 2 ist sicherlich komplexer als sein Vorgänger. Hat man sich aber erstmal an die veränderte Benamung der Magento Module und die neue Verzeichnisstruktur gewöhnt, eröffnet Magento 2 eine Vielzahl von Vorteilen, die die Entwicklungsarbeit aber auch die Pflege des Systems wesentlich vereinfachen.

 

  • Service Contracts

Magento 2 folgt noch stärker einem mehrschichtigen Softwaremodell als Magento 1.x. An anderer Stelle haben wir abstrakter von der Einführung des Service Layers gesprochen. Etwas konkreter geht es um den Einsatz von Service Contracts. Das sind PHP-Interfaces nach einem bestimmten Muster oder Design Pattern (Best Practice in der Softwareentwicklung). Sie regeln die Art und Weise der Kommunikation zwischen Modulen. Der Austausch soll ausschließlich über diese vordefinierten Schnittstellen (Data und Service Interfaces) erfolgen, somit die Datenintegrität schützen sowie die Business Logic der Module voneinander getrennt halten. Die Service Contracts stellen dazu anderen Modulen und Extensions genau jene Funktionalitäten bzw. Methoden zur Verfügung, die sie für den definierten Fall auch benötigen. Durch die Einführung der Service Contracts steigt die Stabilität in der Kommunikation und der Zusammenarbeit von Modulen untereinander. Außerdem verbessert sich dadurch die Updatefähigkeit des Gesamtsystems. Vorausgesetzt natürlich, man hält sich an das Prinzip.

 

Magento 2 Funktion der Service Contracts

Quelle: Magento

 

  • Konfiguration von Modulen

Im Bereich der Modul-Entwicklung gibt es etwa mit der Erweiterung der XML-Struktur eine deutliche Verbesserung. Anpassungen erfolgen nicht mehr nur über die globalen Konfigurationsdateien, sondern es lassen sich für jedes Modul eigene XML-Dateien erstellen. Damit steigt zwar deren Anzahl, andererseits ist es so möglich, ganz gezielt für jeden Einsatzzweck XML-Strukturen zu erstellen und über eigene XML Schema Definitionen (XSD) auf Korrektheit zu validieren. Die modulspezifischen XML-Dateien sind ein weiterer Baustein in der Modularisierung von Magento und sorgen für eine leichtere Pflege des Shopsystems.

 

  • Portierung zu Magento 2

Magento 1.x Module lassen sich nicht eins zu eins auf Magento 2 migrieren. Dankbarerweise liefert Magento mit einem automatischen Modul-Migrator aber ein brauchbares Tool, das den Entwicklern einen Teil ihrer Arbeit abnimmt. Aber eben nur einen Teil. Nachbesserungen sind dennoch nötig. Wer allerdings bei der Magento 1 Entwicklung auf eine hohe Code-Qualität und einen sauberen Aufbau seiner Module geachtet hat, wird nur mit einem minimalen Mehraufwand rechnen müssen. Manche Befürchtungen der ersten Stunde, die Portierung von Modulen werde zum finanziellen Risiko, haben sich ganz sicher nicht bewahrheitet. Hat man bereits in den bestehenden Magento 1.X Modulen Dependency-Injection als Muster verwendet, wird die Migration nochmals einfacher

 

  • Das Prinzip der Dependency Injection

Auch bei Dependency Injection handelt es sich um ein Design Pattern. Prinzipiell geht es darum, die Abhängigkeiten (dependencies) zwischen Modulen oder Klassen von Modulen nicht als einen Bestandteil der Module selbst zu definieren, sondern an eine zentrale Stelle zu delegieren. Damit werden die Abhängigkeiten zwischen den einzelnen Modulen quasi flexibel steuerbar, bzw. die Module werden unabhängiger. Dieser Mechanismus wurde nun auch in Magento 2 umgesetzt, und die Steuerung erfolgt über eine modulspezifische XML-Datei (di.xml).

Die durchgängige Einführung von Dependency Injections in Magento 2 war ein weiterer wichtiger und notwendiger Schritt für die Optimierung der Magento Code-Basis. Neben der Codequalität verbessern sich zudem die Test- und die Erweiterbarkeit einer Magento-Plattform. Letzteres, da sich Abhängigkeiten einfach austauschen lassen.

 

Die Umsetzung des Mechanismus gefällt ebenfalls, wenn er auch noch kleinere Schwächen aufweist. Zum Beispiel die Vermischung der Definitionen von Plugins und von Abhängigkeiten in der di.xml.

 

  • Plugins in Magento 2

Mit Plugins, oder noch genauer Interceptoren, erhält man in Magento 2 die Möglichkeit, gezielt einzelne öffentliche Methoden einer Klasse zu überschreiben, ohne dass es zu den von Magento 1 bekannten Rewrite-Konflikten kommt. In Magento 1 konnte bisher immer nur ein Modul eine Methode überschreiben. Über Plugins können nun mehrere Module die gleiche Methode erweitern und sich dabei vor, nach oder um die betroffene Methode schalten. Allerdings werden die Plugin-Definitionen ebenfalls in der di.xml vorgenommen. Bei umfangreichen Modulen kann dies dazu führen, dass eine di.xml sehr viele Definitionen umfasst und die Trennung zwischen den Dependency-Injections und den Plugin-Definitionen schwer fällt.