Ce cours vise à se familiariser avec le framework PHP Silex par la pratique, en écrivant une application Web basique.

Pré-requis
Pour bien suivre ce cours, vous devez :
Connaître les bases du langage PHP. Si vous êtes un débutant PHP complet, commencez par vous familiariser avec ce langage. Pour cela, je vous conseille les tutoriels d'OpenClassrooms ou de Codecademy.
Disposer d'une machine de développement incluant le serveur Web Apache.
Présentation de Silex
Silex est un micro-framework PHP développé par la société française SensioLabs, créatrice du framework Symfony. Silex est en quelque sorte le petit frère de Symfony et les deux frameworks reposent sur les mêmes composants.
Contrairement à Symfony qui fournit (et impose) une architecture complète (dite « full stack »), Silex est un framework minimaliste qui laisse beaucoup de liberté au développeur. C'est pourquoi on peut le qualifier de micro-framework. Il fournit un ensemble réduit de services au-dessus desquels on peut développer une application Web. Son minimalisme le rend idéal pour s'initier en douceur au fonctionnement d'un framework PHP.
Silex dispose d'une documentation en ligne assez complète. Dans ce tutoriel, nous allons nous contenter de l'utiliser pour afficher un simple message "Hello World" à l'utilisateur.
Installation de Silex
L'installation de Silex peut s'effectuer de deux manières :
En téléchargeant une archive du code source, disponible ici.
En utilisant le gestionnaire de dépendances Composer.
Nous allons utiliser la seconde solution, plus formatrice : Composer est un outil essentiel que tout développeur PHP sérieux se doit de connaître.
Introduction à Composer
Composer est un outil qui permet de définir des dépendances entre des projets PHP (exemple : "mon projet a besoin de Silex") et de récupérer automatiquement les fichiers associés.
Pour fonctionner, Composer doit être installé sur la machine de développement. Vous trouverez plus de détails, ainsi que la procédure d'installation, en consultant sa documentation.
Si vous êtes sous Windows, la solution la plus simple consiste à utiliser l'assistant d'installation de Composer, téléchargeable à cette adresse, puis à vous laisser guider. Au cours de l'installation, vous devrez indiquer le chemin du fichier exécutable
php.exe
. Son emplacement dépend de la façon dont PHP est installé votre machine. Avec XAMPP, il se trouve dans le répertoirec:\xampp\php
.Si vous êtes sous Mac OS X ou Linux, je vous conseille d'effectuer une installation globale afin que la commande
composer
soit disponible en ligne de commande.
Une fois l'installation terminée, vérifiez que Composer est utilisable sur votre machine en ouvrant une fenêtre de terminal puis en tapant simplement :
composer
Si l'installation de Composer a réussi, vous obtenez la description des options utilisables.
Création du fichier de dépendances
Une fois Composer installé, il faut créer un fichier de dépendances pour exprimer le fait que notre projet a besoin de Silex pour fonctionner.
Dans un premier temps, nous allons travailler directement dans le répertoire servi par votre serveur Web local. Son emplacement dépend de votre installation. Voici quelques emplacements possibles :
c:\xampp\htdocs
avec XAMPP pour Windows./var/www
ou/var/www/html
sous Linux./Applications/MAMP/htdocs
avec MAMP pour Mac.
Créez dans ce répertoire un sous-répertoire nommé hello-world-silex
qui sera le répertoire racine de notre application Web. Déplacez-vous dans ce répertoire puis créez un fichier texte nommé composer.json
. Ensuite, copiez-collez le texte ci-dessous dans ce fichier.
{
"require": {
"silex/silex": "1.3.*"
}
}
Ce fichier va être lu par Composer, qui va en déduire que le projet courant nécessite Silex (plus précisément : la plus récente des versions 1.3) et va récupérer automatiquement les fichiers nécessaires.
Récupération de Silex via Composer
Ouvrez une fenêtre de terminal et déplacez-vous dans le répertoire hello-world-silex
créé plus haut. Ensuite, lancez la commande ci-dessous :
composer install
Si tout va bien, Composer va télécharger les fichiers de Silex dans un sous-répertoire nommé vendor
du répertoire courant. Pourquoi ce nom ? Il s'agit d'une convention standard : dans un projet PHP, le répertoire vendor
rassemble le code issu de projets tiers.

