entwickler.kiosk jetzt auch für Neukunden: 10 % Ersparnis auf All You Can Read bis zum 30.06.2015.

Ereignisgesteuerte Programmierung in PHP

Kommentare

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

Den Listener, der informiert werden

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.
admin

Autor

admin

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen über diesen post