Symfony2 & L’architecture REST
Meilleurs pratiques
ghaliano2005@gmail.com

ghaliano2005

Ghali Ahmed
formateur Symfony2
ghaliano2005@gmail.com

ghaliano2005

Gérant de Besmart
Une société qui developpe des applications autour de
symfony2
ghaliano2005@gmail.com

ghaliano2005

Développeur de la plate-forme de pétition
www.wesign.it
http://developers.google.com/apis-explorer/

http://developer.yahoo.com/

http://developers.pinterest.com/
REpresentational State Transfert
“un style d’architecture pour les systèmes hypermédia distribués, créé par Roy Fielding
Transfert de la représentation “sans état” d’une ressource
en 2000 dans le chapitre 5 de sa thèse de doctorat.”
REST est un style d’architecture d’application
REST n’impose pas un pattern (mvc, poo, ..)
ou un langage de programmation
Avec REST, on parle de la (les)
Représentation(s) d’une ressource
Mais c’est quoi une ressource ?

Hmm, et c’est quoi
une ressource ?
Une ressource est “un media” identifié &
accessible à travers une URI enregistré sur un
serveur
On parle de ressource physique ou abstraite
Exemple de ressource:

●
●
●
●
●
●
●

Une image
Une vidéo
Un fichier pdf
Une ligne dans la base de donnée
le résultat d’un match de foot
le derniers billet d’un blog
…..
REST impose des Contraintes d'architecture
REST #1: client-serveur
La requette (Request)

GET /book/1 HTTP/1.0
Host: fr.wikipedia.org
Content-Type: application/json

Verbe http
L’URI de la ressource
l’entête la plus importante: l’adresse du serveur
Version du protocole http
Le mime type de la requête
REST #1: client-serveur
La réponse (Response)

HTTP/1.0 200 OK
Content-Type : text/HTML
Content-Length : 1245
….

Statut de la réponse
Le type de media (mime type)
l’entête : taille de la réponse en octet
Version du protocole http

“Le contenu de la page wiki de
symfony”

“” Le contenu de la réponse
Les verbes HTTP populaires
GET

200 (OK). 404 (Not Found), si l’identifiant introuvable ou invalide.

PUT

200 (OK) or 204 (No Content). 404 (Not Found), si l’identifiant introuvable ou invalide

POST
DELETE

404 (Not Found).
200 (OK). 404 (Not Found), si l’identifiant introuvable ou invalide.
REST: #2
( requette sans sauvegarde d’état )
REST: #3
Mise en cache
REST: #4
Une interface uniforme

L'identification
des ressources

représentations

Un message autodescriptif

Hypermédia
comme moteur
d'état de
l'application
REST: #5
Systême hiérarchisé par couche
REST: #6
Code on demande (optional)
REST & symfony2
REST & php natif
$uri = $_SERVER['REQUEST_URI'];
$title = $_GET['title'];
headr('Content-type: text/html');
echo 'L'URI demandée est: ' . $uri;
echo 'La valeur du paramètre "title" est: ' . $title;
REST & symfony2

Request

Un framework conçue autour du protocole http

<?php
…
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;

class BookController extends Controller
{
public function getBooksAction()
{
$request = Request::createFromGlobals();
$request->query->get('title');
$request->headers->get('content_type');
$request->getMethod();
$response = new Response();
$response->setContent
('<html><body><h1>Voici une liste de
livre</h1></body></html>');
$response->setStatusCode(200);
$response->headers->set('Content-Type',
'text/html');
$response->send();
}

Request access

Response manipulation
REST & symfony2
REST recommandation:
Architecturer les URI (les identifiants des ressources)
avant de commencer le développement
Fonctionnalité

HTTP Verb

URI

Afficher tous les livres

GET

http://gestbook.com/books

Afficher un livre

GET

http://gestbook.com/book/1

Modifier un livre

POST

http://gestbook.com/book/1

Supprimer un livre

DELETE

http://gestbook.com/book/1
REST & symfony2
Préparer l’environnement

1.

composer create-project symfony/framework-standard-edition rest 2.3.0

2.

composer require friendsofsymfony/rest-bundle @stable

3.

composer require jms/serializer-bundle @stable

4.

composer require nelmio/api-doc-bundle @stable

5.

Activer les bundles dans /app/AppKernel.php
REST & symfony2
Configurer FOSRestBundle
#/app/config/config.yml
fos_rest:
param_fetcher_listener: force
body_listener: true
format_listener:
rules:
- { path: '^/api/', priorities: ['xml', 'json'], fallback_format: json, prefer_extension: false }
- { path: '^/image', priorities: ['jpeg', 'gif'], fallback_format: false, prefer_extension: true }
- { path: '^/admin', priorities: [ 'xml', 'html'], fallback_format: ~, prefer_extension: false }
- { path: '^/', priorities: [ 'html', '*/*'], fallback_format: html, prefer_extension: true }
view:
view_response_listener: true
REST & symfony2
Configurer FOSRestBundle

#/app/config/routing.yml
symfony_tn_book:
resource: "@SymfonyTNBookBundle/Controller/"
type:

rest

prefix: /api/
REST & symfony2
<?php
namespace SymfonyTNBookBundleController;
use FOSRestBundleControllerFOSRestController as Controller;
use FOSRestBundleControllerAnnotationsView;
use SensioBundleFrameworkExtraBundleConfigurationMethod;
class BooksController extends Controller
{
/**
* @View
* @Route("/ebooks", defaults={"_format" = "json"})
*/
public function getBooksAction()
{
return ['name' => 'symfony-tn'];
}
}

Un simple controlleur utilisant les
helpers FosRest
Liens utiles
http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol
http://tools.ietf.org/html/rfc2616
http://opikanoba.org/tr/fielding/rest/
http://symfony.com/fr/doc/2.3/book/http_fundamentals.html
https://github.com/FriendsOfSymfony/FOSRestBundle
http://jmsyst.com/bundles/JMSSerializerBundle
https://github.com/nelmio/NelmioApiDocBundle
Merci pour ce merveilleux moment
partagé ensemble

Symfony2 & l'architecture Rest