restful avec symfony 1 et symfony2

76
Symfony Day – 4. Juni 2009 Clever Age | Xavier Lacot RESTful avec symfony et Symfony2 Damien Alexandre, Xavier Lacot – 03 mars 2011

Upload: xavier-lacot

Post on 21-May-2015

30.341 views

Category:

Technology


1 download

DESCRIPTION

These slides describe how symfony 1 and Symfony2 are RESTful frameworks, and ho to implement RESTful web services in both. The talk was given during Symfony Live 2011 Paris. For more informations, please see http://symfpony-project.org/

TRANSCRIPT

  • 1. RESTful avec symfony et Symfony2Damien Alexandre, Xavier Lacot 03 mars 2011Symfony Day 4. Juni 2009Clever Age | Xavier Lacot

2. Clever Age Cration en 2001 Paris par des managers expriments Plusieurs agences en France :Paris BordeauxLyon Nantes Valeurs fondatrices : Indpendance, Veille technologique,ConvictionQuelques chiffres :CA 2009 : 6 MEffectif au 01/03/2011 : 90 personnesNotre Mission : Concevoir des systmes informatiques flexibles enlimitant la dpendance vis--vis des prestataires et des diteurs RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 2 3. Qui sommes nous ? Damien : Spcialiste Web full stack Plusieurs contributions, notamment symfony Expert technique PHP chez Clever Age leveur de poneys http://twitter.com/damienalexandre Xavier : Expert Frameworks, dveloppeur symfony depuis fin 2005 Plusieurs contributions (plugins, doc, patches, etc.) Leader PHP chez Clever Age + en charge du ple dexpertise Vice-prsident de lAFUP http://twitter.com/xavierlacotRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot3 4. Sommaire 2 ou 3 rappels sur RESTsymfony, un framework RESTFul Et dans Symfony2 ?howtobenchmarks Autour de Symfony Plugins et BundlesRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 4 5. 2 ou 3 rappels sur RESTRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot5 6. 2 ou 3 rappels sur REST Dveloppement dAPIs : de nombreux cas dutilisation :favoriser linteroprabilitcontextes rpartisplusieurs applications diffrentesplusieurs langagesexposer un rfrentiel de donnesexposer des donnes publiques (OpenData, etc.)RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot6 7. 2 ou 3 rappels sur REST Un service WebUn fournisseur (le service )Un agent (le client ) requteclient service rponseRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot7 8. REST et SOAP sont sur un bateau RESTRepresentational state transferexposition de ressources"colle" HTTPsimple et comprhensible WS-*SOAP + WSDLapproche plus standardiseplus verbeuxmoins adapt la description de ressourcesRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot8 9. De lutilisation dHTTP avec REST REST != HTTP mais REST new-forest Magic Pony => magic-pony GET http://domain.tld/pony/new-forest.xmlou GET http://domain.tld/pony/8.xml Le routing dcide.RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 17 18. Le routing dans symfony 1 grer le plan dadressage dune application symfonyjolies urlsobfuscation des technos employesvalidation des paramtres passsdcoupler les urls exposes de lorganisation interne du projet routing.yml plusieurs classes de routingsfRequestRoute / sfPatternRoute / sfRouteCollectionsfDoctrineRoute / sfDoctrineRouteCollectionetc...RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 18 19. sfDoctrineRoute routing.yml pony_show: url: /pony/:slug.:sf_format param: { module: pony, action: show, sf_format: xml } class: sfDoctrineRoute options: { model: Pony, column: slug, type: object } requirements: { sf_method: GET, sf_format: (xml|json|yml) } actions.class.php public function executeShow(sfWebRequest $request) { $pony = $this->getRoute()->getObject(); // etc. }RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot19 20. Routing et format sf_format est html par dfaut pony_show: url: /pony/:slug.:sf_format param: { module: pony, action: show, sf_format: xml } class: sfDoctrineRoute options: { model: Pony, column: slug, type: object } requirements: { sf_method: GET, sf_format: (xml|json|yml) } actions.class.php public function executeShow(sfWebRequest $request) { $format = $request->getRequestFormat(); // etc. }RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot20 21. Les formats GET http://domain/pony/new-forest.xmlNew Foresthttp://www.feracheval.com/nvxsite/newforest.jpgLe poney New-Forest...new-forestRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 21 22. Les formats GET http://domain/pony/new-forest.json{"name": "New Forest","picture_url": "http://www.feracheval.com/nvxsite/newforest.jpg","description": "Le poney New-Forest...","slug": "new-forest"}RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 22 23. Format et template Le template utilis change suivant sf_format :html => showSuccess.phpxml => showSuccess.xml.phpjson => showSuccess.json.php Content-Type automatique pour les formats suivants :txt, js, css, json, xml, rdf, atom. Exemple :GET http://domain/pony/connemara.jsonContent-Type: application/jsonRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 23 24. Format et template showSuccess.json.php { "name": , "picture_url": , "description": , "slug": } Bon courage pour les listes dobjets...RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot24 25. RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot25 26. Format sans template Sans template, on spcifie le Content-Type la main :$format = $request->getRequestFormat();$this->getResponse()->setContentType( $request->getMimeType($format));return sfView::NONE; La solution consiste employer un Serializer... Pas de serializer dans symfony 1 Pas de serializer XML dans Zend Doctrine peut le faire pour vous :$this->getResponse()->setContent( $query->execute()->exportTo($format));RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 26 27. Format sans template Le cas particulier de json...$this->getResponse()->setContent( json_encode($pony->toArray())); facile plus rapide (natif) criture compacte (moins verbeux que XML)Cool pour la bande passante Javascript compliantRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot27 28. Validation des paramtres Exposer une interface = ncessit de valider les entresen GET : valider les restrictionshttp://api.domain.tld/pony.json?country=franceque doit faire lAPI sur un appel lurl suivante ?http://api.domain.tld/pony.json?speaks=german en criture (POST / PUT) :valider la prsence du payload (HTTP content)format attenducontenu du payloadRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 28 29. Validation des paramtres symfony 1 offre une srie complte de validateursEmailUrlDateetc.public function executeShow(sfWebRequest $request){$name = $request->getParameter(name);$validator = new sfValidatorString(array(required => true));// throws an exception if not valid$cleaned = $validator->clean($name)// etc.}RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 29 30. REST en haute Scurit Plusieurs approches de la scurit :qui a accs (authentification) ? quel rythme / frquence (throttling) ? Authentification :approche nave par preExecuteapproche OAuth Throttlingaidez vous dApache mod_cband http://codee.pl/cband.htmlRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot30 31. Authentification dAPI par api_key ajout dun paramtre chaque requtedans lurlou en header http approche dite "nave" :pas trs scurise (man in the middle = le secret est connu)mode dauthentification persistant dans le temps (clcompromise changement de cl)RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot31 32. Authentification dAPI par api_keyclass ponyApiActions extends sfActions{public function preExecute(){$request = $this->getRequest();$key = $request->getParameter(ApiKey);if (!Doctrine::getTable(ApiKey)->findOneByApiKey($key)){ $this->getResponse()->setStatusCode(401); throw new sfException(Invalid authentication credentials.);}}// etc}RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot32 33. Authentification dAPI par OAuth OAuth :plus robuste et rassurantplus long mettre en placeprotocole adapt la gestion de lauthentification sur APIsRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot33 34. Authentification dAPI par OAuth redirection vers page de loginApplicationcliente rponse (code) Passage du code APIgetToken (code) RESTrponse (token)Applicationserveur appel de lAPI (token) rponse (donne demande)RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot34 35. Gestion du cache Du cache sur une API ? Oui, mme de courte dure cache.ymldefault:enabled: truewith_layout: truelifetime:120 # 2 minutes cache settings.ymlprod:.settings:cache: trueRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot35 36. Gestion du cache Bootstrap = config, plugins, config BDD, routing,autoloading, session...RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 36 37. Gestion du cache Invalidation du cacheif ($cache = $this->getContext()->getViewCacheManager()){$cache->remove(pony/index);$cache->remove(pony/show?slug=.$slug);}RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 37 38. Et avec Symfony2 ?RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 38 39. Pony2, des poneys en Doctrine2 entit Doctrine2 = modle Doctrine 1 dfinition du schma en PHP, yml ou XML aussi possible laide des annotations pas dhritage de Doctrine_Record : src/CleverAge/SymfponyBundle/Entity/Pony.php class Pony { protected$id; protected$name; protected$picture_url; protected$description; protected$slug; }RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 39 40. Pony2, des poneys en Doctrine2 les annotations permettent dindiquer Doctrine commentpersister les donnes /** * @orm:Table(name="pony") * @orm:Entity */ class Pony {/** * @orm:Column(name="id", type="integer") * @orm:Id * @orm:GeneratedValue(strategy="IDENTITY") */protected $id; /*** @orm:Column(name="name", type="string", length=110)*/ protected $name; // etc.RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot40 41. Pony2 - Gnrer getter et setters $ php app/console doctrine:generate:entities CleverAgeSymfponyBundle Generating entities for "CleverAgeSymfponyBundle" > generating CleverAgeSymfponyBundleEntityPony /** * Get id * @return integer $id */ public function getId() {return $this->id; } /** * Set name * @param string $name */ public function setName($name) { $this->name = $name;RESTful avec symfony 1 et Symfony2 3 mars 2011 }Clever Age | Damien Alexandre, Xavier Lacot 41 42. Le routing avec Symfony2 app/config/routing.yml : symfpony: resource: "@CleverAgeSymfponyBundle/Resources/config/routing.yml" src/CleverAge/SymfponyBundle/Resources/config/routing.yml : pony_list: pattern:/pony.{_format} defaults: - _controller: CleverAgeSymfponyBundle:Default:index - _format: xml requirements: { _format: (xml|json), _method: GET }RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot42 43. Le routing avec Symfony2 Dumpable en RewriteRule Apache : $ php app/console router:dump-apache RewriteCond %{REQUEST_METHOD} ^(GET) [NC] RewriteCond %{PATH_INFO} ^/pony(?:.((xml|json)))?$ RewriteRule .* app.php [QSA,L,E=_ROUTING__route:pony_list,E=_ROUTING__format: %1,E=_ROUTING__controller:CleverAgeSymfponyBundleControllerDefaul tController::indexAction,E=_ROUTING__format:xml] RewriteCond %{REQUEST_METHOD} ^(GET) [NC] RewriteCond %{PATH_INFO} ^/pony/([a-z0-9-]+)(?:.((xml|json)))?$ RewriteRule .* app.php [QSA,L,E=_ROUTING__route:pony_show,E=_ROUTING_slug: %1,E=_ROUTING__format: %2,E=_ROUTING__controller:CleverAgeSymfponyBundleControllerDefaul tController::showAction,E=_ROUTING__format:xml] etc.RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 43 44. Le routing avec Symfony2Pas de sfDoctrineRoute :(pony_show:pattern:/pony/{slug}.{_format}Defaults:- _controller: CleverAgeSymfponyBundle:Default:show- _format: xmlrequirements: { _format: (xml|json), _method: GET, slug: "[a-z0-9-]+" }Mais FrameworkExtraBundle est l... http://bundles.symfony-reloaded.org/frameworkextrabundle/ ParamConverter FTW :/*** the Pony is automaticaly fetched by the ParamConverter.* @param Pony $pony* @param string $_format*/public function showAction(Pony $pony, $_format){RESTful avec symfony do Symfony2 3 mars 2011// 1 et what you want with $ponyClever Age | Damien Alexandre, Xavier Lacot 44} 45. Serializer component Finally !RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot45 46. Les normalizers Transformation ressource array CustomNormalizer normalize() et denormalize() sont implmentes sur lobjet GetSetMethodNormalizer inspecte les getters et les setters de lobjetRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot46 47. Les encodeurs Transformation array format JsonEncoder simple implmentation de json_encode XmlEncoder Utilisation de DOMDocument [insrer un format ici]Encoder Forkez moi !RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot47 48. Implmentation de CustomNormalizeruse SymfonyComponentSerializerNormalizerNormalizableInterface;use SymfonyComponentSerializerNormalizerNormalizerInterface;class Pony implements NormalizableInterface{function normalize(NormalizerInterface $normalizer, $format, $properties = null){return array(name => $this->getName(),picture_url => $this->getPictureUrl(),description => $this->getDescription(),slug => $this->getSlug(),);}// etc.}RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot48 49. Utilisation du Serializer$serializer = new SerializerSerializer();$serializer->addNormalizer(new SerializerNormalizerCustomNormalizer());$serializer->setEncoder(xml,new SerializerEncoderXmlEncoder());$serializer->encode($pony, xml);RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 49 50. Utilisation du Serializer New Forest http://www.feracheval.com/nvxsite/newforest.jpg Le poney New-Forest... new-forest $xmlEncoder = new SerializerEncoderXmlEncoder(); $xmlEncoder->setRootNodeName(Pony);RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 50 51. Validation des entres Comme avec symfony 1 :Ncessaire de valider les entresSymfony2 fournit toute une srie de validateursclasses tendant SymfonyComponentValidatorConstraintaussi complet que les validators symfony1 Doctrine2 ne fournit aucun validateur (par choix)RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot51 52. Dclaration des validateurs Format de dclaration des validateurs au choixYMLXMLPHPannotationsclass Pony{/** * @validation:NotBlank() * @validation:MinLength(3) */private $name;...}RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 52 53. Excution de la validation activer le service de validation # app/config/config.yml framework: validation: enabled: true valider dans le contrleur $validator = $container->get(validator); if (0 === count($validator->validate($pony))) { // persist the Pony }RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot53 54. Le cache dans Symfony2 Prsentation de Fabien demain 11h30Sujet majeur !Confrence pas trop ttConfrencier pas trop mauvais :-) Quelques dtails quand mme...RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot54 55. Cache HTTP Le cache est vrifi avant dinstancier le framework.gateway cache,ou reverse proxyRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot55 56. Cache HTTP Le cache est vrifi avant dinstancier le framework.gateway cache,ou reverse proxy ou ou Symfony2 HttpCacheRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot56 57. Expiration du cache HTTP$response = new Response();$response->setPublic();$response->setSharedMaxAge(600); Comme pour symfony1 mais sans invalidation.Impossible dinvalider programmatiquement le cachePossible de dfinir une dure de vieRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot57 58. Validation du cache HTTP$response = new Response();$response->setETag(md5(serialize($pony)));if ($response->isNotModified($request)){ return $response; // 304}else{$response->setContent( $this->getSerializer($_format) ->encode($pony, $_format));return $response;} Ressource expire ? Le meilleur des deux mondes. Etag modifi ?RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 58 59. Les trs ncessaires benchmarksRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot59 60. Mthodologie mme service Pony au format json :symfony 1 mode devsymfony 1 mode prod sans cachesymfony 1 mode prod avec cacheSymfony2 mode devSymfony2 mode prod sans cacheSymfony2 mode prod sans cache (format XML)Symfony2 mode prod avec cache HTTP (PHP) mmes fonctionnalits mesures faites laide de siege -http://www.joedog.org/index/siege-homeRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot60 61. Rsultats bruts Lecture :rel = rapport au moins performant,avg = requtes par seconde, en moyenne sur les 3 runsframework|rel |avg |1 |2 |3------------------------ | -------- | -------- | -------- | -------- | --------Symfony2Cache| 9.6251 | 373.87 | 369.49 | 373.75 | 378.36symfony1Cache| 2.2480 |87.32 |86.25 |87.78 |87.94Symfony2ProdJson | 1.7970 |69.80 |69.64 |70.71 |69.04Symfony2ProdXml| 1.6106 |62.56 |60.92 |62.73 |64.03symfony1Prod | 1.2769 |49.60 |48.41 |50.60 |49.80Symfony2Dev| 1.1467 |44.54 |43.43 |44.09 |46.09symfony1Dev| 1.0000 |38.84 |37.85 |40.90 |37.78RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 61 62. Commentaires Symfony2 + cache HTTP est4,5 fois plus performant que symfony 1 avec cache7 fois plus performant que Symfony2 en mode dev (avec profiler)10 fois plus que symfony 1 en mode dev Symfony2 sans cache : 40% de gains de perfs face symfony 1 le profiler Symfony2 est gnial mais couteux Prfrez json XML pour vos APIs Chiffres prendre avec prcautionFramework pas termin vs. Framework vieux de 5 ansAttention la configurationRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 62 63. Traces Xdebug et XHProfNos premiers tests : Symfony2 taitplus lent que symfony 1RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 63 64. Traces Xdebug et XHProf XdebugKudos Derick RethansSuper outil depuis 2002Traces exploitables par KcacheGrind ou WinCacheGrindhttp://www.xdebug.org/ XHProfFacebook, Mars 2009Trs pratique aussiInterface Web de consultation des tracesGraphes dexcution avec graphvizhttps://github.com/facebook/xhprofRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 64 65. Traces Xdebug et XHProf Vraiment ? Regardons la trace XHProfRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 65 66. Traces Xdebug et XHProf Annotations Doctrine parses chaque requte ! # app/config/config.yml doctrine: orm:metadata_cache_driver: apcRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 66 67. Traces Xdebug et XHProf Aprs :RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 67 68. Encore plus parlant avec XDebugRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 68 69. Encore plus parlant avec XDebugInterprtationde la QueryParsing desannotations Doctrine# app/config/config.ymldoctrine:orm: metadata_cache_driver: apcquery_cache_driver: apcRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 69 70. Memory usage memory_get_peak_usage() symfony 1 mode dev : 4 581 856 b symfony 1 mode prod sans cache : 4 282 944 b symfony 1 mode prod avec cache : 3 335 688 b Symfony2 mode dev : 3 567 632 b Symfony2 mode prod sans cache dannotations : 3 027 240 b Symfony2 mode prod sans cache HTTP : 2 800 600 b Symfony2 mode prod avec cache HTTP : 1 012 496 bRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 70 71. Autour de SymfonyRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot71 72. Des plugins pour symfony 1 sfDoctrineRestGeneratorPlugin :admin generator like (generator.yml)Serialization facile tendreValidation complexe mais puissant sfRestWebServicePlugin :Super-module Templatefacile mettre en place route api/*support de PUT hack (POST et sf_method=PUT)RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot72 73. Des bundles pour Symfony2 EverzetRestfulControllersBundlecration automatique des routes partir de noms dactionspas de lien avec le modle (actions dvelopper)https://github.com/everzet/EverzetRestfulControllersBundle# app/config/routing.ymlponys:type:restfulresource:CleverAgeSymfponyBundleControllerPonysController class PonysController extends Controller[GET]{ public function getPonyAction($slug)/pony/connemara{ // etc. }[POST]public function postPonysAction()/ponys{RESTful avec symfony 1 et Symfony2 3 mars 2011// etc.Clever Age | Damien Alexandre, Xavier Lacot}73 74. Pour conclure... REST cest bien. Et avec symfony cest facile. Avec Symfony2, cest encore mieux.http://symfpony-project.org/https://github.com/xavierlacot/symfpony-project.org https://github.com/xavierlacot/symfpony-benchmarkRESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot74 75. Time to REST Des questions ?RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot75 76. Rcompense des projets Web innovants HTML5 OpenData Mobilit etc. Appel candidatures : [email protected] Dtails sur http://awards.clever-age.com/RESTful avec symfony 1 et Symfony2 3 mars 2011Clever Age | Damien Alexandre, Xavier Lacot 76