Modul-Abhängigkeiten (module.xml sequence) sauber verwalten
Modul-Abhängigkeiten (module.xml sequence) sauber verwalten
~6 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
Die <sequence> in module.xml ist über die ganze Serie hinweg fünfmal gewachsen - immer aus demselben Grund: ein Fremdschlüssel oder eine EAV-Abhängigkeit brauchte die Garantie, dass eine andere Tabelle bereits existiert, bevor db_schema.xml oder ein Data Patch darauf zugreift. Dieses Kapitel zieht die fünf Einzelentscheidungen aus Kapitel 2, 11, 19/20 und 22 zu einem einzigen, finalen module.xml zusammen - und erklärt ebenso genau, warum vier scheinbar naheliegende Kandidaten bewusst nicht in der Liste stehen.
Die finale sequence
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Mironsoft_Loyalty">
<sequence>
<module name="Magento_Customer"/>
<module name="Magento_Sales"/>
<module name="Magento_Eav"/>
<module name="Magento_Catalog"/>
<module name="Magento_Company"/>
</sequence>
</module>
</config>Warum jeder einzelne Eintrag
Magento_Customer(Kapitel 2): Fremdschlüsselcustomer_idim Punkte-Ledger (Kapitel 3) aufcustomer_entity.entity_id, außerdem das Ziel der Customer-Attributeloyalty_points_balance/loyalty_tier(Kapitel 21).Magento_Sales(Kapitel 2): Fremdschlüsselorder_idim Ledger aufsales_order.entity_id, außerdem Ziel der Sales-Attributeloyalty_points_earned/loyalty_points_redeemed(Kapitel 23/63).Magento_Eav(Kapitel 11): die Prämien-Entity (Kapitel 10-18) hängt vom kompletten EAV-Tabellenwerk (eav_attribute,eav_attribute_set,eav_entity_type) ab, das erstMagento_Eavselbst anlegt.Magento_Catalog(Kapitel 19/20): Produkt- und Kategorie-Attribute sowie - ab Block 9 - der eigene Produkttyp registrieren sich gegencatalog_product/catalog_categoryund gegen Core-Basisklassen wieType\Virtual.Magento_Company(Kapitel 22): das Company-Attributloyalty_tier_overridehängt sich perextension_attributes.xmlanCompanyInterface- ohne dieses Modul im System schlägt bereits die XML-Validierung fehl, nicht erstsetup:upgrade.
Was bewusst fehlt - und warum das kein Versehen ist
Vier weitere Module tauchen im Code auf, ohne je einen eigenen sequence-Eintrag zu bekommen: Magento_Quote (die neue Spalte loyalty_points_to_redeem, Kapitel 63), Magento_Checkout/Magento_Payment (die Zahlungsart, Kapitel 62-65), Magento_Shipping (die Versandart, Kapitel 66-69) sowie Magento_Widget/Magento_PageBuilder (Kapitel 55-61).
- Widget und Page Builder binden sich ausschließlich über eigene, rein deklarative XML-Konfigurationsdateien ein (
widget.xml,etc/pagebuilder/content_type.xml) - diese Mechanismen lesen zur Laufzeit, nicht beim Setup, es entsteht kein Wettlauf um eine noch nicht existierende Tabelle. - Payment, Checkout und Shipping werden klassisch über
etc/config.xml(payment/*/model,carriers/*/model) undetc/di.xmlregistriert - ebenfalls zur Laufzeit aufgelöst, kein Schema-Zugriff beim Setup. - Quote ist der einzige wirklich diskussionswürdige Fall:
loyalty_points_to_redeem(Kapitel 63) wird perdb_schema.xmlan die fremde Tabellequoteangehängt - dieselbe Art von Abhängigkeit wie beim Ledger. Kapitel 63 begründet den Verzicht auf einen eigenen Eintrag ausdrücklich damit, dassMagento_Quoteselbst intern vonMagento_Customer,Magento_SalesundMagento_Eavabhängt - alle drei stehen bereits in unserer eigenensequence. Da Magentos Modul-Sortierer diesequence-Angaben aller installierten Module zu einer globalen Reihenfolge verrechnet, landetMagento_Quotedadurch schon transitiv vorMironsoft_Loyalty.
Achtung: Diese transitive Argumentation ist ein bewusster, dokumentierter Kompromiss dieser Serie - keine allgemeine Regel für die eigene Praxis. Sie funktioniert nur, solange Magentos Core-Module ihre eigenen internen Abhängigkeiten nicht ändern, was außerhalb der eigenen Kontrolle liegt. Für ein echtes Produktivmodul ist die robustere Wahl fast immer ein expliziter, direkter sequence-Eintrag für jede Tabelle, auf die tatsächlich zugegriffen wird - auch wenn sie sich vermeintlich schon transitiv ergibt.
Was die sequence tatsächlich steuert - und was nicht
Eine häufige Fehlvorstellung: sequence steuert nicht, ob ein Plugin, Observer oder eine Preference eines fremden Moduls zur Laufzeit greift - das regeln allein di.xml/events.xml, unabhängig von der Modul-Reihenfolge. sequence wirkt ausschließlich beim Setup: der Reihenfolge, in der setup:upgrade db_schema.xml-Änderungen anwendet und Data Patches ausführt. Ein Plugin auf eine fremde Klasse braucht deshalb - anders als eine Fremdschlüssel-Spalte - grundsätzlich keinen eigenen sequence-Eintrag, nur weil das Zielmodul existieren muss (Composer-require reicht dafür bereits).
Tipp: Faustregel für die eigene Praxis: sequence genau dann ergänzen, wenn ein eigenes db_schema.xml oder ein Data Patch (EavSetup, SalesSetup, eine fremde Tabelle) auf Schema-Elemente eines anderen Moduls zugreift. Für reine Laufzeit-Erweiterungen (Plugin, Observer, Preference, Widget, Zahlungsart) reicht die Composer-Abhängigkeit.
Mit einer korrekten sequence steht auch die letzte offene Frage der Grundarchitektur - Kapitel 99 widmet sich als Nächstes der Reihenfolge, in der ein so großes Modul überhaupt produktiv ausgerollt wird.