Symfony2 & l'architecture Rest

Preview:

DESCRIPTION

 

Citation preview

Symfony2 & L’architecture RESTMeilleurs pratiques

Ghali Ahmed formateur Symfony2

ghaliano2005

ghaliano2005@gmail.com

ghaliano2005

ghaliano2005@gmail.com

Gérant de BesmartUne société qui developpe des applications autour de

symfony2

ghaliano2005

ghaliano2005@gmail.com

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

Merci pour ce merveilleux moment partagé ensemble

Recommended