Ein Laptop, der Code auf dem Bildschirm zeigt.

Hooks vs. Events - eine Drupal-Historie

Ein Drupal Deep Dive von Michael

Drupal ist in der Programmiersprache PHP geschrieben. Waren die ersten Versionen noch prozedural programmiert, so wurde mit Drupal 8 auf objektorientierte Programmierung (OOP) und Symfony als darunterliegendes Framework umgestellt. Bei jeder Aktion auf einer Drupal-Seite interagieren Drupal-Module untereinander und mit dem Core.

Es gibt fĂŒr Programmierer:innen verschiedene Möglichkeiten, in diese Prozesse einzugreifen. Zwei davon – „klassische“ Hooks und „moderne“ Events – möchte ich hier kurz vorstellen.

Was ist ein Hook?

Ein Hook ist eine Art Schnittstelle, die es Programmier:innen ermöglicht, mit eigenem Code das Verhalten von Drupal zu verÀndern. Beim Anzeigen von Inhalt (Content) gibt es so z.B. die Möglichkeit, diesen mit einem Hook zu manipulieren. So ist es möglich, die Struktur eines Formulars zu verÀndern, bevor es dem User angezeigt wird.

Ein Beispiel, wie ich dem Node Artikel Formular ein zusĂ€tzliches Feld hinzufĂŒgen kann:

/*
 * Implementation of hook_form_alter()
 */
function my_module_form_alter(&$form, &$form_state, $form_id){
  if($form_id == "node_article_edit_form"){
    $form['custom_field'] = array(
      '#type' => 'textfield',
      '#title' => t('My Custom Field'),);
  }
}

Wie finde ich einen Hook?

Manche Contrib Module (d.h. von der Community bereitgestellte Module) beinhalten eine MODULENAME.api.php Datei in der ich nachschauen kann, ob ein Modul Hooks anbietet und wenn ja, welche. Oder ich konsultiere dafĂŒr die API-Dokumentation auf Drupal.org.
Wenn ich einen passenden Hook gefunden habe und ihn verwenden möchte, dann kann ich das tun, indem ich den Hook in der MYMODULENAME.module in einem eigenen Custom Module verwende.

Sollte es keinen passenden Hook fĂŒr das geplante Vorhaben geben, habe ich verschiedene Möglichkeit, einen eigenen Custom Hook zu schreiben: 

Custom Hook

  • Wenn ich der Meinung bin, ein Contrib Module benötigt einen zusĂ€tzlichen Hook, kann ich das Contrib Module patchen und meinen Patch auf Drupal.org fĂŒr die Community bereitstellen. Der Maintainer des Moduls hat dann die Möglichkeit, meinen Patch zu verwerfen oder ihn in einer neuen Version des Moduls zu integrieren.
  • Wenn ich fĂŒr mein eigenes Modul einen Hook ermöglichen will, definiere ich ihn zunĂ€chst in der MYMODULENAME.api.php Datei. Diesen Hook kann ich im Anschluss wie jeden anderen Hook auch in anderen Custom Modulen verwenden.

Dieses Video zeigt, wie man einen Custom Hook erstellt.

Was ist ein Event?

Mit Drupal 8 und dem Wechsel zu Symfony wurde die Verwendung von Events möglich, die ein zentrales Feature von Symfony sind. 

Entweder verwende ich ein bestehendes Drupal Core Event (z.B. ‚kernel.request‘), oder ich definiere ein eigenes Event in einem Custom Module. Dieses Event erhĂ€lt einen eindeutigen, systemweit bekannten Namen. Dann definiere ich einen EventSubscriber (oft auch EventListener genannt), der auf genau diesen Event-Namen „lauscht“. Ein von mir geschriebener EventDispatcher löst dann das Event aus.

Da Events systemweit bekannt sind, kann ich mit unterschiedlichen EventSubscribern in verschiedenen Custom Modulen auf das gleiche Event lauschen und es auslösen.

Hooks und Events – Gemeinsamkeiten

Beide, Hooks und Events, bieten die Möglichkeit, ein bestimmtes Verhalten von Drupal auszulösen. Gemeinsam ist den Hooks und Events, dass je nach Definition zusĂ€tzliche Parameter beim Aufruf ĂŒbergeben werden mĂŒssen.

Warum gibt es mehrere Möglichkeiten?

Chronologisch betrachtet stammen die Hooks aus der Zeit vor Drupal 8, also bevor Symfony als Framework verwendet wurde. Mit der EinfĂŒhrung von Symfony begann die Drupal-Community daran zu arbeiten, das klassische Hook-System durch das von Symfony zu VerfĂŒgung gestellte Event-System zu ersetzen. Das ist mitunter ein sehr langwieriger Prozess. 

Ausblick und Fazit

Da die Symfony-Version auf Drupal 8 aufbaut nur bis November 2021 Sicherheitsupdates erhielt, wurde frĂŒhzeitig an Drupal 9 gearbeitet. Drupal 9, das auf einer neueren Symfony-Version aufbaut, wurde bereits ĂŒber ein Jahr vor dem Ende von Drupal 8 veröffentlicht.

Auch in der kommenden Version 10 von Drupal wird es beide Techniken noch geben. Ziel der Community ist es aber, eines Tages sÀmtliche Hooks durch Events zu ersetzen. Durch die Verwendung des PHP-Frameworks Symfony fÀllt es auch anderen PHP-Entwickler:innen leicht, sich in Drupal zurechtzufinden.

Michael Ebert

Backend Developer / DevOps
Michael Ebert