Premiers pas avec Silex


Technique

Silex est le micro-framework de Sensiolabs basé sur les composants de Symfony2 (le framework modulaire connu et reconnu) et la librairie Pimple (un système d’injection de dépendance) pour PHP 5.3+. En tant que “micro” framework, son installation et son utilisation sont simplifiées au maximum, comme nous allons le voir. Mais le fait de reposer sur les épaules du géant Symfony2 peut en faire une arme de développement redoutable.

Installation

Le moyen le plus simple pour créer un projet Silex est d’utiliser Composer. Voici ce que doit contenir votre composer.json pour obtenir un projet Silex complet avec ses principaux providers.

{
    "require": {
    "silex/silex": "1.0.*@dev",
    "monolog/monolog": ">=1.0.0",
    "doctrine/dbal": "2.2.*",
    "twig/twig": ">=1.8, }
}

Une fois les vendors installés (via php composer.phar install), il faut créer deux fichiers : le index.php qui s’occupera de la logique et un fichier .htaccess pour l’url rewriting. Dans nos exemples, notre répertoire de travail sera web/, mais ce n’est pas requis.

Voici le contenu du fichier .htaccess :

 

<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On # RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] </IfModule>

Voici le fichier index.php de base qui permet de “bootstraper” l’application :

<?php require_once __DIR__.'/../vendor/autoload.php'; use SilexApplication; $app = new Application(); $app['debug'] = true; $app->run();

 

Vous pouvez remarquer que l’objet Application implémente ArrayAccess, permettant d’accéder à ses propriétés de la même manière qu’avec un tableau.

Pour le moment notre application ne fait rien. Si vous essayez d’accéder à l’index à partir de votre navigateur, vous devriez avoir une page de debug avec erreur 404. Il faut que nous ajoutions la première page.

Initialisation de l’application

Pour commencer, faisons une page simple à l’url /ping qui répond “pong”. Il suffit d’ajouter le code suivant au dessus de $app->run(); :

$app->get('/ping', function() use ($app) {
 return "pong";
 });
 

Difficile de faire plus simple. Décortiquons ces trois lignes. La méthode get de $app indique quel type de requête est attendu (GET dans ce cas, il est aussi possible d’utiliser ->post() pour les requêtes POST, ->delete() pour les requêtes DELETE, etc.). Le premier argument représente l’url à capturer, ici “/ping”. A savoir qu’il est possible de passer des arguments de la même façon qu’avec le routing de symfony, en utilisant les placeholder {var}. La variable sera alors récupérée comme paramètre de la fonction inline qui vient en second.

Pour comparer avec Symfony2, Silex n’a pas de Bundles et de Controllers, juste des Actions qui sont justement les fonctions inline passées en second argument. Ce que retourne cette fonction sera la réponse de l’action, soit une chaîne de caractères simples, soit pour les réponses plus élaborées un objet Response.

Utilisation d’un provider

Voyons comment améliorer un peu notre ping pour qu’il soit possible d’y passer un nom personnalisé et une réponse un peu plus complète. Remplaçons le code du fichier index.php par le code suivant :

<?php require_once __DIR__.'/../vendor/autoload.php'; use SilexApplication; use SilexProviderTwigServiceProvider; $app = new Application(); $app['debug'] = true; $app->register(new TwigServiceProvider(), array(  'twig.path' => __DIR__ . '/../', ));
$init = microtime(true); $app->get('/ping/{name}', function($name) use ($app, $init) { $duration = round((microtime(true) - $init)*1000, 2); return $app['twig']->render('ping.html.twig', array( 'name' => $name, 'duration' => $duration )); });

        $app->run();
    

Avant de décortiquer ce code, créons un fichier ping.html.twig à la racine de notre projet contenant le template que voici :

 

<!DOCTYPE html> <html> <head> <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css" rel="stylesheet"> </head>
<body> <div> <h1>Pong {{ name }} <small>generated in {{ duration }}ms</small></h1> </div> </body> </html>

Le première modification sur index.php est l’ajout du namespace permettant d’accéder à TwigServiceProvider. Cela nous permet dans un second temps d’ajouter le provider twig grâce à la fonction “register”. On peut voir qu’en deuxième argument de register est passé un tableau d’options, avec ici comme seule entrée le chemin absolu vers les fichiers de template twig.

Le changement suivant est l’initialisation de la variable $init contenant le timestamp en microsecondes. Nous permettons à notre fonction inline d’y avoir accès en passant la variable dans le use. Remarquez que nous avons modifié la route comme prévu pour pouvoir faire passer l’argument $name.

Enfin dans notre fonction, nous calculons la différence en microsecondes entre le moment où la variable init à été créée et maintenant pour voir le temps écoulé depuis le lancement de l’application. Finalement nous passons les variables au template twig pour affichage :

     /ping/Disko

 Premiers pas avec Silex

Conclusion

Nous avons vu comment installer Silex et en faire une première utilisation. Silex convient parfaitement aux sites de petite envergure et permet d’avoir des fonctionnalités très pratiques (routing, templating, …) en un temps record, et sans la lourdeur du framework complet Symfony2. Nous ne pouvons que vous le conseiller pour les prototypes ou les sites de quelques pages.

Si vous souhaitez en apprendre plus sur Silex, peut-être devriez-vous regarder comment mettre en place le DBAL de Doctrine pour la base de données, comment répartir  proprement le code dans plusieurs fichiers et enfin comment créer vos propres Service Providers.

Laisser un commentaire