Fil d'Ariane
Mis à jour le lundi 8 février 2016
  • 1 heure
  • Facile
Connectez-vous ou inscrivez-vous pour bénéficier de toutes les fonctionnalités de ce cours !

Introduction du cours

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épertoire c:\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.

Téléchargement des composants Silex via Composer
Téléchargement des composants Silex via Composer

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 .

Arborescence de Silex
Arborescence de Silex

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.

Exemple de certificat de réussite
Exemple de certificat de réussite