Teil 2: Ereignisgesteuerte Programmierung in PHP
Kommentare

Erweiterung des Patterns
Die Ereignisgesteuerte Programmierung ist eine Erweiterung des Subject/Observer-Patterns. Dabei werden die einzelnen Objekte nicht in agierende und
reagierende Rollen aufgeteilt.

Erweiterung des Patterns
Die Ereignisgesteuerte Programmierung ist eine Erweiterung des Subject/Observer-Patterns. Dabei werden die einzelnen Objekte nicht in agierende und reagierende Rollen aufgeteilt. Stattdessen kann jedes beliebige Objekt ein Ereignis (auch Event oder Notification genannt) auslösen, welches von jedem anderen Objekt verarbeitet werden kann. Ein weiterer Unterschied zum einfachen Subject/Observer-Pattern ist, dass zwischen den Objekten, die das Ereignis auslösen und denen, die dieses Ereignis verarbeiten, ein Vermittler platziert wird. Abbildung 1.2 zeigt die vereinfachte Struktur der Applikation mit dem Vermittler. Dieser Vermittler, oder auch Dispatcher genannt, nimmt die Informationen vom Absender des Ereignisses entgegen und leitet es an alle Objekt weiter, die vorher Interesse an diesem Ereignis kundgetan haben. Dazu werden alle zum Ereignis vorhandenen Informationen in ein neues Objekt verpackt, das dann an die entsprechenden Objekte weitergereicht wird. Zu einem solchen Ereignis gehören die folgenden Informationen:
  • Name des Ereignisses
  • Objekt, das das Ereignis ausgelöst hat
  • Zusätzliche Informationen, die das Ereignis genauer beschreiben
Die Objekte, die das Ereignis verarbeiten (auch Event-Listener) genannt, können dabei auf sämtliche Daten des Ereignis-Objektes zugreifen und diese sogar verändern. Danach wird das Ereignis-Objekt an den nächsten Event-Listener weitergereicht. Wenn Sie sich neben PHP auch schon mit JavaScript-Programmierung befasst haben, so ist Ihnen dieses Konzept sicher schon vertraut. Klickt ein Benutzer Ihrer Website zum Beispiel auf einen Link, so wird dort das onClick-Ereignis ausgelöst, welches Sie mit einer oder mehreren JavaScript-Funktionen verarbeiten können. Ereignisbasierte Programmierung übernimmt dieses Konzept in die serverseitige PHP-Programmierung. Im weiteren Verlauf werden Sie sehen, wie Sie einen Teil der Anforderungen mit Hilfe der ereignisbasierten Programierung umsetzen können und wie Sie dabei neue Anforderungen über einen Plugin-Mechanismus hinzufügen können, ohne bestehenden Quellcode verändern zu müssen.
Abb. 2: Architektur mit Hilfe eines Dispatchers PEAR::Event_Dispatcher

Abb. 2: Architektur mit Hilfe eines Dispatchers PEAR::Event_Dispatcher

 
Das PHP Extension and Application Repository (PEAR) bietet Ihnen bereits ein Paket, das Ihnen alle Klassen zur Verfügung stellt, um Ihre Applikationen ereignisbasiert zu implementieren. Alles, was Sie tun müssen, ist, die benötigten Klassen in Ihren Anwendungen einzubinden und zu benutzen.

Installation

Sollten Sie PEAR schon einmal verwendet haben, so kennen Sie die Prozedur, die nötig ist, um ein PEAR-Paket zu installieren. Sie verwenden dazu einfach den Kommandozeilen-Installer, der von PEAR mitgeliefert wird:
$ pear install Event_Dispatcher
downloading Event_Dispatcher-1.0.0.tgz ...
Starting to download Event_Dispatcher-1.0.0.tgz
.....done: 8,833 bytes
install ok: channel://pear.php.net/Event_Dispatcher-1.0.0
Sollte der PEAR-Installer noch nicht auf Ihrem System installiert sein, so installieren Sie zunächst die PEAR-Basis-Pakete, eine Anleitung dazu finden Sie auf der PEAR Website. Weitere Hinweise zur Installation von PEAR finden Sie in den Literaturhinweisen. Sie können das Paket auch einfach manuell von der Website herunterladen, entpacken und die enthaltenen Klassen in den Include-Pfad Ihrer PHP- Installation kopieren. Die aktuelle Version finden Sie als gepacktes Tar-Archiv auf der PEAR-Website.