Voici à présent l'arborescence de notre projet. On vérifie au passage que Silex repose sur certains composants du framework Symfony, regroupés dans le sous-répertoire symfony
du répertoire vendor
.

Si vous êtes curieux(se), c'est le moment d'aller examiner le code source de ces composants... Heureusement, cette étape n'est pas indispensable pour utiliser Silex ou Symfony.
Aperçu du fonctionnement de Silex
Un premier exemple
Maintenant que Silex est installé, il est temps de voir comment l'utiliser. Pour cela, créez dans hello-world-silex
un sous-répertoire web
, puis créez dans web
un fichier index.php
. Copiez/collez le code ci-dessous dans ce fichier.
<?php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/', function () {
return 'Hello world';
});
$app->run();
Le fichier vendor/autoload.php
est généré automatiquement par Composer. En l'incluant dans notre fichier source au moyen de l'instruction PHP require_once, on peut ensuite utiliser tous les éléments PHP définis dans les sous-répertoires de vendor
. L'intérêt de cette pratique est expliqué dans cet article.
Le reste du code source du fichier index.php
instancie un objet nommé $app
, puis définit ce qu'on appelle une route.
La route définie ici renvoie le texte "Hello world" lorsque l'URL racine de l'application (/
) est demandée. La syntaxe utilisée pour définir l'action peut sembler déroutante à première vue. Il s'agit d'une fermeture (closure), une fonction définie à l'intérieur du corps d'une autre fonction. Ce concept existe dans de nombreux langages.
Test de l'exemple
Afin de contrôler que notre exemple fonctionne, vérifiez que votre serveur Web local est lancé puis tapez l'URL http://localhost/hello-world-silex/web/index.php dans votre navigateur Web favori.
Vous devriez obtenir l'affichage du texte "Hello world" dans le navigateur.
Initiation au routage avec Silex
Pour l'instant, notre application Web ne dispose que d'un point d'entrée. Ajoutons-en un autre en ajoutant une nouvelle route dans le fichier index.php
.
<?php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/', function () {
return 'Hello world';
});
$app->get('/hello/{name}', function ($name) use ($app) {
return 'Hello ' . $app->escape($name);
});
$app->run();
Cette nouvelle route correspond à une URL de type /hello/nom
. La partie de l'URL située après /hello/
est passée à l'action sous la forme d'un paramètre nommé $name
.
L'action associée à la nouvelle route construit le message affiché par concaténation. L'URL /hello/Bob
affichera le message "Hello Bob". Elle utilise la méthode escape, qui permet d'éviter les injections de code dans le résultat généré.
Pour tester la nouvelle route, pointez votre navigateur vers http://localhost/hello-world-silex/web/index.php/hello/Bob et vérifiez que vous obtenez le message prévu.
Simplification des URL
Vous aurez noté que les URL de notre application Web commencent toutes par /web/index.php
, ce qui est peu pratique. Plutôt que devoir écrire http://localhost/hello-world-silex/web/index.php/hello/Bob, on aimerait pouvoir écrire http://localhost/hello-world-silex/hello/Bob.
Nous allons aller plus loin et faire en sorte que l'application réponde à une URL de la forme http://hello-world-silex/hello/Bob. Cela nécessite de modifier la configuration du serveur Web local, qui sera Apache dans notre exemple.
Définition d'un hôte virtuel
La première étape est de définir un hôte virtuel (virtual host). Le principe des hôtes virtuels est de définir plusieurs serveurs logiques sur un même serveur physique. Vous trouverez tous les détails sur les hôtes virtuels dans la documentation Apache.
Sous Windows et Mac OS X
La configuration d'un hôte virtuel Apache sous Windows et Mac OS X nécessite l'édition du fichier de configuration httpd-vhosts.conf
. Son emplacement dépend de l'installation d'Apache :
c:\xampp\apache\conf\extra
avec XAMPP sous Windows./Applications/MAMP/conf/apache/extras
avec MAMP sous Mac OS X.
Ouvrez ce fichier avec un éditeur de texte puis ajoutez le contenu ci-dessous à la fin en adaptant les lignes commençant par DocumentRoot
et Directory
à votre configuration locale.
<VirtualHost *:80>
DocumentRoot "C:\xampp\htdocs"
ServerName localhost
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "C:\xampp\htdocs\hello-world-silex\web"
ServerName hello-world-silex
<Directory "C:\xampp\htdocs\hello-world-silex\web">
AllowOverride all
</Directory>
</VirtualHost>
Le premier hôte virtuel redéfinit localhost
, ce qui est nécessaire quand on rajoute des hôtes virtuels sous Apache. Le second crée un hôte virtuel associé au nom hello-world-silex
et dont la racine est le répertoire hello-world-silex/web
.
Ensuite, éditez le fichier principal de configuration apache. Il se nomme httpd.conf
et se trouve dans le répertoire de configuration d'Apache (exemples : c:\xampp\apache\conf
avec XAMPP sous Windows, /Applications/MAMP/conf/apache
avec MAMP sous Mac OS X). Dans ce long fichier, vérifiez que la ligne incluant le fichier httpd-vhosts.conf
est bien décommentée (absence de '#' au début de la ligne), et décommentez-là au besoin.
Voici le résultat à obtenir avec XAMPP sous Windows :
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
Et voici le résultat à obtenir avec MAMP sous Mac OS X.
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
Sous Linux
La configuration d'un hôte virtuel Apache sous Linux se fait en ajoutant un fichier de configuration dans le répertoire /etc/apache2/sites-available
. La procédure est décrite en détail dans la documentation Ubuntu. Le fichier à ajouter se nommera ici hello-world-silex.conf
et pourra avoir le contenu suivant (dans cet exemple, le dossier servi par Apache est le répertoire /var/www/html
).
<VirtualHost *:80>
ServerName hello-world-silex
DocumentRoot /var/www/html/hello-world-silex/web
<Directory "/var/www/html/hello-world-silex/web">
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
Il faut ensuite activer le nouvel hôte virtuel en lançant la commande suivante.
sudo a2ensite hello-world-silex.conf
Elle a pour effet de créer dans le répertoire /etc/apache2/sites-enabled
un lien symbolique qui pointe vers le fichier /etc/apache2/sites-available/hello-world-silex.conf
.
Modification des informations DNS
Une fois l'hôte virtuel créé et quel que soit votre système d'exploitation, il faut ajouter une information au fichier hosts
local pour que la résolution DNS pointe sur la machine locale (127.0.0.1). Là encore, l'emplacement de ce fichier dépend de votre système :
C:\Windows\System32\drivers\etc\hosts
sous Windows./etc/hosts
sous Mac OS X et Linux.
Editez ce fichier afin d'y ajouter la ligne ci-dessous.
127.0.0.1 hello-world-silex
Une fois le fichier hosts
modifié, l'application doit répondre à l'URL http://hello-world-silex avec le message "Hello world".
Reécriture des URL à la volée
Si vous tentez maintenant d'accéder à l'URL http://hello-world-silex/hello/Bob, vous obtenez un message d'erreur de notre navigateur. Afin de rendre ce type d'URL fonctionnel, il faut rediriger toutes les requêtes entrantes vers le fichier index.php
écrit précédemment.
Sous Apache, cela passe par la définition d'un fichier de réécriture d'URL (URL rewriting) nommé .htaccess
et situé dans le répertoire hello-world-silex/web
. Créez ce fichier puis copiez/collez-y le texte ci-dessous.
# Redirect incoming URLs to index.php
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
</IfModule>
A présent, l'URL http://hello-world-silex/hello/Bob doit afficher le message de bienvenue. Notre application Web est fonctionnelle !
Conclusion
Dans ce tutoriel, nous avons posé les bases d'une application Web utilisant le framework PHP Silex. Les étapes essentielles de l'installation de Silex et de la configuration du serveur Web sont réalisées. Il ne reste plus qu'à enrichir l'application en lui ajoutant des routes ainsi que les actions associées.
Cette évolution sera aisée : l'un des intérêts d'un micro-framework comme Silex est qu'il est très facile d'ajouter à l'application Web de nouveaux services (exemples : gestion de la persistance, de la sécurité, moteur de templates) et d'améliorer son architecture afin de répondre aux besoins qui apparaîtront pendant le cycle de vie du logiciel.
Si vous souhaitez aller plus loin avec Silex, le cours OpenClassrooms Evoluez vers une architecture PHP professionnelle décrit en détail la construction d'une application Web autour de ce framework.