Date post: | 21-Jan-2018 |
Category: |
Software |
Upload: | martin-hujer |
View: | 333 times |
Download: | 0 times |
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