Zum Hauptinhalt springen
Schneespur
Dokumentation durchblättern

Module entwickeln

Das Modul-Manifest (module.json)

Die module.json definiert Identität, Einstiegspunkt und Abhängigkeiten eines Moduls. Vollständiges Schema, alle Felder, Namenskonventionen und lokalisierte Namen.

Jedes Modul braucht eine module.json in seinem Wurzelverzeichnis. Diese Datei ist der Steckbrief des Moduls: Sie sagt dem ModuleManager, wer das Modul ist, welche Klasse es bootet und wovon es abhängt. Ohne sie wird das Verzeichnis bei der Entdeckung schlicht übergangen.

Vollständiges Schema

{
    "name": "My Module",
    "version": "1.0.0",
    "namespace": "Schneespur\\Module\\MyModule",
    "service_provider": "Schneespur\\Module\\MyModule\\MyModuleServiceProvider",
    "description": "Short description of what this module does.",
    "min_schneespur_version": "1.0.0",
    "requires_permissions": [],
    "default_enabled": false,
    "requires": {},
    "conflicts": []
}

Feld-Referenz

FeldTypPflichtBeschreibung
namestringjaLesbarer Modulname. Erscheint in der Admin-Oberfläche.
versionstringjaSemantische Version (z. B. 1.2.3)
namespacestringjaPHP-Namespace fürs PSR-4-Autoloading. Muss zur Verzeichnisstruktur unter src/ passen.
service_providerstringjaVoll qualifizierter Klassenname des ServiceProviders
descriptionstringempfohlenKurzbeschreibung. Erscheint in der Modul-Verwaltung.
min_schneespur_versionstringempfohlenminimale kompatible Schneespur-/Wintertrace-Version
requires_permissionsstring[]optionalCore-Berechtigungen, die das Modul braucht
default_enabledbooleanoptionalOb das Modul nach der Installation aktiv sein soll. Default: false
requiresobjectoptionalAbhängigkeits-Map: {"other-module": "^1.0.0"}
conflictsstring[]optionalModul-Slugs, die nicht gleichzeitig aktiv sein dürfen

default_enabled steht bewusst auf false: Ein frisch installiertes Modul soll nicht unbemerkt aktiv werden, sondern erst nach bewusster Freigabe in der Modul-Verwaltung laufen.

Beispiel aus dem Referenzmodul

{
    "name": "Example Module",
    "version": "1.0.0",
    "namespace": "Schneespur\\Module\\Example",
    "service_provider": "Schneespur\\Module\\Example\\ExampleServiceProvider",
    "description": "Reference module demonstrating all extension points.",
    "min_schneespur_version": "1.0.0",
    "requires_permissions": [],
    "default_enabled": false,
    "requires": {},
    "conflicts": []
}

Namenskonventionen

  • Modul-Slug: der Verzeichnisname unter modules/. Kleinschreibung mit Bindestrichen: my-module, telegram-notifications
  • Namespace: Schneespur\Module\{PascalCaseName} — z. B. Schneespur\Module\TelegramNotifications
  • ServiceProvider-Klasse: {PascalCaseName}ServiceProvider — z. B. TelegramNotificationsServiceProvider

Diese drei hängen zusammen: Der Slug ist der Verzeichnisname, der Namespace bestimmt den Autoloader-Pfad, und die ServiceProvider-Klasse ist der Einstiegspunkt aus dem Manifest. Wenn eines nicht zur Verzeichnisstruktur passt, findet der Autoloader die Klasse nicht.

Lokalisierte Namen und Beschreibungen

Für mehrsprachige Installationen dürfen name und description Objekte statt Strings sein:

{
    "name": {
        "de": "Telegram-Benachrichtigungen",
        "en": "Telegram Notifications"
    },
    "description": {
        "de": "Sendet Einsatz-Benachrichtigungen über Telegram.",
        "en": "Sends job notifications via Telegram."
    }
}

Die Methode pickLocalized() des Module-Modells löst dann auf die aktuelle App-Locale auf und fällt auf Englisch zurück, wenn die gewünschte Sprache fehlt.

Versions-Constraints in requires

MusterBeispieltrifft auf
*"*"jede Version
>=X.Y.Z">=2.0.0"2.0.0, 2.1.0, 3.0.0, …
^X.Y.Z"^1.2.0"1.2.0, 1.3.0, 1.99.0 (nicht 2.0.0)
~X.Y.Z"~1.2.0"1.2.0, 1.2.1, 1.2.99 (nicht 1.3.0)

Diese Constraints prüft der DependencyValidator vor dem Aktivieren — siehe Modul-Lebenszyklus.