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();