Event-Handling selbstgemacht

| Keine Kommentare

Viele moderne Anwendungen arbeiten heutzutage event-basiert und ermöglichen es dadurch den Entwicklern bei bestimmten Ereignissen eigenen Code auszuführen, ohne dabei das bestehende Programm verändern zu müssen.

Durch die sehr flexible Handhabung lohnt sich ein einfaches Event-Handling auch schon für kleinere Anwendungen. Um das Prinzip zu erklären, habe ich eine einfache Beispiel-Implementierung vorbereitet.

Die Klasse Event dient uns zum Registrieren und Auslösen von Ereignissen. Das folgende Beispiel ist bewußt einfach gehalten und sollte nicht produktiv eingesetzt werden.

<?php
class Event
{
  protected static $_events = array();

  public static function register($event, $class, $method = 'update')
  {
    self::$_events[strtolower($event)][$class] = $method;
  }

  public static function dispatch($event, $extra = null)
  {
    $event = strtolower($event);
    if (!isset(self::$_events[$event])) {
      return;
    }

    foreach ((array)self::$_events[$event] as $class => $method) {
      $object = new $class();
      $object->$method($extra);
    }
  }
}

Damit haben wir jetzt die Basis zum Verarbeiten von Ereignissen. Was können wir jetzt damit machen?

Angenommen wir programmieren eine Community und wollen jedesmal, wenn ein Benutzer seine Daten ändert eine Email an alle seine Freunde versenden.

Dafür brauchen wir zuerst eine Klasse, die genau das für uns macht.

<?php
class UserObserver
{
  public function afterSave($user)
  {
    echo 'Mail an alle Freunde von ' . $user->getName() . ' schicken';
  }
}

Und müssen anschliessend ein Ereignis registrieren.

<?php
Event::register('afterUserSaved', 'UserObserver', 'afterSave');

Jetzt, da die Klasse geschrieben und das Ereignis registriert ist, lässt es sich von jedem Punkt der Anwendung auslösen.

In diesem Beispiel ist es wohl am sinnvollsten in der Speicher-Methode des Users.

<?php
// ...
public function save(User $user)
{
  // User speichern...
  Event::dispatch('afterUserSaved', $user);
}
// ...

So können nun beliebig viele Ereignisse registriert werden und ebenso beliebig viele Klassen darauf reagieren.

Ich hoffe, dass ich dem einen oder anderen das Thema etwas schmackhaft machen konnte und wünsche viel Spaß beim Experimentieren. Kommentare sind wie immer gerne gesehen. :)

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Schlagwörter: A/B-Test, AbstractType, Adapter, AddOn, Administration, Ajax, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, Auftrag, Ausbildung, Auswertung, Authentifizierung, AutoLoader, AWS, Bedienung, Bedingung, Benchmark, Berechtigung, Berlin, Bildbearbeitung, Bildschirmfoto, Blog, Blogroll, BOM, Bootstrap, Bot, Browser, Bugtracker, Byte Order Mark, Bücher, Cache, CakePHP, Call-Center, Callback, CamelCase, Canvas, Captcha, CDN, Cheatsheet, CLI, Clickout, Closure, Cloud, CodeSniffer, Collection, Community, Comparator, Config, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CRUD, CSS, CSV, CustomLibrary, Custom_Model, Daemon, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Datum, Debug, Decorator, Dekorierer, Design, Design Patterns, Doctrine, Dokumentation, Dump, Duplikat, each, EC2, Eclipse, Email, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Event, Eventhandling, Exception-Handling, Extension, Facebook, Factory, Fallback, Fehler, Fehlermeldung, Filter, Firefox, Flash, flexigrid, Foreach, Formatierung, Formular, Framework, FTP, Funktion, Futon, ga:pi(), Getter, Google Analytics, Hash, Hash-Bang, Header, htaccess, HTML5, htpasswd, HTTP, HTTPS, IDE, If, Implementierung, InnoDB, Interceptor, Interface, Internet Explorer, isset, Iterator, Java, JavaScript, Job, jQuery, Kommentar, Konfiguration, Konsole, Kontrollstruktur, kopieren, kostenlos, Kundenbetreuung, Late Static Binding, Layout, Links, Linux, Listeners, Lizenz, Logging, Löschen, Magento, Magic Methods, Manual, ManyToMany, Marketing, Methode, Model, Monolog, MVC, MySQL, NetBeans, Network, Nirvanix, Objekt, Observable, Observer, OneToMany, Online Tool, OOP, Open Source, Operator, OR-Mapper, Order, ORM, O’Reilly, Parameter, Partnersuche, Passwort, Performance, PHP, php.ini, PHP hates me, phpMyAdmin, PHPUnit, Plugin, Popup, Proxy, Prüfsumme, Prüfung, QR-Code, Qualitätssicherung, Query, Queue, Redesign, Refactoring, Reflection, Request, Response, Responsive Design, Rest-API, Rockstar, Rollback, Routing, S3, Samba, Scheifen, Schleife, Schutz, Screenshot, Secure Shell, Selbstreferenz, Server, Setter, setTimeout, Shop, Sicherheit, Sicherung, Sichtbarkeit, Singleton Pattern, Skin, SOAP, Social Network, Software, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, Splittest, SSH, SSL, Stammtisch, Statement, static, Statistik, Status, Stellvertreter, Strategy Pattern, Stream, String, Stuttgart, Stylesheet, Subversion, Sun VirtualBox, Support, SVN, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Theme, Thumbnail, Tool, Tour, Tracking, Twig, Twitter, Type-Cast, Ubuntu, Umwandlung, Underscore, unset, Update, Upload, Url, User Story, Validierung, Vererbung, Versionskontrolle, Versionsnummer, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Warteschlange, Webserver, Webservice, Weiterleitung, Werkzeug, Windows, WindowsAzure, WordPress, Wrapper, Writer, XML, Youtube, Zeitschleife, Zeitsteuerung, Zend Framework, Zend_Application, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Reflection, Zend_Service, ZPress, Zugangskontrolle, Zugriffsmethode