Zum Inhalt

Erweiterungspunkte

Archive haben Sonderwünsche — eine eigene Signaturlogik, ein besonderes Word-Findbuch, eine Formatnormalisierung. Anton beantwortet das mit einem durchgehenden Muster, statt den Kern pro Kund:in zu forken:

Mandantenspezifisches Verhalten wird eingehängt, indem eine Klasse über eine Einstellung benannt wird — oder als kundenspezifische Subklasse existiert. Der Kern bleibt unverändert.

Wer diesen Satz verinnerlicht, findet die meisten Erweiterungsnähte von selbst. Diese Seite zählt die wichtigsten auf.

Signaturbildung

Die Einstellung identifier_generator enthält entweder einen der eingebauten Modi (standard, recordgroup_as_base, id_identifier, manual_identifiers) oder den voll qualifizierten Klassennamen eines eigenen Generators. Anton instanziiert ihn und ruft getNewIdentifier(...) auf:

$generator = setting('identifier_generator');
// z.B. 'Anton\Models\IdentifierGenerators\KaeNewIdentifier'
return (new $generator($this))->getNewIdentifier($level_of_description_id, …);

Eigene Generatoren liegen unter app/Models/IdentifierGenerators/ (KaeNewIdentifier, StopNewIdentifier als Vorlagen). So kann ein Archiv den Standort in die Signatur ziehen oder ein ganz eigenes Schema fahren, ohne dass der Standardgenerator davon weiss.

Exporter

Die Export-Schicht ist nach dieser Naht gebaut. Wer sie erweitert, hält sich an zwei Regeln (siehe auch CLAUDE.md, Abschnitt Exporter layout):

  • Builder, DTOs und Format-Logik gehören unter app/Services/Exporter/<Format>/, nie in einen HTTP-Controller.
  • Ein Controller unter app/Http/Controllers/Exporter/ ist nur ein Route-Handler.

Zwei konkrete Erweiterungsmuster:

TEI über eine Factory. custom_teiexporter ist eine Einstellung, die pro Entität (actors, places, keywords …) eine Exporter-Klasse benennt. Die TeiExporterFactory löst sie auf und fällt sonst auf die Standard-Exporter zurück. So bekommt ein Archiv ein Sonderformat (etwa das Opera-Format von ZBZ), ohne den Standard anzufassen.

Kundenspezifische Subklassen. Word-Findbücher existieren als AntonWordExport und davon abgeleitete Varianten (CasparwolfWordExport, GosteliWordExport, ArchivdatenWordExport); das DIP hat eine ZH-Variante (ZhCreateDip). Das Muster: vom Standard erben, das Abweichende überschreiben.

Die Export-Matrix mitpflegen

Wer ein Exportformat hinzufügt oder ändert, was ein bestehendes ausgibt, aktualisiert die Export-Matrix im selben Zug — Archive entscheiden danach, was eine Sicherung ist. Die Regel steht auch in CLAUDE.md.

Medien-Konversionen

Die Standard-Konversionen (web, thumb, poster) stehen in config/conversions.php. Für Abweichendes lässt sich ein eigenes Konversionsskript hinterlegen: media:conversions --conversion-script=… liest es aus dem scripts/-Verzeichnis des Mandanten (customers/{slug}/scripts/). Damit kann ein Archiv etwa eine Normalisierung fahren, die der Kern nicht kennt.

Formulare und Wertelisten

Kein Code, sondern Daten — aber die wichtigste «Erweiterung» überhaupt: Felder, Formularsätze und Wertelisten macht ein Archiv über die Oberfläche oder über Seeder. Details unter Das Formularsystem. Seeder überschreiben bestehende Konfigurationen bewusst nicht.

Mandanten-Assets

Jenseits von Code und Datenbank liegt Mandantenspezifisches unter customers/{slug}/ — Logo und Favicons, die genannten Konversionsskripte, Pfade für Import und Reset. Das ist der Ort für alles, was zur Installation, aber nicht zum Code gehört.

Die Grenze

Der Preis dieses Musters: Kundenklassen und benannte Einstellungen sind über den Baum verstreut. Bevor man einen neuen Sonderfall als eigene Klasse baut, lohnt die Frage, ob er nicht als Konfiguration ausgedrückt werden kann — ein Formularsatz, eine Werteliste, eine Einstellung. Konfiguration überlebt Refactorings; eine Kundenklasse muss mitgezogen werden.