Silex [1] ist ein Mikro-Framwork für PHP ab Version 5.3 und stammt von den Symfony2-Machern. Es greift Konzepte des Ruby-Mikro-Frameworks Sinatra [2] auf und basiert auf den Kern-Komponenten von Symfony2 [3] sowie dem Dependency-Injection-Container Pimple [4].
Es bietet damit genau jene Grundlagen, die nötig sind, um einfache Anwendungen innerhalb einer Datei zu schreiben. Um das zu erreichen, setzt Silex auf Knappheit, Erweiterbarkeit und Testbarkeit: Knappheit im Sinne einer klar begrenzten API, die statt Overhead vor allem Schlankheit demonstrieren soll. Durch den Einsatz des Mikro-Service-Containers Pimple lässt sich Silex zudem leicht um andere Bibliotheken erweitern. Zu guter Letzt sind dank der Verwendung der Symfony2-HttpKernel-Komponente Requests und Responses abstrahiert, was Tests erleichert.
Einstieg
Wie von einem Mikro-Framework nicht anders zu erwarten, ist auch für die Verwendung von Silex sehr wenig Aufwand zur Einrichtung notwendig. So konfiguriert man Controller und Actions sowie die Zuordnung zu den Routen auf einen Streich:
require_once __DIR__ . '/silex.phar'; $app = new Silex\Application(); $app->get('/hello/{name}', function($name) use($app) { return 'Hello ' . $app->escape($name); }); $app->run();
Listing 1
Dabei wird zunächst das Framework selbst eingebunden („silex.phar“), ein PHP-Archiv, das sämtliche Funktionen enthält. Die anschließend erstellte Instanz einer Anwendung erhält eine GET-Route für „/hello/{name}“. Ein Aufruf der entsprechenden URL führt die anonyme Funktion aus und gibt den Rückgabewert an den Browser zurück. Die letzte Zeile führt die Anwendung aus.
Eine .htaccess-Datei im gleichen Verzeichnis sorgt für die URL-Umschreibung, um jeweils die gleiche Datei („index.php“) zu erreichen. Das Ergebnis lässt sich schließlich unter „/hello/world“ anschauen.
<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On #RewriteBase /path/to/app RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
Listing 2
Templates mit Twig
Bei umfangreicheren Ausgaben, zum Beispiel (X)HTML-formatiertem Inhalt, wird das Ganze schnell unübersichtlich und schlecht wartbar. Um das zu verhindern, muss die Ausgabe ausgelagert werden. Da Silex erweiterbar ist, unterstützt es hierfür die Twig-Template-Engine [5], die auch in Symfony2 zum Einsatz kommt.
Nötig ist dafür zunächst die aktuelle Twig-Version [6]. Um die Bibliothek in Silex zu integrieren, muss der komplette lib-Ordner nach vendor/twig kopiert und im Hauptverzeichnis ein Ordner namens „views“ angelegt werden. Daraufhin lässt sich der Twig-Service-Provider registrieren und direkt verwenden.
$app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => __DIR__ . '/views', 'twig.class_path' => __DIR__ . '/vendor/twig/lib' ));
Listing 3
Templates landen fortan im views-Ordner und lassen sich über die Render-Methode ausgeben. Ersetzt werden Variablen übrigens nach dem Muster „{{ name }}“. Weitere Details zu Platzhaltern und anderen Möglichkeiten finden sich in der Twig-Dokumentation.
$app->get('/hello/{name}', function ($name) use ($app) { return $app ['twig']->render('hello.twig', array( 'name' => $name )); });
Listing 4
Fehlersuche
Um mehr als nur lästige weiße Seiten bei Fehlern zu erhalten, lässt sich Silex in einen Debug-Modus versetzen. Dieser zeigt aktuelle Fehler samt Stack-Trace direkt im Browser an.
$app ['debug'] = true;
Listing 5
Bleibt zu Beginn dennoch eine weiße Seite (oder entstehen ominöse Parsing-Fehler), liegt das häufig an Suhosin [7] oder dem Ioncube-Loader [8]. Während Letzterer ein Problem mit PHAR-Dateien hat und sich nur mit einem Upgrade auf eine Version ab 4.0.9 umstimmen lässt, benötigt Suhosin lediglich die Anweisung, PHAR-Dateien gutzuheißen.
suhosin.executor.include.whitelist = phar
Listing 6
Fazit
Die Verwendung von Twig ist nur ein Beispiel für eine funktionale Erweiterung. Silex selbst ist schlank und konzentriert sich auf Kern-Anwendungen. Hinsichtlich der Erweiterungen verfolgt es vielmehr das Prinzip „best tool for the job“, anstatt alles selbst lösen zu wollen. Andere Beispiele für Erweiterungen sind demnach etwa Doctrine [9] für die Datenbank-Abstraktion, Monolog [10] für das Logging und Swiftmailer [11] für den Mailversand.
Aufgrund des geringen Setup-Aufwands bietet Silex eine gute Grundlage für Kleinstprojekte. Durch die umfangreiche Dokumentation und den sauberen Code ist Silex bei soliden OOP-Kenntnissen sehr leicht zu erlernen. Der Code wird einheitlicher und die Wartung und Weiterentwicklung dadurch einfacher.
Wächst eine ursprünglich kleine Anwendung, so lassen sich bei einem Umstieg auf vollständige Symfony2-Komponenten weite Teile des Codes wiederverwenden. Entsprechend ist Silex nicht nur eine wertvolle Unterstützung bei „mal eben so“ geschriebenen Skripten, sondern kann auch für testhalber umgesetzte Teile eines großen Projekts dienen.