SlideShare a Scribd company logo
1 of 52
Download to read offline
PSR-15 Middleware in Minutes
Zend Expressive
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
PSR-7: HTTP message interfaces
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
• abstrakce nad HTTP zprávami
• sada interfaců v PsrHttpMessage
• https://www.php-fig.org/psr/psr-7/
PSR-7: HTTP message interfaces
• MessageInterface
•RequestInterface
•ServerRequestInterface
•ResponseInterface
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
PSR-15: HTTP Server Request Handlers
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• Rozšiřuje PSR-7
• Zavádí:
• HTTP server request handler
• HTTP server middleware
• https://www.php-fig.org/psr/psr-15/
PSR-15: Request Handlers
• Zpracovává předaný request
• Vždy vrací response nebo vyhodí výjimku
• PsrHttpServerRequestHandlerInterface
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
PSR-15: Request Handlers
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
PSR-15: Middleware
• Zpracovává příchozí request a buď:
•Vrátí response
•Deleguje zpracování na další vrstvu
• PsrHttpServerMiddlewareInterface
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
PSR-15: Middleware
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
PSR-15: Middleware
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
PSR-15: Generating response
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
• Každý handler nebo middleware který
generuje odpověd by měl sestavit instanci
ResponseInterface nebo továrnu, která je
shopna ji vytvořit
PSR-15: Handling exceptions
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
• Existuje komponenta (middleware), která chytá
výjimky a převádí je na response
• Obaluje veškerý proces v aplikaci
PSR-15: Handling exceptions
Zend Expressive
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• Minimalistický PSR-15 PHP framework
• Umí nic a zároveň vše
• Snadno konfigurovatelný
• Průhledná a jednoduchá implementace
• https://docs.zendframework.com/zend-expressive/
Routing
• Expressive nenabízí žádný defaultní router
• Pouze adaptéry integrující nějakou implementace routeru
• Aura.Router
• FastRoute
• zend-mvc Router
• ZendExpressiveRouterRouterInterface
• integrujte si svůj vlastní router
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Routing
Dependency injection
• Expressive nenabízí žádný defaultní DI container
• PSR-11
•PsrContainerContainerInterface
• Opět tři základní balíčky
•zend-servicemanager
•pimple-interop
•aura.di
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Templating
• Expressive nenabízí žádný defaultní templatovací engine
• Vhodné na API
•Vracím pouze ZendDiactorosResponseJsonResponse
• Šablony použiju jenom když potřebuju
•ZendExpressiveTemplateTemplateRendererInterface
• Handlery a middleware nejsou závislé na konkrétním enginu
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Templating
Templating
• Plates
• Twig
• zend-view
Error handling
• Vyhazovat výjimky a mít vrstvu která je bude odchytávat
• Upravený PHP error_reporting
• ZendStratigilityMiddlewareErrorHandler
• Whoops error handler pro vývoj
• Detailní informace o chybě jako v Tracy
• Možnost konfigurace výstup (HTML, JSON)
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Piping
Co nám to umožňuje?
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• Vytvořit pěknou validaci a mapování requestů
• Možnost si snadno sestavit aplikaci pro:
•Jednoduché E2E testování
•Integraci do existující aplikace
Validace příchozích requestů
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• Kontrolovat data v requestu
• Standardizovaná odpověd API v případě chyby
• Mapovat data na pěkné DTO
Cíl
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Symfony Validator
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
A v případě nevalidních dat?
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Error response
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Výsledek
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Mapování přímo z routeru?
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• V definici routy určit mapovaný objekt
• Handler nebo middleware už by dostal rovnou objekt requestu
Definice typu requestu
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Použití v handleru
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Konfigurovatelný middleware
Testování
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• Unit testy na handlery
• E2E testy
•Spuštění celé aplikace bez posílání HTTP requestů díky PSR-7 abstrakci
Unit testy
E2E testy
• Poslat HTTP request a kontrolovat response
• Testuje navíc:
•zadefinované routy
•sestavení aplikace
•správně předané závislosti
•kombinaci jednotlivých komponent
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
E2E testy bez HTTP protokolu
• Využijeme abstrakce PSR-7
• PHPUnit
• Sestavíme aplikaci (instance Application)
•Předáme instanci ServerRequestInterface
•Spustíme aplikaci
•Zkontrolujeme vytvořenou instanci ResponseInterface
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Abstraktní TestCase třída
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Sestavení aplikace
Sestavení aplikace
Testovací databáze
Vytvoření requestu
Zaslání requestu
Rozbalení response
Výsledný test
FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
Zamyšlení na závěr
FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
• Soustředím se pouze na jeden oddělený problém
•Ostatní deleguji dál
• Framework je pouze obálka, která drží pohromadě jednotlivé komponenty
•Dispatcher handlerů
• Je MVC přežitek?
FB facebook.com/peckadesign TW @peckadesign
Děkuji za pozornost
Zend Expressive Jan Kadeřábek
https://github.com/jankaderabek/expressive-playground

