• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Itération 3 : intégration du framework PHP Silex

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Le but de cette itération est d'intégrer un framework à notre application.

Avantages apportés par un framework

En informatique comme ailleurs, il est rarement utile de réinventer la roue. La plupart des applications web ont les mêmes besoins de base : accès au contenu de la requête HTTP reçue, création et renvoi de la réponse, gestions des sessions... Il existe une catégorie de logiciels dont le rôle est de gérer ces besoins communs : ce sont les frameworks.

Un framework fournit un ensemble de services de base, généralement sous la forme de classes en interaction. À condition de respecter l'architecture qu'il préconise (souvent une déclinaison du modèle MVC), un framework PHP libère le développeur de nombreuses tâches techniques comme le routage des requêtes, la sécurité, la gestion du cache, etc. Cela lui permet de se concentrer sur l'essentiel, c'est-à-dire ses tâches métier. Il existe une grande quantité de frameworks PHP. Parmi les plus connus, citons Symfony, Zend Framework ou encore Laravel.

Choix du framework

Il est possible d'écrire soi-même son propre framework, puis de le réutiliser dans tous ses projets PHP. C'est une tâche intéressante et formatrice, mais il est difficile d'obtenir le niveau de qualité et de sûreté que peut offrir un framework professionnel du marché. Si la construction d'un framework PHP vous intéresse, consultez le tutoriel Evoluer vers une architecture MVC en PHP. Ici, nous allons utiliser un framework existant plutôt que d'en construire un nous-même.

Frameworks full stack contre micro-frameworks

Au sein de l'écosystème des frameworks PHP, deux catégories coexistent. Les frameworks classiques comme Symfony ou Zend fournissent un très grand nombre de services (gestion avancée des formulaires, mapping objet-relationnel, etc.). Ces frameworks complexes imposent leur architecture au développeur. On les appelle des frameworks full stack.

L'autre catégorie de frameworks se concentre sur un ensemble réduit de services de base, et laisse au développeur beaucoup de liberté pour construire son application. On les appelle des micro-frameworks. Pour en découvrir certains, consultez cet article.

Et le vainqueur est...

Nous allons baser notre application web sur le micro-framework Silex. Ce choix d'un micro-framework plutôt que d'un framework full stack est bien entendu discutable. On pourra objecter qu'un framework comme Symfony est de plus en plus implanté en entreprise, et que les compétences associées sont de plus en plus recherchées. De plus, il existe beaucoup plus de documentation et d'exemples autour de Symfony qu'autour de Silex.

Malgré tout, j'ai choisi Silex pour les raisons suivantes :

  • Il est plus facile à prendre en main et moins intimidant que Symfony pour un développeur PHP peu expérimenté.

  • Il permet de bâtir petit à petit l'architecture de l'application en détaillant les changements à chaque étape.

  • Il est made in France et basé sur les mêmes composants que Symfony, ce qui facilitera une éventuelle évolution vers ce dernier. J'irais jusqu'à dire que Silex représente une excellente solution pour s'autoformer progressivement à Symfony.

Premiers pas avec Silex

Intégrer un framework à une application nécessite de savoir l'utiliser. Le cours OpenClassrooms Premiers pas avec le framework PHP Silex décrit en détail l'installation de Silex et la création d'une application Web minimaliste avec ce framework.

Réécriture de l'application avec Silex

Récupération de Silex via Composer

Afin de pouvoir récupérer les fichiers de Silex, créez dans le répertoireMicroCMS  servi par votre serveur web local un fichier texte nommécomposer.json ayant le contenu suivant.

{
    "require": {
        "silex/silex": "~2.0"
    }
}

Ouvrez une fenêtre de terminal et déplacez-vous dans le répertoireMicroCMS. 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. L'arborescence du projet est maintenant la suivante.

Arborescence du projet
Arborescence du projet

Mise à jour de l'arborescence

