Vom Scaffolding bis zum fertigen Plugin
Claude kann bei der Magento-2-Modulentwicklung viel Routinearbeit abnehmen: Ordnerstrukturen anlegen, Plugin- und Observer-Skelette generieren und unbekannte Core-Klassen erklären. Wer dabei die richtigen DI-Konventionen und Service-Contract-Muster als Kontext mitgibt, bekommt deutlich brauchbarere Vorschläge als bei generischen PHP-Anfragen.
Inhaltsverzeichnis
- 1. Wo Claude in der Magento-Modulentwicklung wirklich hilft
- 2. Modul-Scaffolding: Ordnerstruktur und Pflichtdateien
- 3. Plugin-Skelette generieren lassen
- 4. Observer-Skelette und Event-Kontext
- 5. DI-Konventionen als Kontext mitgeben
- 6. Service Contracts verstehen und generieren lassen
- 7. Unbekannte Core-Klassen erklären lassen
- 8. Praxisbeispiel: ein kleines Custom-Modul entsteht
- 9. Prompt-Qualität im direkten Vergleich
- 10. Zusammenfassung
- 11. FAQ
1. Wo Claude in der Magento-Modulentwicklung wirklich hilft
Magento-2-Modulentwicklung besteht zu einem großen Teil aus wiederkehrender Struktur: registration.php, module.xml, di.xml, Interfaces, Repositories und die passenden XML-Konfigurationen für ACL, System-Konfiguration und Menüpunkte. Dieser Anteil an Boilerplate ist genau der Bereich, in dem Claude am zuverlässigsten arbeitet, weil die Muster gut dokumentiert und in der offiziellen Magento-Codebasis tausendfach vorhanden sind. Ein Entwickler spart hier Zeit, ohne fachliche Entscheidungen an das Modell abzugeben.
Schwieriger wird es bei Architekturentscheidungen: ob ein Plugin oder ein Observer die richtige Wahl ist, ob ein neuer Service Contract nötig ist oder ein bestehender erweitert werden sollte, hängt vom konkreten Kontext des Shops ab, den Claude nicht automatisch kennt. Hier liefert das Modell brauchbare Vorschläge nur, wenn der Entwickler den Kontext aktiv mitgibt, etwa welche Core-Klasse betroffen ist und welches Verhalten geändert werden soll. Die folgenden Abschnitte zeigen konkrete Einsatzmuster: vom Scaffolding über Plugin- und Observer-Skelette bis zu einem vollständigen Beispielmodul.
2. Modul-Scaffolding: Ordnerstruktur und Pflichtdateien
Ein neues Magento-Modul braucht immer dieselben Grunddateien, und genau das macht Scaffolding zu einer guten ersten Aufgabe für Claude Code. Statt jede Datei einzeln zu diktieren, beschreibt man Modulname, Zweck und die geplanten Funktionsbereiche, und Claude legt registration.php, etc/module.xml, composer.json und die Grundordnerstruktur nach Magento-Konvention an. Wichtig ist, im Prompt explizit die Zielversion (Magento 2.4.8, PHP 8.4) und den Vendor-Namespace zu nennen, sonst greift das Modell auf veraltete Muster aus älteren Magento-Versionen zurück, die in Trainingsdaten häufiger vorkommen.
Bei Projekten mit CLAUDE.md-Datei im Repository-Root, die Namenskonventionen, Pfadstruktur und Coding-Standards festhält, fällt dieser Schritt noch präziser aus, weil Claude die Datei automatisch liest und respektiert. In der Praxis bewährt sich, das generierte Grundgerüst sofort mit bin/magento module:status und bin/magento setup:upgrade zu prüfen, statt blind auf Vollständigkeit zu vertrauen. Fehlt beispielsweise der Sequence-Eintrag für eine Abhängigkeit, fällt das sofort beim Upgrade auf.
# Ask Claude Code to scaffold a new module, then verify immediately
bin/magento module:status | grep Mironsoft_ProductBadges
# After scaffolding, always run setup:upgrade to catch missing
# sequence entries or malformed module.xml before writing logic
bin/magento setup:upgrade
bin/magento setup:di:compile
# Verify the module is registered and enabled
bin/magento module:status Mironsoft_ProductBadges
3. Plugin-Skelette generieren lassen
Plugins sind das Standardwerkzeug in Magento 2, um Verhalten von Core- oder Fremdmodul-Klassen zu erweitern, ohne den Originalcode zu ändern. Claude generiert brauchbare Plugin-Skelette, wenn man drei Dinge explizit nennt: die vollständig qualifizierte Zielklasse, die zu erweiternde Methode und ob before, after oder around benötigt wird. Ohne diese Präzisierung neigt das Modell dazu, automatisch einen around-Plugin vorzuschlagen, obwohl ein einfacherer after-Plugin ausreichen würde und weniger Risiko für Interferenzen mit anderen Plugins in der Aufrufkette birgt.
Ein häufiger Fehler bei KI-generierten Plugins ist ein falsch typisiertes $subject-Argument oder eine fehlende sortOrder-Deklaration in der di.xml, wenn mehrere Plugins auf dieselbe Methode wirken. Claude kennt die Magento-Konvention, dass afterX und beforeX nach der Methode x() benannt werden, generiert diese Namensmuster aber nur zuverlässig korrekt, wenn im Prompt der exakte Methodenname steht. Ein kurzer Review der generierten di.xml auf Typos im Klassenpfad ist Pflicht, da Magento bei falschem Pfad keinen Fehler beim Compile wirft, sondern das Plugin schlicht nicht greift.
<?php
declare(strict_types=1);
namespace Mironsoft\ProductBadges\Plugin\Catalog\Model;
use Magento\Catalog\Model\Product;
/**
* Adds a computed badge label to product data after core price calculation.
*/
class AddBadgeLabelPlugin
{
/**
* Appends a "new" badge flag based on the product's creation date.
*
* @param Product $subject Original product model instance.
* @param Product $result Result returned by the original getFinalPrice call.
* @return Product Modified product instance with badge data set.
*/
public function afterGetFinalPrice(Product $subject, Product $result): Product
{
$createdAt = strtotime((string) $subject->getCreatedAt());
if ($createdAt !== false && $createdAt > strtotime('-14 days')) {
$subject->setData('badge_label', 'new');
}
return $result;
}
}
4. Observer-Skelette und Event-Kontext
Observer reagieren auf Events, die Magento an definierten Stellen im Code dispatcht, etwa catalog_product_save_after oder sales_order_place_after. Der entscheidende Unterschied zu Plugins ist, dass Observer keinen Rückgabewert beeinflussen können und asynchron gedacht werden sollten, auch wenn sie in Magento standardmäßig synchron ausgeführt werden. Claude generiert korrekte Observer-Klassen zuverlässig, wenn der Event-Name und die im Event-Objekt verfügbaren Daten im Prompt genannt werden, denn diese Informationen stehen nicht im Interface, sondern nur in den jeweiligen dispatch-Aufrufen im Core.
Ein wiederkehrendes Problem: Claude schlägt manchmal vor, schwere Operationen wie externe API-Aufrufe direkt im Observer auszuführen, was bei synchronen Events wie catalog_product_save_after die Admin-Oberfläche spürbar verlangsamt. Der bessere Hinweis im Prompt ist, für solche Fälle explizit nach einer Message-Queue-Anbindung statt eines direkten Observer-Aufrufs zu fragen. Die events.xml-Registrierung inklusive Scope (global, adminhtml, frontend) generiert Claude zuverlässig korrekt, wenn der gewünschte Bereich klar benannt wird.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<!-- Fires after a product entity is persisted -->
<event name="catalog_product_save_after">
<observer name="mironsoft_productbadges_recalculate_badge"
instance="Mironsoft\ProductBadges\Observer\RecalculateBadgeObserver"/>
</event>
</config>
5. DI-Konventionen als Kontext mitgeben
Magentos Dependency-Injection-Container folgt eigenen Konventionen, die sich von generischem Symfony- oder Laravel-DI unterscheiden: virtualTypes, preferences, type-Konfigurationen mit argument-Arrays und die Unterscheidung zwischen globalem und area-spezifischem di.xml. Claude kennt diese Muster grundsätzlich aus den Trainingsdaten, wendet sie aber präziser an, wenn der Prompt explizit erwähnt, dass es sich um Magento-DI und nicht um ein generisches PHP-DI-Framework handelt. Ohne diesen Hinweis rutschen gelegentlich Symfony-Autowiring-Annahmen in die Vorschläge, die in Magento schlicht nicht funktionieren.
Besonders wertvoll ist der Kontext bei virtualType-Definitionen, die in Magento häufig genutzt werden, um eine Klasse mit anderer Konfiguration mehrfach zu instanziieren, etwa für unterschiedliche Logger-Kanäle. Claude generiert hier zuverlässig korrekte virtualType-Blöcke, wenn man das Basisklassenmuster und den gewünschten Konfigurationsunterschied nennt. Bei Constructor Property Promotion in PHP 8.4 gilt: Claude nutzt dieses Feature automatisch, wenn man es im Prompt oder in der CLAUDE.md als Projektstandard hinterlegt, generiert aber ohne diesen Hinweis oft noch klassische Property-Deklarationen mit separatem Constructor-Body.
{
"note": "Example di.xml logic expressed as structured context for a prompt",
"target_class": "Mironsoft\\ProductBadges\\Model\\BadgeCalculator",
"interface": "Mironsoft\\ProductBadges\\Api\\BadgeCalculatorInterface",
"preference_scope": "global",
"virtual_type_needed": true,
"virtual_type_purpose": "separate logger channel for badge calculation errors",
"constructor_property_promotion": true,
"php_version": "8.4"
}
6. Service Contracts verstehen und generieren lassen
Service Contracts sind stabile PHP-Interfaces im Api-Verzeichnis eines Moduls, die die öffentliche API eines Moduls definieren, unabhängig von der konkreten Implementierung. Claude generiert saubere Service-Contract-Strukturen zuverlässig, wenn man das Muster explizit vorgibt: Interface im Api-Ordner, Datenobjekt-Interface im Api/Data-Ordner, Implementierung im Model-Ordner mit preference-Bindung in di.xml. Ohne diese Vorgabe vermischt das Modell gelegentlich Interface und Implementierung in einer Datei oder legt die Implementierung fälschlich direkt in den Api-Ordner.
Ein Detail, das Claude ohne expliziten Hinweis oft übersieht: Repository-Interfaces sollten SearchCriteriaInterface für Listenabfragen akzeptieren und ein SearchResultsInterface zurückgeben, statt eigene Array-basierte Filtermethoden zu erfinden. Wer im Prompt auf bestehende Magento-Repositories wie ProductRepositoryInterface als Referenzmuster verweist, bekommt deutlich konsistentere Ergebnisse. Wichtig bleibt: Getter- und Setter-Methoden in Datenobjekt-Interfaces müssen exakt den Magento-Namenskonventionen folgen, da Reflection-basierte Mechanismen wie der ObjectManager sich darauf verlassen.
<?php
declare(strict_types=1);
namespace Mironsoft\ProductBadges\Api;
use Mironsoft\ProductBadges\Api\Data\BadgeInterface;
/**
* Public service contract for computing and persisting product badges.
*/
interface BadgeCalculatorInterface
{
/**
* Calculates the badge for a given product SKU.
*
* @param string $sku Product SKU to evaluate.
* @return BadgeInterface Computed badge data object.
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function calculateForSku(string $sku): BadgeInterface;
}
7. Unbekannte Core-Klassen erklären lassen
Der Magento-Core umfasst tausende Klassen, und selbst erfahrene Entwickler stoßen regelmäßig auf unbekannte Bereiche, etwa beim ersten Kontakt mit dem Indexer-Framework, dem EAV-System oder der Checkout-LayoutProcessor-Kette. Claude ist hier als erklärendes Werkzeug besonders stark, weil es nicht nur die Methode beschreibt, sondern auch den architektonischen Kontext einordnet, etwa warum eine Klasse ein Interface implementiert oder wo sie im Aufrufgraph typischerweise sitzt. Das ersetzt keine Magento-Dokumentation, ergänzt sie aber sinnvoll für den schnellen Einstieg.
Am zuverlässigsten sind Erklärungen, wenn der tatsächliche Quellcode der Klasse im Kontext mitgegeben wird, statt sich auf den Klassennamen allein zu verlassen. Claude Code kann Dateien direkt lesen und zitiert dann konkrete Zeilen, was Halluzinationen deutlich reduziert im Vergleich zu einer reinen Namensanfrage ohne Code. Bei stark generischen Core-Klassen wie \Magento\Framework\Model\AbstractModel ist Vorsicht geboten: Claude kennt viele öffentliche Methoden korrekt, kann aber bei projektspezifischen Erweiterungen durch Preferences oder Plugins den tatsächlichen Kontrollfluss im konkreten Shop nicht kennen, ohne dass man diese Erweiterungen explizit mitteilt.
8. Praxisbeispiel: ein kleines Custom-Modul entsteht
Ein realistisches Beispiel verdeutlicht den kompletten Ablauf: Ein Modul soll Produkten, die in den letzten 14 Tagen angelegt wurden, automatisch ein "Neu"-Badge zuweisen und dieses über einen Service Contract für das Frontend-Template verfügbar machen. Der Prompt an Claude Code beschreibt Zweck, Vendor-Namespace, Zielversion und die gewünschten Bausteine: Api-Interface, Model-Implementierung, Plugin für die Preisberechnung als Trigger und die passenden Konfigurationsdateien für ACL und System-Konfiguration gemäß CLAUDE.md-Vorgabe.
Nach der Generierung folgt der wichtigste Schritt, der oft übersprungen wird: bin/analyse mit PHPStan auf Level 5 laufen lassen, die generierten Dateien tatsächlich lesen statt nur zu überfliegen, und die ACL-Struktur im Admin-Panel unter System > Permissions manuell prüfen. In diesem Beispiel zeigte ein erster PHPStan-Lauf, dass die generierte SearchCriteria-Verarbeitung im Repository einen falschen Rückgabetyp hatte, was ohne die Analyse erst zur Laufzeit aufgefallen wäre. Dieser Zyklus aus Generieren, Prüfen und gezieltem Nachbessern ist der eigentliche produktive Kern des Workflows, nicht das reine Erzeugen von Code.
9. Prompt-Qualität im direkten Vergleich
Die Qualität der Vorschläge hängt fast ausschließlich davon ab, wie viel Magento-spezifischen Kontext der Prompt mitliefert. Ein generischer PHP-Prompt führt häufig zu Code, der zwar syntaktisch korrekt ist, aber Magento-Konventionen ignoriert, etwa fehlende Service Contracts, falsche DI-Muster oder ObjectManager-Direktaufrufe statt Constructor Injection. Die folgende Tabelle zeigt typische Prompt-Formulierungen im Vergleich.
| Aufgabe | Schwacher Prompt | Präziser Prompt | Effekt |
|---|---|---|---|
| Neues Modul anlegen | "Erstelle ein Magento-Modul" | Vendor, Modulname, Magento-Version, Zweck und CLAUDE.md-Konventionen nennen | Korrekte Namespace- und Ordnerstruktur ohne Nacharbeit |
| Plugin schreiben | "Erweitere die Produktklasse" | Vollqualifizierte Zielklasse, Methode und before/after/around nennen | Richtiger Plugin-Typ statt riskantem around-Default |
| Observer registrieren | "Reagiere auf Produktspeicherung" | Exakten Event-Namen und Scope (global/adminhtml/frontend) angeben | Korrekte events.xml ohne falschen Scope |
| Core-Klasse verstehen | "Was macht AbstractModel?" | Tatsächlichen Quellcode und konkrete Methode mitgeben | Weniger Halluzination, konkrete Zeilenverweise |
| Service Contract | "Erstelle ein Interface für Badges" | Api/Api-Data-Struktur und Referenz auf bestehendes Repository-Interface nennen | Saubere Trennung von Interface und Implementierung |
Mironsoft
Magento- und Hyvä-Modulentwicklung mit erfahrenem Team und moderner Tooling-Unterstützung
Ein Custom-Modul für euren Magento-Shop geplant?
Wir entwickeln Magento-2-Module nach Service-Contract-Konventionen, mit sauberer Dependency Injection und vollständiger PHPStan-Absicherung, und unterstützen Teams beim produktiven Einsatz von Claude Code in der Modulentwicklung.
Modul-Architektur
Service Contracts, DI-Struktur und ACL-Konfiguration nach Magento-Konvention
Code-Review
PHPStan-Level-5-Prüfung und manuelle Kontrolle KI-generierter Module
Team-Enablement
CLAUDE.md-Konventionen und Claude-Code-Workflows für Magento-Teams aufbauen
10. Zusammenfassung
Claude eignet sich in der Magento-2-Modulentwicklung besonders für Aufgaben mit klaren, gut dokumentierten Mustern: Ordnerstruktur, Pflichtdateien, Plugin- und Observer-Skelette sowie die Erklärung unbekannter Core-Klassen anhand des tatsächlichen Quellcodes. Der entscheidende Faktor für die Qualität der Ergebnisse ist der mitgegebene Kontext: Magento-Version, Vendor-Namespace, exakte Zielklassen und -methoden sowie projektspezifische Konventionen aus einer CLAUDE.md-Datei führen zu deutlich präziserem Code als generische PHP-Anfragen.
Architekturentscheidungen wie die Wahl zwischen Plugin und Observer oder das Design eines neuen Service Contracts bleiben Aufgabe des Entwicklers, auch wenn Claude bei der Umsetzung hilft. Der produktive Kern des Workflows liegt im Zyklus aus Generieren, Prüfen mit PHPStan und ShellCheck-ähnlichen Werkzeugen sowie gezieltem Nachbessern, nicht im blinden Übernehmen generierter Dateien. Wer diesen Zyklus konsequent einhält, gewinnt spürbar Zeit bei Routineaufgaben, ohne Kontrolle über die Modularchitektur zu verlieren.
Claude für Magento-Modulentwicklung: Das Wichtigste auf einen Blick
Scaffolding
Ordnerstruktur, registration.php und module.xml zuverlässig generiert, wenn Magento-Version und Vendor-Namespace klar benannt sind.
Plugins & Observer
Vollqualifizierte Zielklasse, Methode und Event-Name im Prompt vermeiden falsche Plugin-Typen und falschen Event-Scope.
DI & Service Contracts
Explizit "Magento-DI" statt generisches PHP-DI nennen. Referenz auf bestehende Core-Interfaces verbessert die Konsistenz.
Review-Pflicht
PHPStan Level 5, manuelle ACL-Prüfung und Lesen des generierten Codes sind fester Teil des Workflows, kein optionaler Schritt.