More Related Content

More from PeckaDesign.cz

More from PeckaDesign.cz (20)

WebTop100 Case study MEGAPIXEL – Redesign spuštěný proti pravidlům
WebTop100 Case study MEGAPIXEL – Redesign spuštěný proti pravidlůmWebTop100 Case study MEGAPIXEL – Redesign spuštěný proti pravidlům
WebTop100 Case study MEGAPIXEL – Redesign spuštěný proti pravidlům
 
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
Péhápkaři v Pecce: Sbohem PeckaCI, vítej Github Actions – Jakub Englický –27....
 
Péhápkaři v Pecce: Podpora PHP8 v Kdyby/Redis a Kdyby/RabbitMQ – Václav Čevel...
Péhápkaři v Pecce: Podpora PHP8 v Kdyby/Redis a Kdyby/RabbitMQ – Václav Čevel...Péhápkaři v Pecce: Podpora PHP8 v Kdyby/Redis a Kdyby/RabbitMQ – Václav Čevel...
Péhápkaři v Pecce: Podpora PHP8 v Kdyby/Redis a Kdyby/RabbitMQ – Václav Čevel...
 
Péhápkaři v Pecce: Půl roku na cestách jako digitální nomád – Jan Kadeřábek –...
Péhápkaři v Pecce: Půl roku na cestách jako digitální nomád – Jan Kadeřábek –...Péhápkaři v Pecce: Půl roku na cestách jako digitální nomád – Jan Kadeřábek –...
Péhápkaři v Pecce: Půl roku na cestách jako digitální nomád – Jan Kadeřábek –...
 
Péhápkaři v Pecce: Vývoj vlastního 'ORM' – Václav Čevela – 20. 11. 2019
Péhápkaři v Pecce: Vývoj vlastního 'ORM' – Václav Čevela – 20. 11. 2019Péhápkaři v Pecce: Vývoj vlastního 'ORM' – Václav Čevela – 20. 11. 2019
Péhápkaři v Pecce: Vývoj vlastního 'ORM' – Václav Čevela – 20. 11. 2019
 
Tvorba nových vstupních stránek z pohledu SEO
Tvorba nových vstupních stránek z pohledu SEO Tvorba nových vstupních stránek z pohledu SEO
Tvorba nových vstupních stránek z pohledu SEO
 
Péhápkaři v Pecce: pd/forms – Petr Klobás – 16. 10. 2019
Péhápkaři v Pecce: pd/forms – Petr Klobás – 16. 10. 2019Péhápkaři v Pecce: pd/forms – Petr Klobás – 16. 10. 2019
Péhápkaři v Pecce: pd/forms – Petr Klobás – 16. 10. 2019
 
Péhápkaři v Pecce: Za hranicemi DateTime – Jiří Pudil – 16. 10. 2019
Péhápkaři v Pecce: Za hranicemi DateTime – Jiří Pudil – 16. 10. 2019Péhápkaři v Pecce: Za hranicemi DateTime – Jiří Pudil – 16. 10. 2019
Péhápkaři v Pecce: Za hranicemi DateTime – Jiří Pudil – 16. 10. 2019
 
Péhápkaři v Pecce: Úvod do monitoringu – Tomáš Kozák – 16. 10. 2019
Péhápkaři v Pecce: Úvod do monitoringu – Tomáš Kozák – 16. 10. 2019Péhápkaři v Pecce: Úvod do monitoringu – Tomáš Kozák – 16. 10. 2019
Péhápkaři v Pecce: Úvod do monitoringu – Tomáš Kozák – 16. 10. 2019
 
Asynchronní programování
Asynchronní programováníAsynchronní programování
Asynchronní programování
 
ElasticSearch Dump
ElasticSearch DumpElasticSearch Dump
ElasticSearch Dump
 