Créez dansMicroCMS  les sous-répertoires suivants :

  • app, qui contiendra la configuration de l'application Silex ;

  • db, qui contiendra les scripts SQL de création de la base de données ;

  • src, qui contiendra les fichiers source PHP ;

  • views, qui contiendra les vues de l'application ;

  • web, qui contiendra les fichiers accessibles aux clients web.

Déplacez le fichierview.php dans le sous-répertoireviews, puis déplacez le fichiermodel.php dans le sous-répertoiresrc. Déplacez ensuite les fichiersindex.php etmicrocms.css dans le sous-répertoireweb. Enfin, créez ou déplacez dans le sous-répertoire db les scripts SQLdatabase.sqlstructure.sql etcontent.sql.

Dans le sous-répertoireapp, créez un fichierroutes.php avec le contenu ci-dessous.

<?php

// Home page
$app->get('/', function () {
    require '../src/model.php';
    $articles = getArticles();

    ob_start();             // start buffering HTML output
    require '../views/view.php';
    $view = ob_get_clean(); // assign HTML output to $view
    return $view;
});

Silex permet de définir des routes, c'est-à-dire des points d'entrée dans l'application. À chaque route est associée une réponse construite par notre code. La route ci-dessus correspond à l'URL racine de l'application (/). La fonction anonyme associée à cette route utilise la fonctiongetArticles définie dans le fichier model.php pour récupérer la liste des articles.

Chaque contrôleur Silex doit renvoyer explicitement une réponse. Les fonctions PHP ob_start et ob_get_clean permettent de récupérer le résultat de l'appel à require '../views/view.php' (autrement dit la vue HTML générée) dans une variable nommée$view. Cette variable est renvoyée par le contrôleur.

Éditezindex.php et remplacez son contenu par le code source ci-dessous.

<?php

require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

// enable the debug mode
$app['debug'] = true;

require __DIR__.'/../app/routes.php';

$app->run();

Ce fichier constitue le contrôleur frontal de notre application web. Il centralise la gestion des requêtes HTTP entrantes. Dans ce fichier, on instancie l'objet Silex principal$app, on active les informations de débogage puis on inclut la définition des routes de l'application (fichierroutes.php).‌

Toujours dansweb, créez un nouveau fichier texte nommé.htaccess contenant le texte ci-dessous. Ce fichier permet de configurer le serveur web Apache pour rediriger toutes les requêtes entrantes versindex.php.

# Redirect incoming URLs to index.php
<IfModule mod_rewrite.c>
    Options -MultiViews

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

 

Voici l'arborescence obtenue après tous ces changements (les fichiers commençant par.  ne sont pas affichés).

Arborescence du projet
Arborescence du projet

Définition d'un hôte virtuel

Enfin, il nous reste à configurer un hôte virtuel afin que l'application puisse répondre à une URL de la forme http://microcms. En suivant l'exemple donné dans le cours Premiers pas avec le framework PHP Silex, éditez le fichier de configuration Apachehttpd-vhosts.conf et ajoutez le contenu ci-après en adaptant les lignes commençant parDocumentRoot etDirectory à votre configuration locale. Voici un exemple de configuration avec XAMPP sous Windows.

<VirtualHost *:80>
    DocumentRoot "C:\xampp\htdocs\MicroCMS\web"
    ServerName microcms
    <Directory "C:\xampp\htdocs\MicroCMS\web">
        AllowOverride All
    </Directory>
</VirtualHost>

Redémarrez le serveur web Apache pour terminer la configuration de l'hôte virtuel. À ce stade, une requête HTTP vers http://microcms doit afficher correctement la liste des articles.

Le code source associé à cette itération est disponible sur une branche du dépôt GitHub

Bilan

Nous avons refactorisé notre application web pour intégrer le framework Silex et posé les bases d'une architecture robuste. Cependant, notre application profite encore peu des services que Silex peut fournir. Les prochaines itérations y remédieront.

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