Artikel
von Patrick Froch

Contao: Mit Events die eigene Erweiterung entkoppeln

In letzter Zeit habe ich viel mit Schnittstellen gearbeitet. Um diese möglichst flexibel zu gestalten, habe ich eine dynamische Abarbeitung der einzelnen Schritte vorgesehen. In Synfony wird dies durch Events gelöst. Da ich die Hooks in mehreren Projekten einsetzen möchte und nicht immer voraussetzten kann, dass auf allen Servern die Symfony-Voraussetungen erfüllt sind, habe ich mich gegen die Verwendung der Events entscheiden.

Contao selber bietet zwar Hooks, aber es fehlt ein richtiges System um eigene Hooks zu implementieren. Den Symfony-Ansatz mit den Event-Objekten fand ich sehr charmant. Ich habe mich entschieden ein eigenes kleines Hook-System mit Objekten zu implementieren.

1. Anlegen der Hook-Objekts

Wir benötigen ein Objekt, welches die Daten und die Rückgabe aufnimmt. Die könnte folgendermyssen aussehen:

Hierbie handelt es sich um ein einfaches Obejkt, mit dem ein Hook für das manuelle Erstellen einer Anfrage für eine Datenbank umgestezt werden könnte. (Ja, ich weiß dass man die über Modele etc. lösen sollte. Mir fällt aber sonst einfach ein sinnvolles Beispiel ein.)

In Zeile 8 wird der Name des Hooks festgelegt. Dieser wird wie bei Contao in der Konfiguration (config/config.php) verwendet um die Klassen für einen bestimmten Hook zu registrieren.

In Zeile 14, 20 und 26 werden Eigenschaften definiert, die der Klasse, die den Hook bearbeitet zur Verfügung gestellt werden. Ab Zeile 32 beginnen die Getter- und Settermethoden.

2. Aufruf des Hooks

Nun müssen wir den Hook in unserem Code an einer Stelle, die wir dynamisieren woll, aufrufen. Dies gestaltet sich dank des Hook-Systems sehr einfach. Man könnte also in diesem Beispiel nach dem Auslesen der Tabelle und der Id (z.B. aus der Url oder der Session), folgenden Aufruf verwenden:

In Zeile 3 erstellen wir eine Instanz unserer Hook-Klasse und weisen in Zeile 4 und 5 die Eigenschaften zu. In Zeile 8 (bzw. 10) rufen wir den Hook auf. In Zeile 11 lassen wir uns den erstellten Query zurückgeben.

3. Registrierung des Listeners

Dieser Schritt ist nur nötig, wenn man selbst eine Klasse für die Bearbeitung des Hooks bereitstellt. Macht man es wie der Contao-Core und stellt "nur" für andere Entwickler die Hooks zur Verfügung, kann er entfallen. Die Registrierung des Hooks könnte so aussehen:

Hier werden zwei Methoden registriert, die eine fügt die Ressource (oder Tabelle) hinzu, die andere die Id. Diese Methoden können (müssen aber nicht) in einer Klasse sein.

4. Klasse für die Bearbeitung des Hooks

Wenn wir schon eine KLasse für die Bearbeitung des Hooks registrieren, müssen wir sie natürlich auch anlegen. Auch dies natürlich nur, wenn man den Hook selber nutzen will und nicht nur für andere Entwickler anbietet. Wir erstellen die Klasse (OnBuildQuery), die wir gerade registriert haben.

Wir haben die Methode addRessources in Zeile 9 erstellt, die die erste Hälfte der Anfrage generiert. In Zeile 18 beginnt die Methode addWhere, die die Id einfügt.

Die soll keine Lehrstück in Sachen Umgang mit der Datenbank sein, es geht nur um die Demonstration der Verwendung des Hooks.

Implementierung des HookHelpers

Hier noch die Implementierung der Klasse \esit\esithook\classes\helper\HookHelper, die für das Ausführen des Hooks verantwortlich ist.

Fazit

Das war schon der ganze Zauber. Im Prinzip gliedert sich die Erstellung eines Hooks in 4 einfache Schritte:

  1. Anlegen der Klasse für die Daten
  2. Erstellen einer Klasse für die Abarbeitung des Hooks (sofern diese mitgeliefert werden soll).
  3. Registrieren der Klasse für die Abarbeitung (sofern diesen mitgeliefert werden soll).
  4. Aufruf des Hooks im eigenen Code.

Schritt 2 und 3 sind nicht zwingend erforderlich. Es ist auch möglich (wie im Contao-Core) Hooks bereitzustellen und diese aufzurufen ohne die KLassen für die Bearbeitung mitzuliefern.

Wenn man jetzt bei Verarbeiten der Anfrage das Datenbankobjekt auch über das Hook-Objekt übergibt, kann man seinen Code sehr gut strukturieren und auch hervorragend testen. Ich denke die Mühe lont sich, nicht zuletzt, weil man auf diese Art sehr leicht auf wechselnde Anforderungen an die Software regieren kann.

Zurück

Einen Kommentar schreiben

Bitte addieren Sie 5 und 5.