Verwendung des Paketes

Nach Installation des Paketes stehen Ihnen zwei Klassen zur Verfügung, Event_Dispatcher und Event_Notification. Aktiv müssen Sie dabei in Ihre Skripte nur die Klasse Event_Dispatcher einbinden, diese wird automatisch die Klasse Event_Notification nachladen.

Die Klasse Event_Notification

Obwohl Sie die Klasse Event_Notification nie selbst einbinden oder instanziieren werden, müssen Sie die Methoden der Klasse kennen, um mit dem Paket Event_Dispatcher arbeiten zu können. Diese Klasse dient lediglich als Container für alle Informationen, die zu einem Ereignis gespeichert wurden. Diese Informationen sind im Einzelnen:
  • Name des Ereignisses, das ausgelöst wurde
  • Komponente (Objekt), die das Ereignis ausgelöst hat
  • Zusätzliche Informationen, die beim Auslösen des Ereignisses übergeben wurden
  • Status des Ereignisses
Die Klasse Event_Notification bietet Ihnen Getter-Methoden an, um lesend auf diese Informationen zugreifen zu können. Tabelle 1 gibt Ihnen einen Überblick über die einzelnen Methoden.
Tabelle 1: Getter-Methoden der Klasse Event_Notification
Methode Rückgabe Funktion
getNotificationName string Gibt den Namen des Ereignisses zurück
getNotificationObject object Gibt das Objekt zurück, das das Ereignis ausgelöst hat
getNotificationInfo mixed Gibt die zusätzlich gespeicherten Informationen zurück
getNotificationCount integer Gibt zurück, wie viele Listener dieses Ereignis bereits verarbeitet haben
isNotificationCancelled boolean Überprüft, ob das Ereignis durch irgendeinen Listener abgebrochen wurde
Wann immer innerhalb des Paketes Event_Dispatcher von einem Ereignis oder einer Notification gesprochen wird, so wird dieses durch eine Instanz der Klasse Event_Notification repräsentiert. Nachdem Sie die Klasse Event_Notification nun gut kennen, können Sie sich als Nächstes der Klasse zuwenden, die Sie aktiv in Ihrer Anwendung verwenden werden.

Die Klasse Event_Dispatcher

Um die Event_Dispatcher-Klasse zu verwenden, sollten Sie diese allerdings nie direkt mit dem new-Operator instanziieren. Stattdessen verwenden Sie die statische Fabrikmethode Event_Dispatcher::getInstance(). Jedes Mal, wenn Sie diese Methode aufrufen, erhalten Sie dieselbe Instanz der Event_Dispatcher-Klasse zurück, schließlich wollen Sie Ihre Ereignisse an den Vermittler senden, an dem sich bereits vorher andere Objekte als Listener registriert haben. Durch die Implementierung des Singleton Patterns müssen Sie die Event_Dispatcher-Instanz nicht zwischen den einzelnen Akteuren Ihrer Anwendungen hin- und herreichen, sondern verwenden den globalen Zugriffspunkt über die statische Methode. Der folgende Code wird benötigt, um Event_Dispatcher einzubinden und eine Instanz zu erzeugen:
require_once 'Event/Dispatcher.php';
$dispatcher = Event_Dispatcher::getInstance();
Weiter mit: Teil 3 Alle Teile: Alle Teile: Teil 1, Teil 2, Teil 3
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -