Events, Erweiterungspunkte und Plugins
Diese Seite richtet sich an Ingenieure, die ändern müssen, was Exponential tut, ohne seinen Code zu ändern. Fast jeder Teil des Kernels ist über eine Einstellung austauschbar, die eine Klasse nennt; der prozessinterne Event-Bus ergänzt Hooks an festen Punkten einer Anfrage. Die vollständige Liste ist Erweiterungspunkte auf einen Blick, und die registrierten Punkte sind in RAD-Erweiterungspunkte beschrieben.
Inhalt
- Die Reihenfolge der Bevorzugung
- Der Event-Bus: ezpEvent
- In Einstellungen benannte Handler
- Eine View oder ein Modul ersetzen
- Das letzte Mittel: ein Kernel-Override
- Regeln für Listener und Plugins
Die Reihenfolge der Bevorzugung
- Eine Einstellung. Viele Verhaltensweisen sind bereits Schalter oder Listen; prüfen Sie zuerst die mitgelieferten
settings/*.ini. - Ein Template-Override für die Darstellung (Die Template-Engine und die Design-Kette).
- Ein registrierter Erweiterungspunkt: ein Datentyp, Workflow-Event, Operator, eine Fetch-Funktion, ein Handler oder ein Event-Listener.
- Eine ersetzte View oder ein ersetztes Modul, über
[RunnableSettings]oder einen Modul-Override einer Erweiterung. - Ein Override einer Kernel-Klasse, nur wenn nichts von oben passt.
Der Event-Bus: ezpEvent
ezpEvent::getInstance() (kernel/private/classes/ezpevent.php) bietet zwei Aufrufe:
| Aufruf | Verwendung |
|---|---|
notify( $name, $params ) | Listenern mitteilen, dass etwas geschehen ist |
filter( $name, $value ) | Listener einen Wert ändern und zurückgeben lassen |
Globale Listener werden in site.ini [Event] Listeners[]=<event>@<callback> konfiguriert. Zu den Events, die der Kernel
auslöst, gehören:
| Event | Wann |
|---|---|
request/preinput, request/input | zu Beginn der Weiterleitungsschleife |
response/preoutput, response/output | Ausgabefilter, bevor die Antwort gesendet wird |
content/cache, content/cache/all, content/class/cache | View-Caches für Inhalte werden geleert |
image/removeAliases | Bildvarianten werden entfernt |
content/edit/access, content/download/access, collaboration/item/access | Zugriffsfilter, die ablehnen können |
runnable/<kind>/before, runnable/<kind>/after | um klassenbasierte Views, Befehle und Cronjob-Teile |
Die Datei kennzeichnet ezpEvent als private API, die sich ändern kann; Erweiterungen verlassen sich trotzdem darauf,
daher werden Änderungen daran als kompatibilitätsrelevant behandelt
(Events und Filter).
In Einstellungen benannte Handler
| Erweiterungspunkt | Einstellung | Anleitung |
|---|---|---|
| Datentypen | content.ini [DataTypeSettings] | Eigene Datentypen |
| Workflow-Event-Typen | workflow.ini [EventSettings] | Einen Workflow-Event-Typ schreiben |
| Template-Operatoren und -Funktionen | site.ini [TemplateSettings] ExtensionAutoloadPath[] | Template-Operatoren |
| Fetch-Funktionen | die function_definition.php des Moduls | Eine Fetch-Funktion schreiben |
| Cronjob-Teile | cronjob.ini | Einen Cronjob-Teil schreiben |
| Benachrichtigungs-Handler | notification.ini | Benachrichtigungen und E-Mail |
| Handler für Inhaltseinschränkungen | siehe die Funktionsseite | Handler für Inhaltseinschränkungen |
| Cluster-Datei-Handler | file.ini [ClusteringSettings] FileHandler | Skalierung und Clustering |
| Jeder Handler, den eine Einstellung nennt | das Muster | Handler, die Einstellungen benennen |
Eine View oder ein Modul ersetzen
- Eine klassenbasierte View lässt sich über
site.ini [RunnableSettings] Implementation[]ersetzen. - Ein ganzes Kernel-Modul kann durch das gleichnamige Modul einer Erweiterung ersetzt werden (Override von Modulen durch Erweiterungen).
Das letzte Mittel: ein Kernel-Override
Ein Override einer Kernel-Klasse ersetzt eine Kernel-Klasse durch eine Kopie in einer Erweiterung. Jede Aktualisierung des Kernels kann Ihre Kopie dann still brechen; sie braucht also einen Test und eine Notiz in Ihrer Checkliste für Aktualisierungen (Kernel-Overrides, das letzte Mittel).
Regeln für Listener und Plugins
- Registrierungen müssen idempotent sein. Unter Velocity häuft sich ein Listener an, der in einem langlebigen Worker einmal je Anfrage angehängt wird (Nebenläufigkeit, Statics und langlebige Prozesse).
- Listener-Namen sollten Zeichenketten
Class::methodsein, damit sie konfigurierbar sind. - Eine neue Klasse, die eine mitgelieferte Einstellung nennt, sollte dort, wo der Kernel sie lädt, mit
class_exists()abgesichert werden. - Zugriffsentscheidungen laufen über die Zugriffsfilter, nie über eine Prüfung einer Benutzer-ID.
Verwandte Seiten
- Kernel, lib und Erweiterungen: die Schichtung
- Erweitern ohne zu forken
- Katalog der Entwurfsmuster
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.