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_enabledbooleanoptionalWird vom Core nicht gelesen. Siehe den Hinweis unten
requiresobjectoptionalAbhängigkeits-Map: {"other-module": "^1.0.0"}
conflictsstring[]optionalModul-Slugs, die nicht gleichzeitig aktiv sein dürfen

default_enabled hat keine Wirkung. Kein Code-Pfad liest das Feld aus. Beide Wege, auf denen eine Zeile in der Tabelle modules entsteht — die Installation über den Admin-Bereich und der Installationszweig von ModulesSync —, schreiben enabled = true, unabhängig vom Manifest. Und seit 1.2.0 entscheidet allein diese Zeile darüber, ob ein Modul bootet; die Einzelheiten stehen unter Lebenszyklus.

Das Feld auf false zu setzen und zu erwarten, dass das Modul schlafend installiert wird, tut also nicht, was man sich davon verspricht. Es bleibt im Schema, weil vorhandene Manifeste es mitführen — behandeln Sie es als Absichtserklärung, nicht als Verhalten.

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.