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

Abb. 2: Architektur mit Hilfe eines Dispatchers PEAR::Event_Dispatcher
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
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 KlasseEvent_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
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 |
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 dieEvent_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();