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