Ein Laptop, der Code auf dem Bildschirm zeigt.
20.09.2022

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.

Schlagworte

drupal hook event module php

Michael Ebert

Backend Developer / DevOps
Michael Ebert