PHP Magazin

Das Magazin für PHP Entwicklung

Ereignisgesteuerte Programmierung in PHP

Ereignisgesteuerte Programmierung in PHP

Listener erzeugen und registrieren

Um nun einen neuen Listener zu registrieren, verwenden Sie die Methode
addObserver(). Diese akzeptiert die folgenden drei Parameter:

  1. 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.
  2. 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.
  3. 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:

class MyListener {
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 Methode
getNotificationName() 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“:

$listener = new MyListener();
$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:

$dispatcher->removeObserve(
array($listener, 'listen'),'onTest');
Ereignisse auslösen

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:

  1. Das Objekt, das das Ereignis auslöst
  2. Den Namen des Ereignisses
  3. Optionale zusätzliche Informationen, die für das Ereignis relevant sind
  4. Booleschen Wert, der definiert, ob das Ereignis in einer Warteschlange gespeichert wird. Wenn Sie true fü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:

class MyApp {
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 = new MyApp();
$app->doSomething();

Führen Sie den Quellcode nun aus, so sehen Sie die Meldung
auf dem Bildschirm.

Das Ereignis onTest wurde ausgelöst.

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.

Stephan Schmidt ist Web Application Developer bei der 1&1 Internet AG sowie aktiver PEAR- und pecl-Entwickler. Er ist Autor des php-Magazins und betreut über 15 Pakete im PEAR-Projekt. Sie erreichen ihn über schst[at]php.net.
 

Kommentare

Ihr Kommentar zum Thema

Als Gast kommentieren:

Gastkommentare werden nach redaktioneller Prüfung freigegeben (bitte Policy beachten).