Péhápkaři v Pecce: Každodenní problémy s implementací Facebook Api – Marek Hu...
Péhápkaři v Pecce: Každodenní problémy s implementací Facebook Api – Marek Hu...Péhápkaři v Pecce: Každodenní problémy s implementací Facebook Api – Marek Hu...
Péhápkaři v Pecce: Každodenní problémy s implementací Facebook Api – Marek Hu...
 
Péhápkaři v Pecce: Čtyři hlavní příčiny dysfunkčních návyků v týmu – Michal A...
Péhápkaři v Pecce: Čtyři hlavní příčiny dysfunkčních návyků v týmu – Michal A...Péhápkaři v Pecce: Čtyři hlavní příčiny dysfunkčních návyků v týmu – Michal A...
Péhápkaři v Pecce: Čtyři hlavní příčiny dysfunkčních návyků v týmu – Michal A...
 
Péhápkaři v Pecce: Jak si lokálně spustit Travis CI Build – Jakub Englický – ...
Péhápkaři v Pecce: Jak si lokálně spustit Travis CI Build – Jakub Englický – ...Péhápkaři v Pecce: Jak si lokálně spustit Travis CI Build – Jakub Englický – ...
Péhápkaři v Pecce: Jak si lokálně spustit Travis CI Build – Jakub Englický – ...
 
Péhápkaři v Pecce: Jak jsme neposlali pull request do PHP – Milan Pála – 17. ...
Péhápkaři v Pecce: Jak jsme neposlali pull request do PHP – Milan Pála – 17. ...Péhápkaři v Pecce: Jak jsme neposlali pull request do PHP – Milan Pála – 17. ...
Péhápkaři v Pecce: Jak jsme neposlali pull request do PHP – Milan Pála – 17. ...
 
Péhápkaři v Pecce: Jak na bezpečnostní hlavičky – Marek Humpolík – 23. 1. 2019
Péhápkaři v Pecce: Jak na bezpečnostní hlavičky – Marek Humpolík – 23. 1. 2019Péhápkaři v Pecce: Jak na bezpečnostní hlavičky – Marek Humpolík – 23. 1. 2019
Péhápkaři v Pecce: Jak na bezpečnostní hlavičky – Marek Humpolík – 23. 1. 2019
 
PeckaAcademy - Zbožové srovnávače od A-Z - Petra Mariánková
PeckaAcademy - Zbožové srovnávače od A-Z - Petra MariánkováPeckaAcademy - Zbožové srovnávače od A-Z - Petra Mariánková
PeckaAcademy - Zbožové srovnávače od A-Z - Petra Mariánková
 
Péhápkaři v Pecce: A refactoring Journey – From Legacy to Laravel – Christ...
Péhápkaři v Pecce: A refactoring Journey – From Legacy to Laravel – Christ...Péhápkaři v Pecce: A refactoring Journey – From Legacy to Laravel – Christ...
Péhápkaři v Pecce: A refactoring Journey – From Legacy to Laravel – Christ...
 
Péhápkaři v Pecce: Validujte vstupní data pomocí objektů – Václav Čev...
Péhápkaři v Pecce: Validujte vstupní data pomocí objektů – Václav Čev...Péhápkaři v Pecce: Validujte vstupní data pomocí objektů – Václav Čev...
Péhápkaři v Pecce: Validujte vstupní data pomocí objektů – Václav Čev...
 
Péhápkaři v Pecce: PeckaDesign/Monitoring - Milan Pála- 17. 10. 2018
Péhápkaři v Pecce: PeckaDesign/Monitoring  - Milan Pála- 17. 10. 2018Péhápkaři v Pecce: PeckaDesign/Monitoring  - Milan Pála- 17. 10. 2018
Péhápkaři v Pecce: PeckaDesign/Monitoring - Milan Pála- 17. 10. 2018
 

