Jak děláme REST API na Symfony v Lavito.cz

Post on 21-Jan-2018

333 views 0 download

transcript

Jak děláme REST API na Symfony v Lavito.cz

Martin Hujer

@MartinHujer

Symfonisti 27. 6. 2016

• REST API na Symfony

• ReactJS frontend

Program přednášky

• Udělat CRUD na uživatele

• Vylepšit CRUD na uživatele

Výchozí stav

• Prázdná Symfony aplikace

FOSRestBundle

• https://github.com/FriendsOfSymfony/FOSRestBundle

> composer require friendsofsymfony/rest-bundle

// AppKernel.php

new FOS\RestBundle\FOSRestBundle(),

JMSSerializerBundle

• https://github.com/schmittjoh/JMSSerializerBundle

> composer require jms/serializer-bundle

// AppKernel.php

new JMS\SerializerBundle\JMSSerializerBundle(),

Verzování API

Prefix: /api/v1/

https://www.troyhunt.com/your-api-versioning-is-wrong-which-is/

Výpis uživatelů

• Dědíme od

FOSRestController

• HTTP metody definujeme v docblocku:

/**

* @Get("/users")

*/

Detail uživatele

UserResponseFactory

• Vyhodíme duplicitní kód

• Jde ji sdílet napříč controllery

deleteUserAction()

• Může vyhodit výjimku

• V API nechceme vrátit HTML chybu

• budeme poslouchat na kernel exception

http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html

UserRequest + deserializace

• http://symfony.com/doc/current/bundles/FOSRestBundle/request_body_converter_listener.html

Validace UserRequest

• Proč request a ne rovnou entitu?

Validace lépe?

• Deserializaci a validaci by bylo fajn dělat mimo controller

• Teď používáme to, co nabízí FOSRest + JMS

• Ale není problém napsat svoji deserializaci a validaci, které nespustíaction, pokud data nebudou validní

Hezčí error handling

Co dál?

• Nemáme model, skoro všechno je v controlleru• Lepší: https://www.zdrojak.cz/clanky/architektura-aplikace-nad-doctrine-2/

• Není ošetřených spoustu edge case

• Mohli bychom mít controllery a API věci pohromadě• Jen se to musí nastavit (souvisí s controller as a service)

UUID FTW! 👍

• Autoincrement 👎

• UUID - kompletní entity, unikátní napříč vším

• https://github.com/ramsey/uuid

• https://github.com/ramsey/uuid-doctrine

• https://github.com/mhujer/jms-serializer-uuid

• https://github.com/mhujer/jms-serializer-uuid-bundle

Zdrojové kódy na Githubu

• https://github.com/mhujer/symfonisti-2016-06-27-api-demo

Díky za pozornost!

@MartinHujer

www.MartinHujer.cz