Magento 2 – Rest-API oder Reste-API?

Beruflich darf ich mich gerade mit Magento als Shop-System auseinandersetzen. Auf den ersten Blick ein Shopsystem wie es viele auf PHP-Basis gibt. Jedes System hat eine andere Geschichte und damit seine Eigenheiten und besonderen Pluspunkte. Leider finde ich von den Pluspunkten bei Magento für meinen aktuellen Fall etwas zu wenig bis gar keine. Wir haben eine externe Datenquelle, welche verschiedene Verwaltungsabläufe abbildet, an deren Ende eine Reihe von Produkten für den Shop stehen.

Anfänglich war ich vielleicht etwas naiv und dachte: Ein paar Zeilen SQL und dann lässt sich das Datenmodell sicherlich so extrahieren, dass man recht schnell und zuverlässig die Daten vom Quellsystem in den Shop überführen kann. Leider ist das nicht der Fall, denn Magento hat sich als Datenmodellierung für EAV entschieden. Damit ist nicht die erste allgemeine Verunsicherung gemeint (auch wenn die dann nicht mehr weit her ist) sondern eine Modellierungstechnik namens Entity-Attribute-Value. Im ersten Moment klingt das Modell für einen Shop sogar sehr lohnenswert, denn eine Shopsoftware muss ja ggf. mit verschiedensten Waren zurecht kommen. Genau das ist mit EAV möglich: Man bildet die Modellierung von zusätzlichen Eigenschaften über weitere Tabellen ab. So vernünftig das anfänglich klingen mag, um so schwieriger wird die Umsetzung in der Praxis. Da man bestimmte Attribute ja auch in verschiedenen Fällen wieder brauchen kann hat man die noch eine Stufe weiter abstrahiert. Das Ergebnis ist ein sehr umfangreiches Modell, das Anna Völkl schön aufbereitet hat. Übersichtlich ist etwas anderes, auf diesem Datenmodell  manuell direkt auf Tabellenebene zuzugreifen kann man getrost vergessen.

Nun gut, auch die Entwickler von Magento kochen erst mal nur mit Wasser (oder PHP) und es ist open Source – daher müsste es ja möglich sein, die Models entsprechend per Klassen anzusprechen. Leider ist auch das aufwändiger als man sich das wünscht – es gibt zwar reichlich Anleitungen wie man sowas angehen könnte, aber diese beziehen sich in der Regel auf die einmalige Installation eines eigenen Moduls – das ist also eher nichts was man zum ständigen bzw. regelmäßigen Abgleich von Produkten heran ziehen kann.

Immerhin: Es gibt noch eine weitere Möglichkeit, die zum Ziel führt und auch den Gedanken eine “fremdgeführten” Systems mit berücksichtigt: eine REST-API. Nochmal kurz zur Wiederholung was eine solche API in der Regel bietet: Eine URL über die man anhand der Parameter und der Form des Requests (GET,POST,PUT und DELETE) sowie die HTTP-Status-Meldungen mit einem System kommunizieren kann. Eine solche Schnittstelle kann ganz praktisch sein wenn man Backend und Frontend entkoppeln möchte oder beispielsweise auch die Übergabe von Ergebnissen von einem System an ein anderes sauber durchführen möchte.

Die aktuelle Rest-API von Magento findet sich hier – zumindest was man als Schnittstellendoku überhaupt findet. Damit sollte im ersten Moment alles klar sein, das Grauen folgt auf den zweiten Blick. Von sinnvoller Doku kann bei dieser automatisch erzeugten Seite leider nicht die Rede sein. Es werden zwar alle Aufrufe und Parameter benannt, aber das wars dann auch. Keinerlei Angaben dazu welche Angaben zwingend gemacht werden müssen und welche optional sind. Einfache Beispiele für gängige Anwendungsfälle? Fehlanzeige! Es bleibt also nur die Methode Trial&Error um nach und nach heraus zu finden was man tatsächlich benötigt und was man weglassen kann. Zudem muss man sich auf die Suche nach einigen “magischen Nummern” aus Magento machen, unter anderem um das “Default-Attribut-Set” zu finden, genauer dessen Id. Die lautet historisch gewachsen auf “4” – in der Datenbank könnte man sie aber auch beliebig ändern.

Danach wird es aber erst richtig lustig – wenn man die ersten Schritte gemacht hat, kommt man relativ schnell an einen Punkt an dem man sich eindeutige Identifier wünscht. Mir persönlich ist es da eigentlich leidlich ob das “sprechende Namen” oder numerische Werte sind. Magento mischt ärgerlicherweise hier bunt durcheinander, in der Regel gibt es beides und noch dazu inkonsistent bezüglich der Rest-API: Benötigt man in einem Aufruf den sprechenden Namen um ein Element zu identifizieren, benötigt man im nächsten Aufruf dessen id. Man hat also reichlich zu tun und muss diverse Extra-Schleifen über die API drehen bis man alles zusammen hat. So hatte ich mir das nicht vorgestellt.

Im folgenden fasse ich die notwendigen Schritte zusammen, um Produkte mit eigenen Attributen in Magento per REST-API einzufügen. Der grobe Plan lautet:

  1. Authentifizierungstoken holen
  2. Kategorien anlegen
  3. Attribute, Sets und Gruppen anlegen
  4. Produkte anlegen (ggf. konfigurierbar)

Insgesamt spiegelt der Ablauf also ungefähr das wieder was man auch im Magento-Backend händisch machen müsste.
Da sich die Sache insgesamt recht aufwändig gestaltet habe ich das Vorgehen in entsprechende Einzelbeiträge gefasst.