Péhápkaři v Pecce: Zend Expressive: PSR framework který vás dostane – Jan Kadeřábek – 20. 2. 2019

  • 1. PSR-15 Middleware in Minutes Zend Expressive FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek
  • 2. PSR-7: HTTP message interfaces FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek • abstrakce nad HTTP zprávami • sada interfaců v PsrHttpMessage • https://www.php-fig.org/psr/psr-7/
  • 3. PSR-7: HTTP message interfaces • MessageInterface •RequestInterface •ServerRequestInterface •ResponseInterface FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 4. PSR-15: HTTP Server Request Handlers FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • Rozšiřuje PSR-7 • Zavádí: • HTTP server request handler • HTTP server middleware • https://www.php-fig.org/psr/psr-15/
  • 5. PSR-15: Request Handlers • Zpracovává předaný request • Vždy vrací response nebo vyhodí výjimku • PsrHttpServerRequestHandlerInterface FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 6. PSR-15: Request Handlers FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 7. PSR-15: Middleware • Zpracovává příchozí request a buď: •Vrátí response •Deleguje zpracování na další vrstvu • PsrHttpServerMiddlewareInterface FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 8. PSR-15: Middleware FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 9. PSR-15: Middleware FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 10. PSR-15: Generating response FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek • Každý handler nebo middleware který generuje odpověd by měl sestavit instanci ResponseInterface nebo továrnu, která je shopna ji vytvořit
  • 11. PSR-15: Handling exceptions FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek • Existuje komponenta (middleware), která chytá výjimky a převádí je na response • Obaluje veškerý proces v aplikaci
  • 13. Zend Expressive FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • Minimalistický PSR-15 PHP framework • Umí nic a zároveň vše • Snadno konfigurovatelný • Průhledná a jednoduchá implementace • https://docs.zendframework.com/zend-expressive/
  • 14. Routing • Expressive nenabízí žádný defaultní router • Pouze adaptéry integrující nějakou implementace routeru • Aura.Router • FastRoute • zend-mvc Router • ZendExpressiveRouterRouterInterface • integrujte si svůj vlastní router FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 16. Dependency injection • Expressive nenabízí žádný defaultní DI container • PSR-11 •PsrContainerContainerInterface • Opět tři základní balíčky •zend-servicemanager •pimple-interop •aura.di FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 17. Templating • Expressive nenabízí žádný defaultní templatovací engine • Vhodné na API •Vracím pouze ZendDiactorosResponseJsonResponse • Šablony použiju jenom když potřebuju •ZendExpressiveTemplateTemplateRendererInterface • Handlery a middleware nejsou závislé na konkrétním enginu FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 20. Error handling • Vyhazovat výjimky a mít vrstvu která je bude odchytávat • Upravený PHP error_reporting • ZendStratigilityMiddlewareErrorHandler • Whoops error handler pro vývoj • Detailní informace o chybě jako v Tracy • Možnost konfigurace výstup (HTML, JSON) FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 21.
  • 22. FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 24. Co nám to umožňuje? FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • Vytvořit pěknou validaci a mapování requestů • Možnost si snadno sestavit aplikaci pro: •Jednoduché E2E testování •Integraci do existující aplikace
  • 25. Validace příchozích requestů FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • Kontrolovat data v requestu • Standardizovaná odpověd API v případě chyby • Mapovat data na pěkné DTO
  • 26. Cíl FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 27. Symfony Validator FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 28.
  • 29.
  • 30. A v případě nevalidních dat? FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 31.
  • 32. Error response FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 33. Výsledek FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 34. Mapování přímo z routeru? FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • V definici routy určit mapovaný objekt • Handler nebo middleware už by dostal rovnou objekt requestu
  • 35. Definice typu requestu FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 36. Použití v handleru FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 38. Testování FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • Unit testy na handlery • E2E testy •Spuštění celé aplikace bez posílání HTTP requestů díky PSR-7 abstrakci
  • 40. E2E testy • Poslat HTTP request a kontrolovat response • Testuje navíc: •zadefinované routy •sestavení aplikace •správně předané závislosti •kombinaci jednotlivých komponent FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 41. E2E testy bez HTTP protokolu • Využijeme abstrakce PSR-7 • PHPUnit • Sestavíme aplikaci (instance Application) •Předáme instanci ServerRequestInterface •Spustíme aplikaci •Zkontrolujeme vytvořenou instanci ResponseInterface FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 42. Abstraktní TestCase třída FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 49. Výsledný test FB facebook.com/peckadesign TW peckadesignZend Expressive Jan Kadeřábek
  • 50.
  • 51. Zamyšlení na závěr FB facebook.com/peckadesign TW @peckadesignZend Expressive Jan Kadeřábek • Soustředím se pouze na jeden oddělený problém •Ostatní deleguji dál • Framework je pouze obálka, která drží pohromadě jednotlivé komponenty •Dispatcher handlerů • Je MVC přežitek?
  • 52. FB facebook.com/peckadesign TW @peckadesign Děkuji za pozornost Zend Expressive Jan Kadeřábek https://github.com/jankaderabek/expressive-playground