Allgemeines
Das PHP Microframework Silex des Symfony2 Erfinders Fabien Potencier verfolgt den minimalistischen Ansatz der simplen und überschaubaren Komponenten, die aber gleichzeitig das Rad nicht neu erfinden und dem Entwickler schnell ein Gerüst aus getesteten, wiederverwendbaren Funktionen bereitstellt.

Zu Beginn eines Projektes steht die Frage im Raum ob man ein Framework wie CakePHP, Symfony2 oder FuelPHP verwenden sollte oder lieber eigenhändig die Programmierung der Applikation übernimmt. Für kleinere Webapplikationen sind große Frameworks zu monströs um sinnvoll und vor allem kostengünstig eingesetzt werden zu können. Programmieren „from scratch“ ist jedoch auch keine vernünftige Alternative da man hier schnell die dreihundertste Datenbankklasse programmiert.
Microframeworks wie Silex bieten hier einen passenden Mittelweg aus Framework und Freiheit des Programmierers.
Bei Silex z.B. muss nur die silex.phar Datei ins PHP Gerüst inkludiert werden und schon kann der Programmierer drauf los legen. Dies beweist der folgende Code:

require_once __DIR__.'/silex.phar';  
$app = new Silex\Application();
$app->get('/hello/{name}', function($name) use($app) {
    return 'Hello '.$app->escape($name);
});
$app->run();

Im Folgenden werde ich in Auszügen ein Beispielprojekt mit Hilfe des Silex Microframeworks vorstellen. Das gesamte Beispielprojekt kann als ZIP Datei heruntergeladen werden und auf einem Server mit Apache, MySQL und PHP 5.3 ausgeführt werden.

Struktur
Die hier exemplarisch dargestellt Struktur ist NICHT bindend und hat sich bisher beim entwickeln bewährt.

/app
    /views
    /repositories
/cache
/config
/public
    /css
    /img
    /js
/vendor
    /Silex
    /Twig

Der vhosts Eintrag des apache Webservers sollte hier auf den /public Ordner zeigen. Der eigentliche Programmcode wird ins /app Verzeichnis ausgelagert.

bootstrap.php
Die bootstrap.php im /app Verzeichnis ist das Herzstück der Anwendung. Diese enthält alle Routing Informationen und den passenden Controller Code. Am Beispiel der /complete Funktion erläutere ich einige grundlegende Funktionen des Frameworks:

/**
 * Route: /complete/(id)
 * Sets a task as completed
 * @param int id
 */
$app->get('/complete/{id}', function ($id) use ($app) {
    $tasksRepository = new TasksRepository($app['pdo']);
    $tasksRepository->complete($id);
    return $app->redirect('/');
})
->assert('id', '\d+');

Die $app->get(…) Funktion ist eine Abkürzung der $app->match(…)->method(‘get’) Methode. Hier werden alle GET-Anfragen auf die URL http://example.com/complete/… abgearbeitet. {id} ist ein Platzhalter für die ID des Tasks.
Die ->assert(‘id’, ‘\d+’) Methode validiert die {id} Variable aus der URL und prüft ob die ID einer Integer Zahl entspricht. Falls nicht (falls jemand z.B. versucht SQL Injections einzuschleusen: /complete/15;DROP TABLE users;) wird die Aktion nicht aufgerufen und endet in einem 404 Fehler.

Ähnlich funktioniert dies mit POST-Aufrufen beim Speichern von Formular Daten:

/**
 * Route: /add | POST
 * Adds a task
 */
$app->post('/add', function(Request $request) use ($app) {
    $defaultFormData = array(
        'title' => null
    );
    $formData = array_merge($defaultFormData, $request->get('task'));
	// Database Actions are outsorced to an extra repository class
    $tasksRepository = new TasksRepository($app['pdo']);
    $insertedProperly = $tasksRepository->insert($formData['title']);
    if (!$insertedProperly) {
        $render = $app['twig']->render('/Tasks/add.twig', array(
            'message' => 'Task could not be saved! Title is empty'
        ));
    } else {
        $render = $app->redirect('/');
    }
     return $render;
});

Der Aufruf fügt einen neuen Task nur dann hinzu, wenn die POST Variable ‘title’ nicht leer ist. Ist diese gefüllt, wird ein neuer Task hinzugefügt und zur Startseite (‘/’) redirected. Falls nicht, wird eine Fehlermeldung auf der Formularseite dargestellt.

Der Kürze der Zeit halber habe ich hier auf den Validator Service von Silex verzichtet. Wer ihn sich genauer ansehen möchte, kann dies unter http://silex.sensiolabs.org/doc/providers/validator.html tun.

Fazit
Silex ist ein genials Framework für kleine Projekte, die in weniger als 2-3 Manntagen angefertigt werden sollen. Bei mittel bis großen Projekten sollte dagegen doch auf Symfony2 (oder einem vergleichbarem Framework) gesetzt werden.
Die einfache und schnelle Art der “Seiten”-Programmierung in Silex zeigt das Microframeworks seit PHP 5.3. sich auf jeden Fall einen Platz im Werkzeugkeller verdient haben.

Beispiel Projekt
Das Silex Taskmanager Beispiel Projekt enthält unter /sql die für die Anwendung benötigte SQL Struktur. Unter /config kann der Datenbank Zugang geändert werden.