Symfony2: Einfaches Eventhandling, die Zweite…

| Keine Kommentare

Gesagt, getan… Wie im letzten Artikel geht es wieder um einfaches Eventhandling mit Symfony2. Trotz, oder gerade wegen, der großen Flexibilität fehlte mir die Information welches Event ausgelöst wurde.

Sicherlich wird man es in der Regel wissen, da meist nur ein Event zu einer Listenermethode registriert wird, aber falls nicht, kommt man eben nicht mehr dran.

Als erstes habe ich eine eigene Eventklasse abgeleitet, die den Eventnamen speichern kann. Da dieser ja nun beim Dispatch irgendwie mitgegeben werden muss, hatte ich drei Möglichkeiten:

  1. Vor dem Dispatch jedesmal den Eventnamen per Setter übergeben
  2. Den Dispatcher ableiten und die Methode dispatch() überschreiben
  3. Meinem Event eine eigene Dispatchmethode geben

Die erste Variante ist natürlich schon ausgeschieden, bevor die Idee ausgeschrieben war, da es zum einen unhandlich ist, unnötigen Code erzeugt und auch ein großes Fehlerpotential bildet.

Den Dispatcher zu überschreiben wäre sicher auch ein einfacher Weg gewesen, dennoch habe ich mich dann doch für die dritte Möglichkeit entschieden.

Eine eigene Klasse für das Event wurde ohnehin schon gebaut und so kann diese auch noch etwas mehr machen. Auf Typehints usw. habe ich für die Übersicht hier mal verzichtet.

<?php
namespace E7\EventDispatcher;

//use ...\EventDispatcher as ED;

class Event extends ED\Event {
  private $eventDispatcher;
  private $eventName;

  public function getEventDispatcher() {
    return $this->eventDispatcher;
  }

  public function setEventDispatcher($eventDispatcher) {
    $this->eventDispatcher = $eventDispatcher;
    return $this;
  }

  public function getEventName() {
    return $this->eventName;
  }

  public function setEventName($eventName) {
    $this->eventName = $eventName;
    return $this;
  }

  public function dispatch($eventName) {
    $this->setEventName($eventName);
    $this->getDispatcher()->dispatch($eventName, $this);
    return $this;
  }
}

Viel gewonnen haben wir so aber leider nicht. Der Aufruf passiert nun direkt auf dem Event, aber statt dem Setter für den Eventnamen müssten wir nun den Setter für den EventDispatcher aufrufen.

Meine Lösung hierfür ist eine Factory für Eventobjekte. Das ganze schafft uns bei der Verwendung weitere Vorteile.

  1. Nur die Factory muss den EventDispatcher kennen und übergibt diesen an die Eventobjekte. Jede Änderung bei der Erzeugung der Events muss nun nur noch an einer Stelle gemacht werden.
  2. Durch die Factory fällt der new-Operator weg und damit auch die Abhängigkeit zu speziellen Typen. Wir programmieren ab hier noch gegen das Interface

Die Factory lässt sich entweder mit einem statischem Aufruf verwenden oder man registriert sie als Service und holt sie sich über den Container. Bei Interesse kann ich auch gerne dazu noch was schreiben.

 

 

 

 

 

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