Symfony2: Unabhängiger mit eigenen Basisklassen

| 2 Kommentare

Heute mag ich mal ein paar Ideen und Gedanken zum Thema machen, die mal so bei der Arbeit mit diversen Frameworks entstanden sind. Die Beispiele betreffen zwar das Symfony2 Framework, aber Vergleiche dazu lassen sich auch bei den anderen finden. Es liegt in der Natur von Frameworks, dass sie sich meist unabhängig von der eigenen Anwendung weiterentwickeln, da sie allgemeingültig sein sollen.

Nach Möglichkeit soll das eigene Projekt unabhängig sein von der Version, damit auch nach einem Versionswechsel noch alles wie gehabt funktioniert. Dabei habe ich positive Erfahrungen mit eigenen Basisklassen gemacht. Für manch einen ein alter Hut, für andere unnötig komplex. Hier ein paar Beispiele, wie man Zeit einsparen kann.

Eine sicherlich bekannte und je nach Anwendung mehr oder wenig verwendete Funktion sind Flashmessages und Redirects in den Controlleractions. Also eine Nachricht wird nach einer Aktion geschrieben und nach der Weiterleitung auf eine andere Action angezeigt.

In Symfony2 hat sich der Zugriff auf die Flashmessages zwischen den Versionen 2.0 und 2.1 etwas geändert. Der Code stammt aus der Symfony Dokumentation.

// Version 2.0
$this->get('session')->setFlash(
  'notice',
  'Your changes were saved!');

// Version 2.1
$this->get('session')->getFlashBag()->add(
  'notice',
  'Your changes were saved!');

So gesehen keine große Sache, aber wenn man viel davon gebrauch macht muss man nun viele Stellen im Code anpassen und muss/sollte danach alles wieder testen. Manuell kostet es Zeit und nervt, Suchen und Ersetzen kann funktionieren, muss aber nicht. An der Stelle lohnt sich eine eigene Klasse für den Controller, in der wir eine setFlash()-Methode als Weiterleitung implementieren (die meisten Methoden im Symfony Controller arbeiten auch so ;-) ).

class MyController extends SymfonyController {
  public function setFlash($message, $label = 'notice') {
    $this->get('session')->getFlashBag()->add($label, $message);
    return $this;
  }
}

Nur eine kleine Änderung, aber bei der nächsten Änderung im Framework spart es Arbeit. Gleichzeitig habe ich für meine Anwendung die Parameter vertauscht, so dass das Label nicht immer angegeben werden muss. Wenn man eine mehrsprachige Anwendung entwickelt, kann man an der Stelle auch noch die Übersetzung dazwischen hängen und nur noch mit MessageKeys arbeiten.

class MyController extends SymfonyController {
  public function setFlash($message, array $parameters = array(),
                           $label = 'notice') {
    $message = $this->get('translator')->trans($message, $parameters);
    $this->get('session')->getFlashBag()->add($label, $message);
    return $this;
  }
}

Eine weitere Anpassung habe ich beim Redirect gemacht. Die Idee dazu hat ein Sprecher auf der Symfony Live 2012 mit in den Raum geworfen. Wenn viele Redirects innerhalb der Anwendung gemacht werden, in meinem Fall ist das so, dann kann man sich Schreibarbeit bzw. Copy&Paste sparen und mehrere Methoden in einer zusammenfassen.

class MyController extends SymfonyController {
  public function redirectRoute($route, array $parameters = array()) {
    $url = $this->generateUrl($route, $parameters);
    return $this->redirect($url);
  }
}

In der jeweiligen Action kann dann mit recht wenig Code gearbeitet werden.

class PostController extends MyController {
  public function createAction() {
    // Validieren, Speichern etc.
    return $this->setFlash('message.post_created', 'success')
                ->redirectRoute('post_list');
  }
}

In den letzten Jahren hat das mit den “Shortcut-Methoden” immer gut funktioniert. So habe ich z.B. auch Basisklassen für Listener, Forms (AbstractType) und sogar für den Request. Ich finde, als Entwickler darf man faul sein, wenn es an der richtigen Stelle ist. ;-)

 

2 Kommentare

  1. Klasse Idee. Als SF2-Anfänger stellt sich mir allerdings die Frage wo/wie Du die Klasse ‘MyController’ unterbringst? Gruss K

  2. Dazu gibt es verschiedene Meinungen. Der einfache Weg wäre ein Bundle und dann im Verzeichnis “Controller”. Es gibt aber auch Entwickler die der Meinung sind, Bundles sind schon zu speziell für so allgemeine Klassen. In dem Fall würdest du es als unabhängige Vendor-Library über den Composer integrieren. Wie du es machst bleibt letztendlich dir überlassen. In der Doku sollte beides beschrieben sein.

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Schlagwörter: A/B-Test, AbstractType, Adapter, AddOn, Administration, Ajax, Alühn, Alühn2, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, Auftrag, Ausbildung, Auswertung, Authentifizierung, AutoLoader, AWS, Backup, 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, Datensicherung, 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, Gnome, 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, Point and Click, Popup, Praktikum, Proxy, Prüfsumme, Prüfung, QR-Code, Qualitätssicherung, Query, Queue, Redesign, Refactoring, Reflection, Repository, 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