Am 24. und 25.10.2015 war ich Teilnehmer beim Magento-Hackathon in Zürich, organisiert von Sylvain Ray© und veranstaltet in den Räumen von Unic - vielen Dank dafür. Dieser Hackathon unterschied sich von allen vorhergehenden grundlegend vor allem dadurch, dass das erste Mal Magento 2 im Fokus stand.
Da Magento 2 vor der Tür steht (es soll noch im November in einer stabilen Version erscheinen), beschäftigten sich mehrere Teams damit. Ich bildete mit Tobias Schifftner von ambimax sowie Vincent Marmiesse von ph2m ein Team mit dem Fernziel, eine verbesserte Lösung zur Pflege von CMS-Inhalten in Magento 2 zu entwickeln. Hauptziel war allerdings die Einarbeitung in Magento 2. Von den Erfahrungen, die wir damit gemacht haben, berichte ich hier. Alle drei Teammitglieder sind erfahrene Magento-1-Entwickler.
Die Installation
Die Installation von Magento 2 auf verschiedenen Systemen war die erste Hürde. Bereits bei drei verschiedenen Rechnern hatten wir Technologien wie Linux, Mac, Windows, Apache, nginx sowie verschiedene PHP- und MySQL-Versionen im Einsatz. Die Installation erfolgte bei uns über das Klonen des offiziellen Git-Repositories von Magento und anschließendes Ausführen von Composer. Während des Hackathons hat Jacques Bodin-Hullin eine alternative Installationsmethode für Magento 2 entwickelt, die auch über Composer läuft, aber mit einer wesentlich kleineren composer.json auskommt.Sobald die Systemvoraussetzungen erfüllt waren (u.a. PHP 5.5+ und MySQL 5.6+), lief die eigentliche Installation über das Web-Interface relativ problemlos ab. Anschließend mussten allerdings teilweise noch kleinere Probleme bei der Frontend-Darstellung gelöst werden. Dabei sind wir das erste Mal dem mächtigen Kommandozeilen-Tool von Magento 2 über den Weg gelaufen, das wie folgt aufgerufen wird:
$ bin/magento
Dies gibt eine Liste der verfügbaren Kommandos aus. Das Problem, dass CSS-Dateien nicht vollständig generiert wurden, konnten wir beispielsweise mit folgendem Befehl beheben:
$ bin/magento setup:static-content:deploy de_DE
Über folgende Probleme sind wir gestolpert:
- Veraltete MySQL-Version
- Fehlgeschlagener Composer-Aufruf (Ursache: fehlende Bibliotheken bei der installierten PHP-Version)
- Notwendige Konfigurationsanpassungen bei nginx
- Fehlgeschlagene Installation der mitgelieferten Beispieldaten
Insgesamt hat die parallele Installation auf den drei Rechnern ca. 2-3 Stunden in Anspruch genommen - den anderen Teams erging es nicht besser. Diese Zeit sollte man bei der ersten Installation von Magento 2 in jedem Fall einplanen.
Installation eines bestehenden Modules
Auch die Installation eines bestehenden Modules (in unserem Fall: MageSetup für Magento 2 von Rouven Rieker) erwies sich als nicht trivial, war aber eine wertvolle Erfahrung von uns. Das Modul wird über Composer integriert (Composer-Kenntnisse werden meiner Ansicht nach für Magento-2-Entwickler unabdingbar sein) und verbleibt im vendor -Verzeichnis. Im Gegensatz zu Magento 1 muss das Modul allerdings noch dem System bekannt gemacht werden. Dies geschieht über folgenden Konsolenbefehl:$ bin/magento setup:upgrade
Anschließend ist das Modul im System aktiv - im Fall von MageSetup erkennbar an zusätzlichen Einträgen in der Konfiguration und einem neuen Kommandozeilen-Kommando.
Entwicklung eines eigenen Moduls
Sind die vorhergehenden Hürden gemeistert, ist die Entwicklung des Moduls tatsächlich eine relativ kleine Hürde gewesen, hier haben uns unsere Magento-1-Kenntnisse sehr weitergeholfen. Folgendes haben wir im Modul umgesetzt:- Erstellung eines Git-Repositories und Einbindung über Composer
- Registrierung des Moduls über die registration.php
- Aktualisierung eines bestehenden Kategorie-Attributes über ein Installskript sowie Erstellung eines neuen Kategorie-Attributes über ein Upgradeskript
- Erstellung eines neuen Source Models, abgeleitet von einem bestehendem
- Lokalisierung der neuen Optionen
- Anpassung der getUrl -Methode des Kategorie-Models zur Ausgabe einer unterschiedlichen URL abhängig von den Kategorieattributen über Interception
- Hinzufügen neuer Attribute zu Collections über die Datei etc/catalog_attributes.xml
Die Umsetzung des Moduls ging innerhalb von nur 1,5 Stunden vonstatten und war dank Team Programming (drei Entwickler an einem Rechner) sehr effektiv. Hier hat uns unsere Magento-1-Erfahrung sehr weitergeholfen, aber auch die Vorlage eines guten bestehenden Moduls und das schnelle Zurechtfinden in den Core-Modulen, die wir mehrfach als Beispiel verwenden konnten. Besonders gut gefallen hat uns die einfache und unkomplizierte Nutzung von Interception, die es ermöglicht, alle öffentlichen Methoden von beliebigen Klassen über implizierte "Before"-, "After"- und "Around"-Methoden anzupassen.
Das Ergebnis findet sich zum Nachschlagen unter https://github.com/magento-hackathon/FlexCms2/tree/develop.
Automatisierte Tests
In Magento 2 gehören automatisierte Tests zum Standard bei der Modulentwicklung. Wir haben uns mit Unit Tests und Integration Tests beschäftigt. Um einen Ansatz zu haben, wie die Tests ausgeführt werden, kann man sich an der Datei .travis.yml im Magento-2-Hauptverzeichnis orientieren, die die notwendigen Kommandozeilenbefehle beinhaltet.Unit Tests
Die Ausführung von Unit Tests ist relativ einfach möglich. Die PhpUnit-Executable wird von Magento mitgeliefert, sodass man nur noch den passenden Befehl ausführen muss, beispielsweise:$ ./vendor/bin/phpunit -c dev/tests/unit/phpunit.xml.dist -v
Üblicherweise sollte man als weiteren Parameter noch den Namen der zu testenden Klassendatei angeben, um die Laufzeit zu reduzieren.
Wenn man in den Unit Tests auf Magento-Funktionen zugreifen möchte, ist es allerdings schnell erforderlich, Mocks für eine Vielzahl von Klassen einzurichten. Die Beispiele in den Magento-Core-Modulen wirkten recht aufwändig, sodass wir uns zum jetzigen Zeitpunkt nicht zugetraut haben, hier entsprechende Tests zu schreiben.
Integration Tests
Wir haben uns daher den Integration Tests zugewendet, die es deutlich einfacher machen, Magento-Funktionalitäten im Ganzen zu testen. Durch ein recht einfaches Beispiel (Datei dev/tests/integration/testsuite/Magento/Cms/Model/PageTest.php) waren wir ermutigt, selbst einen Integration Test zu erstellen. Zunächst wollten wir die bestehenden Integration Tests ausführen, um die notwendige Grundlage zu schaffen. Hierfür muss zunächst eine eigene Test-Datenbank erstellt werden, deren Zugangsdaten in der Datei dev/tests/integration/etc/install-config-mysql.php hinterlegt werden müssen.Leider sind wir bei der anschließenden Ausführung aus folgenden Gründen gescheitert:
- Die Einrichtung nutzt einen MySQL-Befehl, der mit der neuesten MySQL-Version 5.7 nicht kompatibel ist.
- Auf einem anderen Rechner, auf dem MySQL 5.6 lief, brach die Ausführung mit einem PHP Fatal Error ab.
Weitere Testarten wie Funktionale Tests haben wir nicht getestet, da sie für unseren Zweck nicht sinnvoll waren.
Theme-Entwicklung
Unser nächster und letzter Schritt war die Entwicklung eines eigenen Frontend-Themes. Wir haben uns dabei auf das Ersetzen einer Template-Datei durch eigenen Inhalt, die Lokalisierung dieses Inhaltes und das Hinzufügen einer zusätzlichen CSS-Anweisung über LESS beschränkt. Auch hier mussten wir einige Hürden überwinden, sind am Ende aber zum Erfolg gekommen. Das Ergebnis findet sich unter https://github.com/avstudnitz/Mage2TestTheme. Auch hier erfolgt die Integration ausschließlich über Composer.Gewöhnungsbedürftig war das Auslösen der Neugenerierung der CSS-Dateien aus LESS, die nach jeder Änderung angestoßen werden muss. Dies passiert z.B. durch Löschen der folgenden zwei Verzeichnisse:
- pub/static/frontend/<Namespace>/<theme>/<language>/css/
- var/view_preprocessed/
Da dies für die Frontendentwicklung sehr aufwändig und zeitraubend ist, werde ich in Zukunft versuchen, die Generierung über Grunt oder Gulp anzustoßen. Dies wird auch in der offiziellen Dokumentation zum Thema vorgeschlagen.
Gesamteindruck aus Entwicklersicht
Mein Fazit fällt gemischt aus. Der Einstieg in Magento 2 ist sehr anspruchsvoll. Es war für uns v.a. schwierig zu durchschauen, welche Prozesse zur automatischen Code-Generierung wie und wann ablaufen - teilweise werden diese durch Frontend-Aufrufe angestoßen, teilweise durch Kommandozeilenbefehle. Wir hatten nicht das Gefühl, Magento 2 zu beherrschen.Auf der anderen Seite ging die reine Modulentwicklung recht schnell vonstatten. Trotz fehlender Magento-2-Praxiserfahrung kamen wir schnell vorwärts, hauptsächlich dank unserer Magento-1-Erfahrung und guter Vorlage in anderen Modulen, seien es externe oder Core-Module.
Aufgefallen ist, dass auch wenige Wochen vor Veröffentlichung von Magento 2 noch vieles im Umbruch ist. Der Code hat sich in den vergangenen Wochen stark geändert, sodass auch Beispiele aus dem August oder September 2015 teilweise bereits veraltet sind. Es bleibt zu hoffen, dass dies bis zum Release und v.a. nach dem Release deutlich weniger wird und die Core-Entwickler ausreichend Zeit haben, dem Projekt den Feinschliff zu verpassen, der noch an einigen Ecken und Enden fehlt.
Unsere Eindrücke in Stichpunkten: Positiv
- Integration von Composer
- Das Kommandozeilen-Tool von Magento 2
- Die einfache und effektive Nutzung von Interception zur Anpassung bestehender Funktionalitäten
- Umfangreiche und gute offizielle Dokumentation
- Testabdeckung
- Mögliche Nutzung des pub -Ordners als Webroot
- Performance bei Nutzung aller Caching- und Komplierungsmaßnahmen
- Vieles in Magento 2 fühlt sich für Magento-1-Entwickler vertraut an
Negativ
- Aktuelle Stabilität der Beta-Version in manchen Bereichen
- Sehr viele automatisierte Prozesse zur Code-Generierung
- Auch in der Beta-Version noch häufige Code-Änderungen mit großem Einfluss
Herausforderungen für Entwickler
- Beherrschung der automatisierten Prozesse - was passiert wann?
- Beherrschung des enormen Code-Umfangs und der Komplexität
- Optimierung der Entwicklungsprozesse, effektive Nutzung der vorhandenen Tools
- Vielzahl an zu beherrschenden Technologien (Composer, PhpUnit, LESS,...)
- Komplexität von Unit Tests
Noch unklar
- Optimales Projekt-Setup - hier sind noch Änderungen zu erwarten.
- Umfang und Qualität externer Module