basecom · wir sprechen internet 2 Christian Flothmann Software-Entwickler bei basecom in Osnabrück - Symfony Core Team - Symfony Documentation Team - Co-Maintainer FOSRestBundle @xabbuh
basecom · wir sprechen internet 4 • Routengenerierung • Dekodierung von Requestdaten (JSON, XML, etc.) • Content-Negotiation • Serialisierung von Daten für HTTP-Response Tools für
basecom · wir sprechen internet 6 • gewachsene Codebasis • existierende Extension-Points • PHP 5.3 • Symfony 2.3 • aufwändig neue Features zu implementieren
basecom · wir sprechen internet 8 • Code Cleanup • Container-Klassenparameter entfernt • DI statt Service Locator • Update auf willdurand/negotiation 2.0 • Symfony >= 2.7, PHP >= 5.5.9 • ParamFetcher und Exception-Handling überarbeitet Neu in 2.0
basecom · wir sprechen internet 13 FOSRestBundle 1.7 namespace AppBundle\Controller; use FOS\RestBundle\Controller\Annotations\Route; class UserController { /** * @Route("/users/{id}", methods={"LOCK"}) */ public function lockUserAction($id) { } }
basecom · wir sprechen internet 22 • Abstraktionslayer • Adapter für Symfony Serializer JMS Serializer • Extension-Point für eigene Adapter • Type-Hinting möglich Serializer API
basecom · wir sprechen internet 28 2.0: Trait namespace AppBundle\Controller; use FOS\RestBundle\Controller\ControllerTrait; use Symfony\Component\HttpFoundation\Response; class PostController { use ControllerTrait; public function getPostAction($id) { if (null === $post = $this->findPost($id)) { $view = $this->view(null, Response::HTTP_NOT_FOUND); } else { $view = $this->view($post); } return $this->handleView($view); } }
basecom · wir sprechen internet 30 1.7: URI namespace AppBundle\Controller\Api\V1; use FOS\RestBundle\Controller\Annotations\NamePrefix; /** * @NamePrefix("api_article_v1_") */ class ArticleController { // ... }
basecom · wir sprechen internet 31 1.7: URI namespace AppBundle\Controller\Api\V2; use FOS\RestBundle\Controller\Annotations\NamePrefix; /** * @NamePrefix("api_article_v2_") */ class ArticleController { // ... }
basecom · wir sprechen internet 33 1.7: URI $ php app/console debug:router ------------------------------- -------- -------- ------ ----------------------------- Name Method Scheme Host Path ------------------------------- -------- -------- ------ ----------------------------- api_article_v1_get_articles GET ANY ANY /v1/articles.{_format} api_article_v1_get_article GET ANY ANY /v1/articles/{id}.{_format} api_article_v1_post_article POST ANY ANY /v1/articles.{_format} api_article_v1_put_article PUT ANY ANY /v1/articles/{id}.{_format} api_article_v1_delete_article DELETE ANY ANY /v1/articles/{id}.{_format} api_article_v2_get_articles GET ANY ANY /v2/articles.{_format} api_article_v2_get_article GET ANY ANY /v2/articles/{id}.{_format} api_article_v2_post_article POST ANY ANY /v2/articles.{_format} api_article_v2_put_article PUT ANY ANY /v2/articles/{id}.{_format} api_article_v2_delete_article DELETE ANY ANY /v2/articles/{id}.{_format} ------------------------------- -------- -------- ------ -----------------------------
basecom · wir sprechen internet 34 2.0: Query-Parameter fos_rest: versioning: enabled: true resolvers: query: enabled: true parameter_name: version GET /articles?version=v2
basecom · wir sprechen internet 40 Versionsabhängige Controller namespace AppBundle\Controller; use Symfony\Component\HttpFoundation\Request; class ArticleController { public function getArticlesAction(Request $request) { if ($request->attributes->get('version', 'v1') === 'v2') { // v2-spezifischer Code } // ... } }
basecom · wir sprechen internet 43 • Trennung von API und „normaler“ Anwendung • Definition von „REST-Zonen“ anhand von Request-Attributen URI-Pfad Host HTTP-Methode IP-Adressen REST-Zonen
basecom · wir sprechen internet 48 • 2.0 nicht vollständig abwärtskompatibel • Vorbild: Symfony 2.8/3.0 • 1.8 Release zeitgleich mit 2.0 • abwärtskompatible Features in 1.8 • Deprecations für BC-Breaks Upgrade-Pfad