OXID eShop Modulentwicklung Teil 3: Best Practices & Beispiele für nachhaltige Erweiterungen
Die Entwicklung von Modulen im OXID eShop bietet eine leistungsstarke Möglichkeit, individuelle Anforderungen innerhalb einer stabilen Shoparchitektur umzusetzen. Nachdem wir uns im ersten Teil unserer Serie den Grundlagen und im zweiten Teil der technischen Umsetzung gewidmet haben, konzentrieren wir uns nun auf Best Practices und praktische Beispiele, um nachhaltige und wartbare Module für OXID zu entwickeln.
Struktur und Lesbarkeit sind entscheidend
Ein essenzieller Aspekt professioneller Module ist eine saubere und nachvollziehbare Projektstruktur. Dies beginnt bei einer klaren Dateistruktur im Modulverzeichnis – getrennt nach Models, Controllern, Services und Templates. Entwickler sollten sich strikt an die Namenskonventionen von OXID halten und phpPSR-konforme Klassen einsetzen.
Dokumentation, sowohl im Code als auch als README im Modulverzeichnis, erhöht die Wartbarkeit und erleichtert zukünftige Erweiterungen. Verwenden Sie verständliche Kommentare und erläutern Sie komplexe Prozesse, wie z. B. spezielle Hooks oder Eventlistener, die angesprochen werden.
Verwendung von Services und Dependency Injection
Ein moderner Ansatz in der OXID Modulentwicklung ist der Einsatz von Dependency Injection (DI). Dies ermöglicht eine bessere Testbarkeit und verhindert enge Kopplungen innerhalb der Geschäftslogik. Logiklastige Prozesse sollten vom Controller getrennt und in eigene Services ausgelagert werden. Der DI-Container von OXID (seit v6.x) unterstützt PHP-DI, wodurch Services automatisch injiziert werden können.
Modulmetadata intelligent verwenden
Die Datei metadata.php
ist das Herzstück eines Moduls. Neben der Standardkonfiguration für Templates, Blöcke, Einstellungen und Erweiterungen kann sie verwenden werden, um Events wie onActivate
oder onDeactivate
korrekt zu definieren. Vermeiden Sie dabei direkte Datenbankoperationen und setzen Sie stattdessen auf Repository-Klassen oder Migrationen.
Beispiel:
'events' => [
'onActivate' => '\Vendor\MyModule\Core\ModuleInstaller::onActivate',
'onDeactivate' => '\Vendor\MyModule\Core\ModuleInstaller::onDeactivate'
]
Diese Trennung erlaubt ein elegantes Handling von Aktivierungen und Deaktivierungen, etwa für das Anlegen von Konfigurationswerten oder der Initialisierung von benötigten Ressourcen.
Refactoring und technisches Schuldenmanagement
Im Alltag vieler Agenturen entstehen zunächst funktionsfähige, aber nicht immer optimal strukturierte Erweiterungen. Um technische Schulden zu vermeiden, sollten sich Entwickler mit Refactoring-Strategien auskennen. Besonders hilfreich ist der Einsatz automatisierter Test-Tools wie PHPUnit in Kombination mit OXID Testing Library.
Verwenden Sie bei der Erweiterung von Core-Klassen modulare Überladungen statt direkter Änderungen im Core. So bleibt Ihr Shop updatefähig. Nutzen Sie dafür die extend
-Direktive in der metadata.php und vermeiden Sie überschneidende Modifikationen mit anderen Modulen durch gezieltes Event-Hooking oder Service Templating.
Datenbankzugriffe kapseln
Ein häufiger Fehler in selbst entwickelten OXID-Modulen ist der direkte Zugriff auf die Datenbank via Raw SQL oder Nutzung von oxDb::getDb()
. Empfehlenswerter ist der Aufbau eigener Repository-Klassen, die auf der \OxidEsales\Eshop\Core\Model\BaseModel
Struktur basieren.
Vorteile:
- Wartbarkeit durch zentrale Datenzugriffslogik
- Bessere Unit-Testbarkeit
- Einfachere Anpassung auf zukünftige Datenbankänderungen
Beispiel für eine Repository-Klasse
namespace Vendor\MyModule\Repository;
use OxidEsales\Eshop\Core\Model\ListModel;
class CustomArticleList extends ListModel
{
protected $_sObjectsInListName = \OxidEsales\Eshop\Application\Model\Article::class;
public function loadCustomArticles()
{
$sSelect = 'SELECT oxid FROM oxarticles WHERE oxstock > 0 AND oxactive = 1';
$this->selectString($sSelect);
return $this;
}
}
Modultests und Qualitätssicherung
Qualitativ hochwertige Module sollten stets getestet sein. Das Ziel sind automatisierte Tests auf Unit- und Integrationsebene. Die OXID Testing Library ermöglicht ein sauberes Setup für PHPUnit-basierte Tests. Zusätzlich empfiehlt sich statisches Code-Analyzing mit Tools wie PHPStan oder Psalm.
Praxisbeispiel: Wunschzettel-Funktion als Modul
Ein häufig nachgefragtes Feature im E-Commerce ist die Wunschzettel-Funktion. Als OXID-Modul kann sie elegant über ein eigenes Template, einen Controller und ein erweitertes User-Model integriert werden. Die Logik für das Speichern und Auslesen der Wunschprodukte wird über ein separates Modell gehandhabt. Die Ausgabe erfolgt über ein Template-Block, das nahtlos in den Warenkorb integriert ist.
Dabei sollte auf Performance geachtet werden: statt komplexer JOINs empfehlen sich entsprechende Relations und ggf. eigene Tabellen mit schlanker Index-Struktur.
Versionierung und Deployment von Modulen
Ein weiterer Aspekt wartbarer Modularchitektur ist die Versionierung. Nutzen Sie für Ihre Projekte immer Git mit semantischer Versionierung – beispielsweise v1.0.0 für initiale Releases. Für den produktiven Einsatz ist ein Deployment über Composer und ein eigenes Repository wie packagist.org
oder private Artefaktserver best practice.
Composer bietet außerdem das Mapping der Modulverzeichnisse via oxid-esales/oxideshop-metapackage-ce
, sodass Module bequem mit dem Shopsystem gekoppelt werden können:
"require": {
"vendor/mymodule": "^1.0"
}
Support für verschiedene OXID-Versionen
Viele Module sollen über mehrere Shopversionen hinweg funktionieren. Deshalb ist es wichtig, Kompatibilitäten regelmäßig zu prüfen, z. B. durch Test-Shops für die jeweiligen Versionen von OXID eShop 6.1 bis 6.5+. Nutzen Sie beim Codieren abstrahierte Helferklassen, Versionserkennungen (z.B. via Registry::getConfig()->getVersion()
) und strukturierte Release-Notes.
Sie planen, ein OXID eShop Modul zu entwickeln oder ein bestehendes Modul zu optimieren? Gerne unterstützen wir Sie bei Themen wie modulare Shoparchitekturen, Composer-basierte Deployment-Strategien, Performance-Tuning oder Testautomatisierung für Ihre OXID-Projekte. Unser Entwicklerteam verfügt über langjährige Erfahrung in der Entwicklung komplexer Erweiterungen innerhalb des OXID-Ökosystems. Kontaktieren Sie uns – wir beraten Sie gerne individuell und auf Expertenniveau.
Matthias Eggert ist seit über 12 Jahren im Online Marketing tätig und seit 4 Jahren Head of Online Marketing bei DIXENO . DIXENO ist an den Standorten Arnsberg, Paderborn, Hamburg und Berlin vertreten und verfügt über mehr als 50 Mitarbeiter.
Neben seiner Tätigkeit als Head of Online Marketing ist Matthias Gründer von onlinemarketingberatung.de – Cruising Media.
Sein Fokus liegt auf allen SEO relevanten Themen und er unterstützt Kunden von der Konzeption der richtigen Strategie, über die technische Umsetzung, bis zur detaillierten Analyse.