symfony2 & l'architecture rest
DESCRIPTION
TRANSCRIPT
Symfony2 & L’architecture RESTMeilleurs pratiques
Ghali Ahmed formateur Symfony2
ghaliano2005
ghaliano2005
Gérant de BesmartUne société qui developpe des applications autour de
symfony2
ghaliano2005
Développeur de la plate-forme de pétitionwww.wesign.it
http://developers.google.com/apis-explorer/
http://developer.yahoo.com/
http://developers.pinterest.com/
“un style d’architecture pour les systèmes hypermédia distribués, créé par Roy Fielding
en 2000 dans le chapitre 5 de sa thèse de doctorat.”
REpresentational State Transfert
Transfert de la représentation “sans état” d’une ressource
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
serveurOn 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
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
GET /book/1 HTTP/1.0Host: fr.wikipedia.orgContent-Type: application/json
La requette (Request)
REST #1: client-serveur
Statut de la réponse
l’entête : taille de la réponse en octet
Version du protocole http
HTTP/1.0 200 OKContent-Type : text/HTML Content-Length : 1245 ….
“Le contenu de la page wiki de symfony”
La réponse (Response)
“” Le contenu de la réponse
Le type de media (mime type)
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 404 (Not Found).
DELETE 200 (OK). 404 (Not Found), si l’identifiant introuvable ou invalide.
Les verbes HTTP populaires
REST: #2( requette sans sauvegarde d’état )
REST: #3Mise en cache
REST: #4
Une interface uniforme
L'identification des ressources représentations Un message auto-
descriptif
Hypermédia comme moteur
d'état de l'application
REST: #5Systême hiérarchisé par couche
REST: #6Code 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 & symfony2Un framework conçue autour du protocole http
Request
<?php…use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;
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 & symfony2REST 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
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
Préparer l’environnement
REST & symfony2#/app/config/config.ymlfos_rest:
param_fetcher_listener: forcebody_listener: trueformat_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
Configurer FOSRestBundle
REST & symfony2
#/app/config/routing.yml
symfony_tn_book:
resource: "@SymfonyTNBookBundle/Controller/"
type: rest
prefix: /api/
Configurer FOSRestBundle
REST & symfony2<?phpnamespace SymfonyTN\BookBundle\Controller;
use FOS\RestBundle\Controller\FOSRestController as Controller;use FOS\RestBundle\Controller\Annotations\View;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
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 utileshttp://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://tools.ietf.org/html/rfc2616http://opikanoba.org/tr/fielding/rest/http://symfony.com/fr/doc/2.3/book/http_fundamentals.htmlhttps://github.com/FriendsOfSymfony/FOSRestBundlehttp://jmsyst.com/bundles/JMSSerializerBundlehttps://github.com/nelmio/NelmioApiDocBundle
Merci pour ce merveilleux moment partagé ensemble