Le microframework Silex

Nous allons à présent utiliser le microframework PHP Silex dont le système de routage est très simple. Le développement a été arrété depuis la version 4 du Framework Symfony qui comporte plus de modularité avec flex et qui peut notamment s’utiliser comme microframework, comme nous le verrons ensuite.

La documentation de Silex se trouve sur le site Silex

Installation et configuration Silex

Vous pouvez installer Silex avec :

composer require silex/silex

Vous aurez un avertissement indiquant que le développement de Silex a été stoppé. Il n’est pas nécessaire de faire ce tuto, vous pouvez juste regarder comment était fait le routage de Silex et parcourir les exemples rapidement.

Indication

composer permet d’installer des centaines de packages librement disponibles. On les trouve sur Packagist .

Si on utilise le serveur Web Apache, ajouter le fichier .htaccess suivant au répertoire silex qui va contenir notre app :

FallbackResource ~/login/silex/index.php
RewriteBase /~login/silex

Routage avec Silex

Installez le fichier index.php dans le dossier silex pour assurer un routage simple.

<?php
    require_once __DIR__.'/vendor/autoload.php';
    $app = new Silex\Application();
    $app['debug']=true;
    $app->get('/', function (){
        return 'Bonjour le Monde !';
    });

    $app->get('/hello/{name}', function ($name) use ($app) {
        return 'Hello '.$app->escape($name);
    });

    $app->run();

Comme vous pouvez le constater, le routage avec Silex est assez simple et agréable à utiliser. Ajoutons une route contact qui va renvoyer la liste de tous les amis.

<?php
 $amis = array(
    1 => array(
       'NAISSANCE'      => '2000-03-29',
       'NOM'    => 'DOE',
       'PRENOM'     => 'CALVIN',
       'VILLE'      => 'Honolulu',
    ),
    2 => array(
       'NAISSANCE'      => '1992-05-27',
       'NOM'    => 'Yoyo',
       'PRENOM'     => 'Albert',
       'VILLE'      => 'Orleans',
    ),
  );

 $app->get('/contact', function () use ($amis) {
    $content = '';
    foreach ($amis as $ami) {
       $content .= $ami['PRENOM'].'  ';
       $content .= $ami['NOM'].' ';
       $content .= $ami['VILLE'].' ';
       $content .= '<br />';
    }

   return $content;
 });

ou l’equivalent avec interrogation de la base de données.

Pour une route avec paramètre

<?php

 $app->get('/contact/{id}',
 function (Silex\Application $app, $id) use ($amis) {
    if (!isset($amis[$id])) {
        $app->abort(404, "Le contact $id n'existe pas !");
    }

    $ami = $amis[$id];

    return  "<h1>{$ami['NOM']}</h1>".
            "<p>{$ami['VILLE']}</p>".
            "<p>{$ami['NAISSANCE']}</p>";
 });

Et on peut également traiter les requêtes POST, PUT, DELETE avec Silex.

CARNET avec Silex

Reprenons notre petit MVC pour en assurer le routage avec Silex. Assurons d’abord la récupération des données:

<?php
//modele.php
 require("connect.php");

 function connect_db(){
    $dsn="mysql:dbname=".BASE.";host=".SERVER;
        try{
        $connexion=new PDO($dsn,USER,PASSWD,
            array(PDO::ATTR_PERSISTENT =>true)
            );
        }
        catch(PDOException $e){
        printf("Échec de la connexion : %s\n", $e->getMessage());
        exit();
        }
    return $connexion;
    }

 function get_all_friends(){
    $connexion=connect_db();
    $amis=Array();
    $sql="SELECT * from CARNET";
    $data=$connexion->query($sql);
    while($pers=$data->fetch(PDO::FETCH_ASSOC)){
        $amis[] = $pers;
    }
    return $amis;
 }

Puis construisons un fichier index.php qui fera office de contrôleur principal:

Contrôleur principal

<?php
// index.php
require_once __DIR__.'/vendor/autoload.php';
require_once 'modele.php';

$app = new Silex\Application();
$app['debug']=true;

$app->get('/contact', function () {
   $content ='<ul>';
   $amis=get_all_friends();
   foreach ($amis as $ami){
       $content.='<li>'.$ami['NOM'].'</li>';
   }
   $content.='</ul>';
   return $content;
});


$app->get('/api/contact', function () {
   $amis=get_all_friends();
   return json_encode($amis);
});

Nous proposons ainsi 2 routes :

  • /contact qui est destinée à être vue sur un navigateur

  • /api/contact qui constitue le début de la mise en place d’un service REST

Nous allons maitenant proposer une troisième route qui renverra tous les contacts en XML.

Service XML

<?php
    require_once __DIR__.'/vendor/autoload.php';
    require "modele.php";

    use Symfony\Component\HttpFoundation\Response;
    $app = new Silex\Application();
    $app['debug'] = true;
    $app->get('/contactXML', function(Request $request) use($app, $carnet) {
    $amis = get_all_friends();
    if (!$amis) $app->abort(404, "Contacts inexistants");
    else {
        $xml = new XMLWriter();
        $xml->openMemory();
        $xml->startElement('mescontacts');
        foreach ($amis as $pers){
            $xml->startElement('contact');
            $xml->writeAttribute('id', $pers['ID']);
            $xml->writeElement('prenom',$pers['PRENOM']);
            $xml->writeElement('nom',$pers['NOM']);
            $xml->writeElement('naissance',$pers['NAISSANCE']);
            $xml->endElement();
        }
        $xml->endElement();
        return new Response(
            $xml->outputMemory(),
            200,
            ['Content-Type' => 'text/xml']
            );
        }
    });

$app->run();