Ereignisgesteuerte Programmierung in PHP
Ereignisgesteuerte Programmierung in PHP
Um nun einen neuen Listener zu registrieren, verwenden Sie die MethodeaddObserver(). Diese akzeptiert die folgenden drei Parameter:
- Den Listener, der informiert werden soll. Hierbei wird ein PHP-Callbackübergeben. Dies kann entweder eine PHP-Funktion oder auch eine Methode eines Objektes oder einer Klasse sein. Mehr Informationen zu PHP-Callbacks erhalten Sie in der offiziellen PHP-Dokumentation.
- Den Namen des Ereignisses, für das der Listener registriert werden soll.
Hierbei handelt es sich um einen frei von Ihnen definierbaren Namen. Sie
müssen natürlich sicherstellen, dass das Ereignis auch von irgendeiner
Komponente ausgelöst wird. In den meisten Applikationen beginnt der
Name der Ereignisse mit der Vorsible "on", also zum Beispiel "onLogin","onOrderCompleted" etc. - Den optionalen Namen der Klasse, die das Ereignis auslösen soll, für das
der Listener registriert wird. Wenn Sie diesen Parameter angeben, so kann
er als Filter dienen. Lösen zum Beispiel zwei Komponenten dasselbe Ereignis
aus, so können Sie mit Hilfe dieses Parameters bestimmen, dass Ihr Listener
nur dann benachrichtigt werden soll, wenn eine bestimmte Komponente
das Ereignis ausgelöst hat. Löst eine der anderen Komponenten das Ereignis aus, so wird es von Ihrem Listener ignoriert.
Einen neuen Listener zu registrieren ist also sehr einfach, zuerst implementieren
Sie eine Methode oder Funktion, die als Listener dient. Das folgende Beispiel
verwendet direkt eine Klasse, da bei großen Anwendungen die objektorientierte
Programmierung der prozeduralen vorzuziehen ist:
public function listen($notification) {
$name = $notification ->getNotificationName();
print "Das Ereignis {$name} wurde ausgelöst.\n";
}
}
Die Methode listen(), die später als Listener fungieren soll, erhält alle Informationen
in einer Instanz von Event_Notification gekapselt. Über die MethodegetNotificationName() erhalten Sie zum Beispiel den Namen des Ereignisses.
Tabelle 1 listet alle verfügbaren Methoden auf.
Danach erzeugen Sie eine Instanz der Klasse und registrieren die listen()
Methode dieses Objektes für das Ereignis „onTest“:
$dispatcher->addObserver(array($listener, 'listen'),
'onTest');
Sie können beliebig viele Listener für ein Ereignis registrieren, diese werden in
derselben Reihenfolge informiert, in der sie registriert wurden.
Auf dieselbe Art könnten Sie den Listener auch wieder entfernen, dazu bietet
die Event_Dispatcher-Klasse die Methode removeObserver(), die dieselbe Signatur
wie addObserver() hat:
array($listener, 'listen'),'onTest');
Nun bleibt als letzte Aufgabe nur noch, ein Ereignis auszulösen. Dazu verwenden
Sie die post()-Methode des erzeugten Dispatcher-Objektes. An diese
Methode können Sie die folgenden Parameter übergeben:
- Das Objekt, das das Ereignis auslöst
- Den Namen des Ereignisses
- Optionale zusätzliche Informationen, die für das Ereignis relevant sind
- Booleschen Wert, der definiert, ob das Ereignis in einer Warteschlange gespeichert wird. Wenn Sie
truefür diesen Parameter übergeben, so werden
auch Listener, die nach dem eigentlichen Auslösen der Ereignisses registriert
werden, darüber informiert, dass dieses Ereignis eingetroffen ist.
Da Sie als ersten Parameter das Objekt übergeben müssen, das das Ereignis ausgelöst
hat, müssen Sie zunächst eine neue Klasse erstellen, die später als Auslöser
fungiert. Für einen Test genügt es, eine Methode zu implementieren, die
das Ereignis auslöst, wenn sie aufgerufen wird. Zusätzliche Informationen werden
für einen ersten Test auch nicht benötigt. Verwenden Sie für den Test also
die folgende Klasse:
public function doSomething() {
$dispatcher = Event_Dispatcher::getInstance();
$dispatcher->post($this, 'onTest');
}
}
In der Methode doSomething() wird über die Methode Event_Dispatcher::get-Instance() dieselbe Instanz geholt, an der Sie bereits einen Listener registriert
haben. Danach lösen Sie durch Aufrufen der post()-Methode das Ereignis „onTest“ aus.
Sie müssen nun nur noch eine Instanz der Klasse erzeugen und die entsprechende
Methode aufrufen:
$app->doSomething();
Führen Sie den Quellcode nun aus, so sehen Sie die Meldung
auf dem Bildschirm.
Die beiden Objekte MyApp und MyListener haben nun miteinander
kommuniziert, ohne dass diese von der Existenz des anderen wissen
mussten. Eine losere Art der Kopplung zwischen zwei Komponenten werden
Sie kaum erreichen können.
Nachdem Sie jetzt Ihre ersten Erfahrungen mit Event_Dispatcher gemacht
haben, können Sie das Paket nun verwenden, um die Anforderungen an das
Authentifizierungs-System umzusetzen.
Als Gast kommentieren:
Gastkommentare werden nach redaktioneller Prüfung freigegeben (bitte Policy beachten).
-
PHP Magazin - Die aktuelle Ausgabe
Inhalt, Editorial, Quellcodes und Link-Tipps zum aktuellen PHP Magazin -
Archiv
-
Digital lesen
-
PHP Magazin Abo

Warenkorb
Login
Registrieren
Kommentare
Ihr Kommentar zum Thema