ZADÁNÍ BAKALÁŘSKÉ PRÁCE

Název: Knihovna pro tvorbu REST API v PHP Student: Martin Fabík Vedoucí: Ing. Jiří Chludil Studijní program: Informatika Studijní obor: Webové a softwarové inženýrství Katedra: Katedra softwarového inženýrství Platnost zadání: Do konce letního semestru 2020/21

Pokyny pro vypracování

1. Analyzujte nejčastěji používané knihovny pro tvorbu REST API v jazyce PHP a porovnejte je (použitelnost, podpora, limitace, apod...). 2. Analyzujte nejčastěji požadované a nejčastěji chybějící funkcionality ve stávajících řešeních. 3. Na základě provedených analýz navrhněte vlastní knihovnu, která bude pokrývat nejčastější chybějící funkcionality. 4. Implementujte navrženou knihovnu v jazyce PHP, včetně vhodných testů (unit, integrační, apod...). 5. Navrhněte vhodnou referenční implementaci vytvořené knihovny, včetně vhodné ukázkové REST API služby. Seznam odborné literatury

Dodá vedoucí práce.

Ing. Michal Valenta, Ph.. doc. RNDr. Ing. Marcel Jiřina, Ph.D. vedoucí katedry děkan

V Praze dne 16. února 2020

Bakal´aˇrsk´apr´ace

Knihovna pro tvorbu REST API

Martin Fab´ık

Katedra softwarov´ehoinˇzen´yrstv´ı

Vedouc´ıpr´ace:Ing. Jiˇr´ıChludil

4. ˇcervna2020

Prohl´aˇsen´ı

Prohlaˇsuji,ˇzejsem pˇredloˇzenoupr´acivypracoval(a) samostatnˇea ˇzejsem uvedl(a) veˇsker´epouˇzit´einformaˇcn´ızdroje v souladu s Metodick´ympokynem o etick´epˇr´ıpravˇevysokoˇskolsk´ych z´avˇereˇcn´ych prac´ı.

Beru na vˇedom´ı,ˇzese na moji pr´aci vztahuj´ıpr´ava a povinnosti vypl´yvaj´ıc´ı ze z´akona ˇc.121/2000 Sb., autorsk´ehoz´akona, ve znˇen´ıpozdˇejˇs´ıch pˇredpis˚u. V souladu s ust. § 46 odst. 6 tohoto z´akona t´ımto udˇelujinev´yhradn´ıopr´avnˇen´ı (licenci) k uˇzit´ıt´etomoj´ıpr´ace, a to vˇcetnˇevˇsech poˇc´ıtaˇcov´ych program˚u,jeˇz jsou jej´ısouˇc´ast´ıˇcipˇr´ılohou,a veˇsker´ejejich dokumentace (d´alesouhrnnˇejen D´ılo“), a to vˇsemosob´am,kter´esi pˇrej´ıD´ılouˇz´ıt.Tyto osoby jsou opr´avnˇeny ” D´ılouˇz´ıtjak´ymkoli zp˚usobem, kter´ynesniˇzujehodnotu D´ıla,a za jak´ymkoli ´uˇcelem(vˇcetnˇeuˇzit´ık v´ydˇeleˇcn´ym´uˇcel˚um).Toto opr´avnˇen´ıje ˇcasovˇe,teri- tori´alnˇei mnoˇzstevnˇeneomezen´e.Kaˇzd´aosoba, kter´avyuˇzijev´yˇseuvedenou licenci, se vˇsakzavazuje udˇelitke kaˇzd´emu d´ılu,kter´evznikne (byt’ jen zˇc´asti) na z´akladˇeD´ıla,´upravou D´ıla,spojen´ımD´ılas jin´ymd´ılem,zaˇrazen´ımD´ıla do d´ılasouborn´ehoˇcizpracov´an´ımD´ıla(vˇcetnˇepˇrekladu),licenci alespoˇnve v´yˇseuveden´emrozsahu a z´aroveˇnzpˇr´ıstupnitzdrojov´yk´odtakov´ehod´ılaale- spoˇnsrovnateln´ymzp˚usobem a ve srovnateln´emrozsahu, jako je zpˇr´ıstupnˇen zdrojov´yk´odD´ıla.

V Praze dne 4. ˇcervna2020 ...... Cesk´evysok´euˇcen´ıtechnick´evˇ Praze

Fakulta informaˇcn´ıch technologi´ı

© 2020 Martin Fab´ık.Vˇsechna pr´ava vyhrazena.

Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Cesk´emvysok´emuˇcen´ıˇ technick´em v Praze, Fakultˇeinformaˇcn´ıch technologi´ı.Pr´ace je chr´anˇenapr´avn´ımipˇredpisy a mezin´arodn´ımi´umluvamio pr´avuautorsk´ema pr´avech souvisej´ıc´ıchs pr´avem autorsk´ym.K jej´ımuuˇzit´ı,s v´yjimkoubez´uplatn´ychz´akonn´ychlicenc´ıa nad r´amec opr´avnˇen´ıuveden´ychv Prohl´aˇsen´ına pˇredchoz´ıstranˇe,je nezbytn´ysou- hlas autora.

Odkaz na tuto pr´aci Fab´ık, Martin. Knihovna pro tvorbu REST API. Bakal´aˇrsk´apr´ace.Praha: Cesk´evysok´euˇcen´ıtechnick´evˇ Praze, Fakulta informaˇcn´ıch technologi´ı,2020. Abstrakt

C´ılempr´aceje anal´yzast´avaj´ıch moˇznost´ıpro tvorbu REST API sluˇzebdo- stupn´ych v r˚uzn´ych PHP frameworc´ıch a na z´akladˇevznikl´eanal´yzyiden- tifikovat nejˇcastˇejichybˇej´ıc´ıfunkcionality a navrhnout ˇreˇsen´ıpoˇzadovan´ych funkcionalit. Praktick´ymv´ystupem t´etopr´acebude nez´avisl´aPHP knihovna, kter´anab´ıdnen´astroje a moˇznostipro tvorbu REST API sluˇzeb.V p´ısemn´e ˇc´astise autor zab´yv´apˇrev´aˇznˇeanal´yzoust´avaj´ıc´ıhˇreˇsen´ıspolu s rozborem poˇzadavk˚ua n´avrhemkonkr´etn´ıpodoby v´ysledn´eknihovny.

Kl´ıˇcov´a slova REST API, REST frameworky, REST API n´astroje, n´avrh API, OpenAPI, PHP knihovna

v Abstract

The goal of this thesis is to analyze the existing possibilities for creating REST API services in various PHP frameworks and identify the most frequently missing functionalities based on provided analysis and then propose solution for the required functionalities. The practical output of this work will be an independent PHP library that will offer various tools for creating REST API services. In written part, the author deals mainly with the analysis of existing solutions and analysis of requirements and proposes design of the resulting library.

Keywords REST API, REST frameworks, REST API tools, API design, OpenAPI, PHP library

vi Obsah

Uvod´ 1

1 C´ıl pr´ace 3

2 REST 5 2.1 Z´akladyRESTu ...... 5 2.2 UrovnˇeRESTu´ ...... 6 2.2.1 The Swamp of POX ...... 6 2.2.2 Resources ...... 6 2.2.3 HTTP Verbs ...... 7 2.2.4 Hypermedia Controls ...... 8

3 Analyza´ 9 3.1 V´ybˇerdostupn´ych ˇreˇsen´ı...... 9 3.1.1 Dostupn´eframeworky ...... 9 3.1.1.1 [6] ...... 9 3.1.1.2 [7] ...... 9 3.1.1.3 Magento 2[8] ...... 9 3.1.1.4 Nette[9] ...... 10 3.2 Zhodnocen´ıdostupn´ych ˇreˇsen´ı...... 10 3.2.1 V´ybˇerhodnot´ıc´ıch krit´eri´ı ...... 10 3.2.2 Hodnocen´ıˇreˇsen´ı ...... 11 3.2.2.1 Hodnocen´ıLaravel ...... 11 3.2.2.2 Hodnocen´ıMagento 2 ...... 13 3.2.2.3 Hodnocen´ıNette ...... 14 3.2.2.4 Hodnocen´ıSymfony ...... 15 3.2.3 Z´avˇerhodnocen´ı ...... 16 3.3 Poˇzadovan´afunkcionalita ...... 17 3.3.1 Oddˇelen´ıREST API a web kontroler˚u...... 17 3.3.2 Podpora v´ıceform´at˚u ...... 17

vii 3.3.3 Mapov´an´ıdo objektov´ereprezentace ...... 17 3.3.4 Validace vstupu ...... 18 3.3.5 Autentizace uˇzivatele ...... 18 3.4 Dotazn´ıkov´eˇsetˇren´ı...... 18 3.4.1 Clenˇen´ıdotazn´ıkuˇ ...... 19 3.4.2 V´ysledkydotazn´ıku ...... 20

4 N´avrh 21 4.1 Platforma ...... 21 4.2 Verzov´an´ı ...... 21 4.2.1 Centralized workflow ...... 21 4.2.2 Feature branching workflow ...... 22 4.2.3 Gitflow workflow ...... 22 4.2.4 Forking workflow ...... 23 4.2.5 Zvolen´eˇreˇsen´ı...... 24 4.3 ...... 24 4.4 OOP Design a principy ...... 24 4.4.1 Princip jedn´eodpovˇednosti ...... 24 4.4.2 Princip otevˇrenostia uzavˇrenosti ...... 25 4.4.3 Liskovov´eprincip zamˇenitelnosti ...... 25 4.4.4 Princip oddˇelen´ırozhran´ı ...... 25 4.4.5 Princip obr´acen´ız´avislost´ı...... 25 4.5 PHP-FIG PSR ...... 25 4.5.1 PSR-1 ...... 26 4.5.2 PSR-4 ...... 26 4.5.3 PSR-7 ...... 26 4.5.4 PSR-11 ...... 26 4.6 Implementaˇcn´ın´avrhj´adraknihovny ...... 26 4.6.1 J´adroknihovny ...... 27 4.6.2 Form´aty ...... 28 4.6.3 Reflexe ...... 29 4.6.4 Mapov´an´ıvstupn´ıch dat ...... 29 4.6.5 Mapov´an´ıv´ystupn´ıch dat ...... 30 4.6.6 Zpracov´an´ıpoˇzadavku ...... 30 4.6.7 Pˇr´ıkladybudouc´ıhouˇzit´ı...... 31

5 Realizace 33 5.1 Postup realizace ...... 33 5.2 Instalaˇcn´ıpˇr´ıruˇcka ...... 34 5.3 Program´atorsk´adokumentace ...... 34 5.4 Zhodnocen´ıv´ysledn´eknihovny ...... 35

6 Testov´an´ı 37 6.1 Jednotkov´etestov´an´ı ...... 37

viii 7 Referenˇcn´ı implementace 39 7.1 V´ybˇervhodn´eplatformy ...... 39 7.2 Realizace ...... 39

Z´avˇer 41

Bibliografie 43

A Seznam pouˇzitych´ zkratek 45

B Obsah pˇriloˇzen´eho CD 47

ix

Seznam obr´azk˚u

2.1 Ctyˇri´urovnˇepohleduˇ na REST[4] ...... 6

4.1 Sch´emaGitflow ...... 23

xi

Seznam tabulek

2.1 HTTP metody pouzivane v souvislosti s REST ...... 7

3.1 Pˇrehledhodnocen´ıjednotliv´ych framework˚u...... 16 3.2 Pr˚umˇern´ezhodnocen´ıpoˇzadovan´ych vlastnost´ıdle responsend˚u. . 20

xiii

Uvod´

V souˇcasnosti,kdy se ˇc´ımd´alt´ımv´ıcesubjekt˚una internetu snaˇz´ıvyuˇz´ıvat v´yhod REST API sluˇzeb[1],je d˚uleˇzit´e,aby mˇeliv´yvoj´aˇrik dispozici kvalitn´ı n´astroje pro v´yvoj pr´avˇeREST API sluˇzeb. V pr´aciproto c´ıl´ım pˇrev´aˇznˇe na anal´yzumoˇznost´ı,kter´em´av souˇcasnostiv´yvoj´aˇrk dispozici a n´aslednˇe navrhuji knihovnu, kter´apokr´yv´ad˚uleˇzit´echybˇej´ıc´ıfunkcionality.

V ´uvodu pr´acese zab´yv´ampodrobnˇejˇs´ıanal´yzoudostupn´ych framework˚u z r˚uzn´ych odvˇetv´ı,se kter´ymise v´yvoj´aˇrm˚uˇzepotkat. Bˇehemanal´yzyzkoum´am dostupn´aˇreˇsen´ız pohledu tvorby REST API serveru, tedy pˇredevˇs´ımjejich zach´azen´ıs daty. Z tohoto pohledu jsem v pr˚ubˇehu anal´yzypˇriseznamov´an´ı se s frameworky vyuˇziljak drobn´ych implementac´ı,tak revize k´odu.

Pr´aceje strukturovan´atak, aby ˇcten´aˇripˇrehlednˇea srozumitelnˇeposkytla v´ystupy jednotliv´ych ˇc´ast´ıtvorby softwaru. Bˇehemanal´yzyse tedy zab´yv´am identifikac´ıkl´ıˇcov´ych funkcionalit, kter´epovaˇzujiza d˚uleˇzit´ea kter´eve vˇetˇsinˇe ˇreˇsen´ıchyb´ı,nebo r˚uzn´eframeworky poskytuj´ıimplementaci na rozd´ıln´e´urovni. Jako ovˇeˇren´ım´ych hypot´ezbyl proveden tak´epr˚uzkummezi v´yvoj´aˇri.tento pr˚uzkumc´ılilna jejich potˇreby a jejich st´avaj´ıc´ıˇreˇsen´ı.V´ystupem pr´aceje pot´e samostatn´aPHP knihovna jako n´astroj umoˇzˇnuj´ıc´ı efektivn´ı tvorbu REST API sluˇzby stejnˇetak jako referenˇcn´ıpouˇzit´ıt´etoknihovny ve frameworku Nette.

1

Kapitola 1

C´ılpr´ace

C´ılemt´etopr´aceje na z´akladˇeanalytick´eˇc´astipr´acenavrhnout a realizovat PHP knihovnu pro tvorbu REST API sluˇzeb(serverov´eˇc´asti).

C´ılemanalytick´eˇc´astipr´aceje vytipovat a analyzovat zaj´ımav´ePHP fra- meworky a posoudit moˇznostitvoby REST API v tˇechto frameworc´ıch. D´ale identifikovat klady a z´apory zvolen´ych ˇreˇsen´ıa vytipov´an´ıa konkr´etn´ıspe- cifikace uˇziteˇcn´ych funkcionalit. Na z´akladˇevyspecifikovan´ych funkcionalit posl´ezenavrhnout samostatnˇepouˇzitelnouPHP knihovnu, kter´aposlouˇz´ıjako n´astroj pro tvoru REST API sluˇzeb.

C´ılempraktick´eˇc´astije realizace v´yˇsezm´ınˇen´eknihovny v jazyce PHP, jej´ı otestov´an´ıa tak´euk´azkov´aimplementace a pouˇzit´ınovˇevzniknuvˇs´ıknihovny.

3

Kapitola 2

REST

Pˇredsamotn´ymzkoum´an´ımdostupn´ych ˇreˇsen´ıa tvorbou vlastn´ıch poˇzadavk˚u, je nutn´enejdˇr´ıve zn´at,co REST API obn´aˇs´ı,na jak´ych principech je posta- veno a jakou pouˇz´ıv´aarchitekturu. V tomto kr´atk´em,avˇsakd˚uleˇzit´em´uvodu se budu zab´yvat pˇrev´aˇznˇeserverovou ˇc´ast´ıREST API, avˇsakje nutn´atak´e znalost z pohledu klienta.

2.1 Z´aklady RESTu

REST [2] (Representational State Transfer) je architektonick´ystyl, kter´yje na- rozd´ılod tehdy dosupn´ych technologi´ı,jako napˇr´ıkladXML-RPC nebo SOAP, datovˇeorientov´an.Prim´arn´ımzamˇeˇren´ımREST API jsou rozhran´ıv distri- se zamˇeˇrujena jednotn´ya snadn´ypˇr´ıstupke buovan´emprostˇred´ı,pˇriˇcemˇz ” zdroj˚um (resources). Zdroj m˚uˇzeb´ytprakticky cokoliv, koncept nem´aˇz´adn´a omezen´ı.M˚uˇzeto b´ytnapˇr´ıkladnˇejak´ykonkr´etn´ıobjekt v datab´azi,dokument, v´ysledek nˇejak´ehov´ypoˇctunebo webov´astr´anka“ [3].

Jelikoˇzse tato pr´acezaob´ır´an´avrhema implementac´ıREST API sluˇzebz pohledu RESTu se jedn´ao n´avrha definov´an´ı zdroj˚u.

5 2. REST

2.2 UrovnˇeRESTu´

[4] Pro pˇrehlednostje v´yhodn´esi REST zn´azornitv ´urovn´ıch jako na obr´azku 2.1:

Obr´azek2.1: Ctyˇri´urovnˇepohleduˇ na REST[4]

2.2.1 The Swamp of POX

Jedn´ase o ´uroveˇn,na kter´epohl´ıˇz´ımena samotn´ypˇrenosmezi serverem a kli- entem. Nejˇcastˇejise pouˇz´ıv´aprotokol HTTP, avˇsaksamotn´yREST se nev´aˇze jen na tento konkr´etn´ı protokol. V t´etopr´acise vˇsakbudu zab´yvat pouze pˇrenosem pomoc´ı HTTP protokolu, jelikoˇzse jedn´ao pr´acipojedn´avaj´ıc´ı o tvorbˇeREST API v prostˇred´ıwebu.

2.2.2 Resources

Pˇripr´acis REST API nejsou poˇzadavky z pohledu klienta pos´ıl´any na je- den centr´aln´ıbod a d´alerozliˇsov´any podle obsahu, ale jsou klientem zas´ıl´any na jednotliv´e,jednoznaˇcnˇeidentifikovan´ezdroje. Zdrojem m˚uˇzeb´ytcokoli, tedy r˚uzn´edokumenty, obr´azky, ale nejˇcastˇejise jedn´ao strukturovan´adata, napˇr´ıkladdata z datab´aze.

D´aleje klient˚umumoˇznˇenopˇristupovat k jednotliv´yminstanc´ımjednoho zdroje (m˚uˇzemesi tak´epˇredstavit jako prvky kolekce). Napˇr´ıklad.:

6 2.2. UrovnˇeRESTu´

• /article - manipulace se seznamem ˇcl´ank˚u(kolekce)

• /article/:id - manipulujeme s jedn´ımkonkr´etn´ımprvkem kolekce, iden- tifikovan´ympodle :id

Pokud pracujeme se strukturovan´ymidaty, t´emˇeˇrvˇzdynaraz´ımena probl´em, jak ˇreˇsit relace. Aˇckoli samotn´yREST nedefinuje zp˚usob,jak relace ˇreˇsit (klade pouze poˇzadavek na to, aby byl kaˇzd´yzdroj jednoznaˇcnˇeidentifikov´an), je nepsan´ym pravidlem uv´adˇet relace v n´asleduj´ıc´ım tvaru: /:idZdroj//:idRelace. Pokud toto prom´ıtnu v konkr´etn´ıch pˇr´ıpadech, pak:

• /article/1/comment - seznam vˇsech koment´aˇr˚upro ˇcl´anek1 (kolekce)

• /article/1/comment/2 - konkr´etn´ıkoment´aˇrke konkr´etn´ımu ˇcl´anku

Pro tuto konkr´etn´ıpr´acijiˇzz t´etodefinice vypl´yv´ad˚uleˇzit´aa nutn´avlast- nost, a tou je pr´aces parametrick´ymiURL.

2.2.3 HTTP Verbs Jelikoˇzse zab´yv´amepˇrenosemdat pomoc´ıprotokolu HTTP, pˇredstav´ımesi v t´etokapitole, jak´emetody n´amHTTP protokol nab´ız´ıa kter´ejsou RESTem pouˇz´ıvan´e.V tabulce 2.1 naleznete n´azeva v´yznampouˇzit´ych metod.

GET Z´ısk´an´ıdat POST Vytvoˇren´ıdat PUT Uprava´ dat DELETE Odstranˇen´ıdat PATCH C´asteˇcn´a´upravaˇ dat Tabulka 2.1: HTTP metody pouzivane v souvislosti s REST

Kromˇetˇechto definic se m˚uˇzemesetkat jeˇstˇes vyj´adˇren´ım, ˇzemetoda GET je safe. To znamen´a,ˇzepˇrivol´an´ıt´etometody nedoch´az´ık ˇz´adn´ezmˇenˇe stavu nad volan´ymzdrojem. Kromˇetoho, ˇzeje metoda safe se d´alepouˇz´ıv´a oznaˇcen´ı idempotent a to pro metody GET, PUT a DELETE. To znamen´a, ˇzeopakovan´evol´an´ıstejn´ehozdroje se stejn´ymidaty a stejnou metodou vede ke stejn´ezmˇenˇestavu nehledˇena poˇcetvol´an´ı.

V praxi je pot´epouˇzit´ımetody PATCH ˇcastoopom´ıjen´ea pouˇz´ıvaj´ıse ˇcastopouze prvn´ıˇctyˇrizm´ınˇen´emetody [3]. C´asteˇcn´ymd˚uvodemˇ m˚uˇze b´yt tak´eto, ˇzemetoda PATCH byla do HTTP protokolu zakomponov´anajako

7 2. REST rozˇs´ıˇren´ıdodateˇcnˇe[5]. Z pohledu RESTu je pak nutn´eimplementovat ˇctyˇri z´akladn´ıoperace, oznaˇcovan´ejako CRUD. Jedn´ase o Create, Retrieve, Up- date a Delete. Jak vid´ıme,protokol HTTP je zcela dostaˇcuj´ıc´ıpro pokryt´ı poˇzadovan´ych metod.

Kromˇer˚uzn´ych metod, kter´elze pouˇz´ıtpˇridotazov´an´ıse na zdroj n´am HTTP poskytuje tak´esadu stavov´ych k´od˚upro odpovˇed’. Jejich kompletn´ı seznam spoleˇcnˇes v´yznamemje k dispozici v ofici´aln´ıdokumentaci.

2.2.4 Hypermedia Controls Posledn´ı´uroveˇnje zn´amapod akronymem HATEOAS (Hypertext as the En- gine of Application State). Popisuje princip, kdy kaˇzd´yzdroj kromˇesamo- stn´ych dat poskytne tak´eseznam operac´ı,kter´elze vyuˇz´ıtv souvislosti s dan´ym poˇzadavkem. To pˇrin´aˇs´ıˇraduv´yhod, napˇr´ıkladodpad´anutnost udrˇzovat na stranˇeklienta vˇsechny adresy zdroj˚u,ale po prvotn´ımdotazu na server klient z´ısk´aseznam dostupn´ych operac´ı.

Aˇckoli vˇsaktento pˇr´ıstup pˇrin´aˇs´ı sv´ev´yhody, v souˇcasnostinen´ı aˇzna drobn´ev´yjimkyvyuˇz´ıv´anzejm´enad´ıkychybˇej´ıc´ımn´astroj˚umjak efektivnˇe pˇren´aˇsettyto odkazy.

8 Kapitola 3

Anal´yza

Bˇehemanal´yzyse zamˇeˇrujina vydefinov´an´ı oˇcek´avan´efunkcionality a po- rovn´an´ıs dostupn´ymiˇreˇsen´ımi.Mezi dostupn´aˇreˇsen´ıse snaˇz´ımvybrat zaj´ımav´e frameworky, se kter´ymise m˚uˇzev´yvoj´aˇrv r˚uzn´ych odvˇetv´ıch setkat.

3.1 V´ybˇerdostupn´ych ˇreˇsen´ı

V t´etokapitole porovn´av´amaktu´alnˇedostupn´aˇreˇsen´ı,kter´ase snaˇz´ımvyb´ırat z r˚uzn´ych odvˇetv´ı, jelikoˇzne vˇzdy m´aprogram´atormoˇznostzvolit si fra- mework, ve kter´embude sv´eˇreˇsen´ıimplementovat.

3.1.1 Dostupn´eframeworky 3.1.1.1 Laravel[6]

Tento framework se ˇrad´ımezi ty popul´arnˇejˇs´ıframeworky a je velice obl´ıben pro svou jednoduchost a tedy je vhodn´ypro rychl´eprototypov´an´ı.Laravel s´amo sobˇeobsahuje sv˚ujvlastn´ıORM framework Eloquent. Vybral jsem jej zejm´enakv˚ulijeho obl´ıbenosti mezi v´yvoj´aˇri.

3.1.1.2 Symfony[7]

Dlouhodobˇestabiln´ıs pomˇernˇerozˇs´ıˇren´yframework, kter´yje postaven na sadˇe samostatnˇepouˇziteln´ych komponent. Tento koncept je u tohoto frameworku velice oceˇnov´ana mnoho v´yvoj´aˇr˚upouˇz´ıv´apr´ave samostatn´ych komponent frameworku. Byl vybr´anpro svou rozˇs´ıˇrenostmezi v´yvoj´aˇri.

3.1.1.3 Magento 2[8]

Jeden z nejvˇetˇs´ıch e-commerce framework˚u,kter´ese na trhu nach´azej´ı.Je ve- lice robustn´ıa poskytuje nepˇrebern´emnoˇzstv´ımodul˚u,mnohdy postaven´ych

9 3. Analyza´ na komponent´ach ostatn´ıch framework˚u,jako je Zend nebo Symfony. Fra- mework poskytuje mimo jin´etak´evelmi propracovan´ypodp˚urn´ysyst´empro tvorbu REST API a proto byl zahrnut do t´etopr´ace.

3.1.1.4 Nette[9]

Mezi v´yvoj´aˇriv ˇcesk´erepublice velice popul´arn´ıframework postaven´yna MVC architektuˇre.Je jednoduch´y,snaˇz´ıse o pouˇz´ıv´an´ıkomponent a je tak´evelmi snadno pouˇziteln´y.Do t´etopr´acejsem jej zahrnul pro svou obl´ıbenost na ˇcesk´emtrhu. Pro ´uˇcelyt´etopr´acebylo hodnoceno nette s rozˇs´ıˇren´ımApitte, kter´ejsem shledal asi nejlepˇs´ım rozˇs´ıˇren´ım pro REST API pro tento fra- mework.

3.2 Zhodnocen´ıdostupn´ych ˇreˇsen´ı

V t´etokapitole se zab´yv´amzhodnocen´ımv´yˇseuveden´ych framework˚ua kniho- ven podle definovan´ych krit´eri´ı.

3.2.1 V´ybˇerhodnot´ıc´ıch krit´eri´ı

Neˇzbude moˇzn´ezhodnotit vybran´aˇreˇsen´ı, je nutn´esi stanovit hodnot´ıc´ı krit´eria.Hodnocen´ıbude prob´ıhatna ˇsk´aleod 1 do 5, jako ve ˇskole. Tedy 1 znamen´anejlepˇs´ıa 5 nejhorˇs´ı.

Dokumentace

Pro spr´avn´ea efektivn´ıpouˇz´ıv´an´ıframeworku/knihovny potˇrebujikvalitn´ıdo- kumentaci. Pokud zvolen´eˇreˇsen´ınem´akvalitnˇevypracovanou dokumentaci a j´anaraz´ımna probl´em,m˚uˇzese mi pouˇz´ıv´an´ıznaˇcnˇezkomplikovat. Stejnˇe tak pokud nem´aminformaci o vˇsech moˇznostech dan´ehoˇreˇsen´ı, nemus´ım plnˇevyuˇz´ıtjeho potenci´al.Z tohoto d˚uvodu ze pˇrihodnocen´ıdokumentace zamˇeˇrujina:

• Obs´ahlost– tedy zda obsahuje dostatek informac´ıpotˇrebn´ych pro pouˇz´ıv´an´ı dokumentace

• Zda dokumentace obsahuje pˇr´ıklady pouˇzit´ı u jednotliv´ych koncept˚u, pˇr´ıpadnˇev jak´em´ıˇre

• Pˇrehlednost– tedy jestli je dokumentace pˇrehlednˇestrukturovan´a,zda m´alogick´eˇclenˇen´ıa zda se dostanu vˇsudetam, kam potˇrebuji

10 3.2. Zhodnocen´ıdostupn´ych ˇreˇsen´ı

Jednoduchost pouˇz´ıv´an´ı

Knihovnu/framework si vyb´ır´amproto, aby mi pomohla. Pokud budu nucen pˇrin´avrhu REST API ˇreˇsit vˇeci, kter´epˇr´ımonesouvisej´ıs n´avrhem,pak je dan´eˇreˇsen´ıhodnoceno negativnˇe.Jednoduchost pouˇz´ıv´an´ıje zde posuzov´ana z pohledu usnadnˇen´ın´avrhu REST API (jak mi framework pom´ah´apˇrijeho tvorbˇe).

Podpora r˚uznych´ form´at˚u

Rozˇsiˇritelnostz hlediska podpory r˚uzn´ych aplikaˇcn´ıch form´at˚u,nejˇcastˇejiJSON nebo XML. Od vybran´ehoˇreˇsen´ıoˇcek´av´amflexibiln´ıpodporu v´ıceform´at˚u, jako i jejich jednoduchou rozˇsiˇritelnost.Tato vlastnost je v REST API termi- nologii oznaˇcov´ana jako Content Negotiation[10].

Pr´ace s daty

Toto krit´eriumhodnot´ısamotnou pr´acis daty. Tedy zda je k dat˚umpˇristupov´ano strukturovanˇe,jsou-li data validovan´a(ˇreˇsen´ıpodporuje validaci data na ´urovni vstupu) a jak sloˇzit´edatov´estruktury je schopno dan´eˇreˇsen´ıpojmout.

Moˇznosti konfigurace

Zde se hodnot´ımoˇznostflexibiln´ıhopouˇz´ıv´an´ı.Zejm´enase pak ˇreˇs´ıot´azka, zda ˇreˇsen´ıvyˇzadujeurˇcit´ejmenn´ekonvence nebo je moˇzn´etyto konfigurovat (napˇr´ıkladzda je vyˇzadov´anoimplementovat metodu read() a nebo je moˇzn´e vyuˇz´ıvat i jinou metodu pro z´ısk´an´ıdat).

Celkov´e zhodnocen´ı

Obecn´ehodnocen´ı dan´ehoˇreˇsen´ı. Shrnut´ı pˇredchoz´ıch bod˚us ohledem na dalˇs´ıvlastnosti zvolen´ehoˇreˇsen´ı,kter´eje dobr´ebr´atv ´uvahu. Tak´epˇr´ıpadn´e vyzdvihnut´ıpozitivn´ıch vlastnost´ı,kter´eby bylo dobr´em´ıtve sv´emfin´aln´ım ˇreˇsen´ı.

3.2.2 Hodnocen´ıˇreˇsen´ı 3.2.2.1 Hodnocen´ı Laravel Dokumentace

Dokumentace frameworku Laravel je dostupn´aonline a je velice pˇeknˇezpraco- van´a.Je pˇrehlednˇestrukturovan´a,s dostatkem n´azorn´ych pˇr´ıklad˚una pouˇzit´ı popisovan´ych koncept˚u.Z hlediska obs´ahlostije na dostaˇcuj´ıc´ı´urovni, avˇsak nen´ızdaleka tak obs´ahl´a,jako u Symfony. Celkovˇeje tedy m´ehodnocen´ı 2.

11 3. Analyza´

Jednoduchost pouˇz´ıv´an´ı

Framework poskytuje n´astroje a moˇznostipro tvorbu API a urˇcitˇese snaˇz´ı program´atorovi pomoct s n´avrhema pouˇz´ıv´an´ım.Nastaven´ıroutov´an´ıje jed- noduch´ea nav´ıcframework dok´aˇzeposkytnout instanci objektu pokud mu poskytneme data ve strukturovan´epodobˇe.Hodnocen´ıje tedy veskrze pozi- tivn´ı: 2.

Podpora r˚uznych´ form´at˚u

Laravel v z´akladuposkytuje podporu JSON form´atu,kter´yje v oblasti REST API nejpouˇz´ıvanˇejˇs´ımform´atem(uveden´ızdroje). D´aleje moˇzn´erozˇs´ıˇritfunk- cionalitu frameworku o form´atXML a stejnˇetak i dalˇs´ıuvaˇzovan´eform´aty dle libosti, d´ıkykonceptu middleware, kter´ym˚uˇzekdokoli vyuˇz´ıt.Hodnocen´ı je stejn´ejako v pˇredchoz´ımbodˇe,tedy 2.

Pr´ace s daty

Framework s daty pracuje pomˇernˇeuspokojivˇe– parsuje data do objektov´e reprezentace, i kdyˇztato nen´ıdefinovan´auˇzivatelem (jedn´ase pouze o obec- nou tˇr´ıdu).N´asledn´epouˇz´ıv´an´ıvstup˚uje objektov´e,avˇsakpokud vyˇzaduji striktnˇejˇs´ıvalidace, nevyhnu se tomu, abych si nepsal vlastn´ıpˇr´ımov obsluˇzn´e metodˇe.N´avratov´ehodnoty mohou b´yttak´eobjekty, coˇzznaˇcnˇezjednoduˇs´ı pr´aci,protoˇzeuˇzivatel potom nen´ınucen ruˇcnˇevolat transformace. Hodnocen´ı je tedy kladn´a 2.

Moˇznosti konfigurace

Framework je konfigurov´anve vyˇclenˇen´emPHP souboru, kde se odkazuji na r˚uzn´edirektivy. Z hlediska pˇrehlednostibych jako v´yvoj´aˇrocenil m´ıtsamo- statn´ykonfiguraˇcn´ısoubor, ve kter´emby se veˇsker´akonfigurace odehr´avala. Nen´ı zde moˇznost urˇcit si pˇr´ıpadn´e mapov´an´ı parametr˚u(myˇsleno query string) nebo jejich validace. Hodnocen´ıje za 3.

Celkov´e zhodnocen´ı

Framework jako takov´yse mi l´ıb´ı,je minimalistick´ya v´ykonn´y.Poskytuje tak´e vˇetˇsinu standardn´ıch n´astroj˚upro v´yvoj webu. V oblasti REST API jsou zde nedostatky pˇredevˇs´ımohlednˇekonfigurace, nicm´enˇecelkovˇese d´aframework povaˇzovat za jeden z tˇech lepˇs´ıch pro v´yvoj REST API. Na frameworku se mi l´ıbilomapov´an´ıvstupu pˇr´ımona entity, avˇsakza dodrˇzen´ıurˇcit´ych pravidel a pouze pro jednoduch´estruktury. Celkovˇetedy hodnot´ımza 3.

12 3.2. Zhodnocen´ıdostupn´ych ˇreˇsen´ı

3.2.2.2 Hodnocen´ı Magento 2 Dokumentace

Framework poskytuje obs´ahloudokumentaci online. Do dokumentace pˇrisp´ıv´a komunita. Aˇckoli se jedn´ao pomˇernˇeobs´ahloua na pˇr´ıkladybohatou doku- mentaci, mnoh´efunkcionality, kter´enejsou ˇcastovyuˇz´ıvan´e,uˇzivatel dohled´a aˇzpˇrisamotn´empouˇz´ıv´an´ı.Toto m˚uˇzeˇcinitnesn´azepˇripouˇz´ıv´an´ıa proto hodnot´ımza 3.

Jednoduchost pouˇz´ıv´an´ı

Zde je nejvˇetˇs´ı slabina tohoto frameworku, jelikoˇzjej mnoz´ı hodnot´ı jako n´aroˇcn´yna pouˇz´ıv´an´ı. Toto je pravda zejm´enav poˇc´atc´ıch v´yvoje, jelikoˇz samotn´yframework pracuje s pomˇernˇeodliˇsn´ymikoncepty, neˇzostatn´ıdo- stupn´ePHP frameworky a to i v oblasti REST API. Nicm´enˇecelkovou pr´aci s frameworkem hodnot´ımneutr´alnˇe,tedy za 3.

Podpora r˚uznych´ form´at˚u

Zde je framework naprosto vyhovuj´ıc´ı. V z´akladuposkytuje podporu pro form´aty JSON a XML, nicm´enˇeje moˇzn´edodat podporu vlastn´ıhoform´atu, framework v tomto ohledu nepˇrin´aˇs´ıˇz´adn´eomezen´ı.Celkovˇese mi podpora form´at˚uu tohoto frameworku l´ıbilaa hodnot´ımvelmi kladnˇe,tedy 1.

Pr´ace s daty

V t´etooblasti je framework Magento 2 tak´evelmi n´apomocen, jelikoˇzveˇsker´e vstupn´ıdata se snaˇz´ınamapovat na objekty. Jako vstupn´ıobjekt do REST API m˚uˇzeuˇzivatel pouˇz´ıt jak model entity v datab´azi,tak vlastn´ı model nez´avisl´yna datab´azi.Z obluˇzn´emetody pro REST API je moˇzn´evr´atittak´e objekt, kter´yje d´alepˇreveden do reprezentace urˇcen´epro klienta, nen´ıtedy nutn´evlastnoruˇcnˇepˇrev´adˇetdata do asociativn´ıhopole. Oproti ostatn´ımfra- mework˚umnen´ınutn´aani ˇz´adn´a´uprava vr´acen´ehoobjektu, jelikoˇzdata jsou z objektu extrahov´anapomoc´ıgetter˚u.Hodnocen´ıje stejn´ejako v pˇredchoz´ım bodˇe,tedy 1.

Moˇznosti konfigurace

Samotn´yframework je konfigurov´anpomoc´ı xml soubor˚u.Pˇri konfiguraci REST API tomu nen´ıjinak. Je moˇzn´ekonfigurovat kter´akonkr´etn´ımetoda bude oblushovat dan´yendpoint. Nav´ıc je moˇzn´epouˇz´ıt interface jako ob- sluˇznoutˇr´ıdua dependency injection kontejner se postar´ao doplnˇen´ıspr´avn´e instance. Na rozd´ılod ostatn´ıch framework˚uje zde vidˇetjasn´eoddˇelen´ıkon- figurace od k´odu. Hodnocen´ıje kladn´e,tedy 1.

13 3. Analyza´

Celkov´e zhodnocen´ı Tento framework poskytuje ˇradumoˇznost´ıjak zadefinovat REST API end- point a jak jej pouˇz´ıvat. Jako v´yvoj´aˇroceˇnujimoˇznostimapov´an´ıvstupn´ıch a v´ystupn´ıch dat z/do objekt˚ua to i sloˇzitˇejˇs´ıch struktur. Rovnˇeˇzoceˇnujito, ˇzenen´ınutn´emodfikovat objekty do/ze kter´ych m´ab´ytmapov´an´ıprovedeno. Framework totiˇzpouˇz´ıv´avˇsemdobˇrezn´am´egetry a setry a dan´eobjekty tak neobsahuj´ınic nav´ıc.Celkov´azn´amka,kterou tomuto frameworku udˇelujije tedy 2.

3.2.2.3 Hodnocen´ı Nette Dokumentace

Dokumentace Nette samotn´ehoje na tom o nˇecoh˚uˇre, neˇzdokumentace knihovny, kterou jsem zvolil pro tvorbu REST API. V porovn´an´ıs ostatn´ımi frameworky mi u Nette frameworku vad´ınedostateˇcn´adokumentace jednak k´odu(chybˇej´ıc´ı PHPDoc) a tak´echybˇej´ıc´ıpˇr´ıkladypro bˇeˇzn´e´ukony. U pouˇzit´e knihovny pro REST API byla dokumentace na webu dostateˇcn´a,avˇsakchybˇej´ıc´ı PHPDoc, kter´yby objasnil ´uˇcelnˇekter´ych metod/tˇr´ıd st´alechyb´ı. Celkovˇe tedy mus´ımudˇelit 4.

Jednoduchost pouˇz´ıv´an´ı Samotn´erozbˇehnut´ıprojektu a n´asledn´epouˇz´ıv´an´ıje u tohoto frameworku pomˇernˇejednoduch´e.Pouˇz´ıv´an´ıREST API sluˇzeb(za pouˇzit´ıknihovny Apitte) je pomˇernˇejednoduch´ea uˇzivatel se ve struktuˇresnadno orientuje. Zde udˇeluji hodnocen´ıshodn´es frameworkem Laravel - tedy 2.

Podpora r˚uznych´ form´at˚u Pro Nette existuje spousta knihoven pro tvorbu REST API, kdy mnoh´eknihovny neposkytuj´ıjin´eform´aty neˇz JSON. Mnou pouˇzit´aknihovna Apitte vˇsakpod- poruje jak JSON, tak XML a CSV, aˇckoli to vyˇzadujejist´aspecifika. Je tak´emoˇzn´edoplnit vlastn´ıform´atpomˇernˇejednoduˇse zaregistrov´an´ımdalˇs´ıho rozˇs´ıˇren´ı.Celkovˇetedy hodnot´ımzn´amkou 1.

Pr´ace s daty Rozˇs´ıˇren´ıApitte poskytuje n´astroj, jak vyuˇz´ıtmapov´an´ıdo objektov´erepre- zentace, avˇsaktoto mapov´an´ı mus´ı specifikovat samostatnˇev´yvoj´aˇr.Dalˇs´ı nev´yhodou v tomto ohledu je nutnost dˇedˇen´ız abstraktn´ıentity pro kaˇzdou vlastn´ı entitu, kter´am´ab´ytrenderovateln´apro klienta. Toto omezen´ıˇc´ın´ı pr´acis entitami n´aroˇcnˇejˇs´ıa pokud bychom chtˇelipouˇz´ıtz´akladn´ımoˇznosti pr´aces daty, pak se jedn´ao pˇr´ıstupk obsahu odpovˇedipˇr´ımopˇresobecn´y getter, proto hodnot´ımzn´amkou 2.

14 3.2. Zhodnocen´ıdostupn´ych ˇreˇsen´ı

Moˇznosti konfigurace

Samotn´aApitte knihovna pro Nette se konfiguruje pomoc´ıanotac´ıa ty po- skytuj´ı pestrou paletu moˇznost´ı. Pomoc´ı anotac´ı je moˇzn´enakonfigurovat mapov´an´ı vstupu do entity, validace a pˇr´ıpadn´edalˇs´ı vlastnosti. Je moˇzn´e pouˇz´ıvat tak´erozˇs´ıˇren´efunkce jako vlastn´ıvalid´atorpomoc´ı SymfonyValida- tor avˇsakpro tento je zapotˇreb´ıinstalace dalˇs´ıch bal´ıˇck˚u.Konfigurace je za mˇezcela dostaˇcuj´ıc´ıa tedy hodnot´ımzn´amkou 1

Celkov´e zhodnocen´ı

U Nette frameworku a rozˇs´ıˇren´ıApitte je velice pozitivn´ıpˇr´ıstupk dat˚um. Oproti jin´ymknihovn´ama pˇredchoz´ımverz´ımnette je vidˇetposun v kvalitˇe proveden´ı.Velmi kladnˇehodnot´ımmoˇznostv´ıceform´at˚ustejnˇejako moˇznosti konfigurace. Celkovˇeframework hodnot´ımzn´amkou 2

3.2.2.4 Hodnocen´ı Symfony Dokumentace

Dokumentace samotn´ehoSymfony frameworku je obs´ahl´a,avˇsakpostr´ad´am zde rozs´ahlejˇs´ı uk´azkyk´odu.Pˇri orientaci v dokumentaci mne pˇrekvapila nemoˇznostzobrazit kompletn´ı strukturu dokumentace. Nav´ıc pˇri orientaci v dokumentaci se menu mˇen´ı, a tedy v´ysledn´yefekt je matouc´ı. Samotn´a obs´ahlosta mnoˇzstv´ıinformac´ıv dokumentaci obsaˇzan´ejsou dostateˇcn´e,nicm´enˇe d´ıkynekonzistentn´ıorientaci v dokumentaci hodnot´ımnegativnˇe- tedy 4.

Jednoduchost pouˇz´ıv´an´ı

N´aroˇcnostpouˇz´ıv´an´ı bych hodnotil jako n´aroˇcnˇejˇs´ı a to zejm´enaz d˚uvodu vysok´emodularity syst´emu. Podobnˇejako u Magento 2 frameworku, je i zde probl´ems poˇc´ateˇcn´ım pouˇz´ıv´an´ım frameworku, nicm´enˇepo ˇcaseje pouˇzit´ı pˇrehlednˇejˇs´ı.Z tohoto d˚uvodu hodnot´ım n´aroˇcnostpouˇzit´ıza 3.

Podpora r˚uznych´ form´at˚u

Framework s rozˇs´ıˇren´ımpodporuje spoustu form´at˚u,vˇcetnˇestandardn´ıho JSON a XML form´atu.Stejnˇetak nechyb´ıani moˇznostdoplnit form´atvlastn´ı,tedy zde je framework nanejv´yˇsevstˇr´ıcn´ya hdnocen´ıtedy udˇelujivelmi kladn´e– 1.

Pr´ace s daty

Symfony spoleˇcnˇes rozˇs´ıˇren´ım FOSRestBundle[11] a rozˇs´ıˇren´ım SensioFra- meworkExtraBundle[12] poskytuje velice uˇziteˇcnoumoˇznostmapov´an´ıdo ob- jektov´ereprezentace (entity). Je tak´emoˇzn´edodat sv´evlastn´ı mapov´an´ı.

15 3. Analyza´

Podobn´ymmechanismem je pot´eobejtkov´areprezentace zpracov´av´anado v´ystupu,kter´yje opˇetmoˇzn´evracet z obsluˇzn´emetody. Zde hodnot´ıo nˇeco l´epe, neˇzpˇredchoz´ıˇreˇsen´ı,tedy 1.

Moˇznosti konfigurace Na tomto frameworku se mi l´ıb´ımoˇznostzvolit si zp˚usobkonfigurace. Na v´ybˇer je , xml a tak´e . U cest pro REST API a oblusˇzn´ych metod je moˇzn´e vyuˇz´ıvat tak´eanotac´ı,kter´eurˇcuj´ıtransformace na nejniˇzˇs´ı´urovni. Z tohoto pohledu je framework naprosto dostaˇcuj´ıc´ı.Hodnocen´ıje tedy nejlepˇs´ı,tedy 1.

Celkov´e zhodnocen´ı Celkovˇese mi na frameworku l´ıbilosmˇeˇrov´an´ısmˇeremk modularizaci a zno- vupouˇzitelnostikomponent, jako samostatn´ejednotky. D´ıkytomuto konceptu, je moˇzn´evyp´ınat/zap´ınatjednotliv´ebal´ıˇckydle potˇreby a dynamicky si obo- hatit sv´eREST API o dalˇs´ıfunkcionality. Ovˇsemd´ıkysloˇzitˇejˇs´ımu pouˇzit´ıa pro mˇene pˇr´ıliˇsdobˇrestrukturovan´edokumentaci mus´ımhodnotit celkovˇeza 2.

3.2.3 Z´avˇerhodnocen´ı V tabulce 3.1 m˚uˇzemenal´eztpˇrehledhodnocen´ı:

Laravel Magento 2 Nette Symfony Dokumentace 2 3 4 4 Jednoduchost pouˇz´ıv´an´ı 2 3 2 3 Podpora r˚uzn´ych form´at˚u 2 1 1 1 Pr´aces daty 2 1 2 1 Moˇznostikonfigurace 3 1 1 1 Celkov´ezhodnocen´ı 3 2 2 2 Tabulka 3.1: Pˇrehledhodnocen´ıjednotliv´ych framework˚u

Z pˇrehleduhodnocen´ıvid´ıme,ˇzekromˇeframeworku Laravel je hodnocen´ı napˇr´ıˇckategoriemi zhruba stejn´e,u zb´yvaj´ıc´ıch framework˚ubyla nejvˇetˇs´ısla- binou dokumentace a d´alejednoduchost pouˇz´ıv´an´ı.Zejm´enau jednoduchosti pouˇz´ıv´an´ıje komplikac´ıtak´eto, ˇzekaˇzd´yframework pouˇz´ıv´atrochu odliˇsn´e koncepty a d´ıkytomu v´yvoj´aˇrimus´ıvˇenovat v´ıceˇcasua ´usil´ıpro samotn´e pouˇz´ıv´an´ır˚uzn´ych framework˚u.

Dalˇs´ızaj´ımavost´ıje, ˇzeaˇckoli u ORM framework˚u,kde je nejrozˇs´ıˇrenˇejˇs´ım frameworkem Docrtine 2, kterou lze pouˇz´ıtnapˇr´ıˇcr˚uzn´ymiprojekty, mnohdy dokonce se stejn´ymientitami (existuje jist´apˇrenostielnostmezi projekty), pro

16 3.3. Poˇzadovan´afunkcionalita

REST API podobn´yframework nen´ı k dispozici. Jednou z moˇzn´ych pˇr´ıˇcit m˚uˇzeb´ytuzˇs´ıprov´azanostREST API na j´adroframeworku a business logiku, ovˇsemv kombinaci s pˇrenositeln´ymORM frameworkem vid´ım potenci´alv samostatnˇepouˇziteln´eknihovnˇe.

3.3 Poˇzadovan´afunkcionalita

C´ılemt´etopodkapitoly je hrubˇenast´ınitpoˇzadavky na funkcionality a fin´aln´ı pouˇzit´ı,kter´ese pokus´ımdos´ahnoutve vlastn´ımˇreˇsen´ı.

3.3.1 Oddˇelen´ıREST API a web kontroler˚u Pokud porovn´am Nette framework s Magento 2 frameworkem, tak si m˚uˇzu vˇsimnoutz´asadn´ıhorozd´ıluve zp˚usobuzpracov´an´ıpoˇzadavk˚u.T´ımrozd´ılem je pˇr´ıstupke zpracov´an´ıpoˇzadavk˚u.Zat´ımv Nette frameworku se setk´ame s pˇr´ıstupem, kdy REST API kontroler je rozˇs´ıˇren´ımklasick´ehoweb kontro- leru (v mnoh´ych pˇr´ıpadech, net´yk´ase ovˇsemAppite rozˇs´ıˇren´ı),v Magento 2 frameworku je tomu pˇresnˇenaopak. Tedy REST API sluˇzby vyuˇz´ıvaj´ıjin´y mechanismus zpracov´an´ıa jsou oddˇeleny od klasick´ych kontroler˚u.

Ve vlastn´ımˇreˇsen´ıbude upˇrednostnˇenpˇr´ıstups oddˇelen´ymREST API a webov´ymkontrolerem. T´ımbude do jist´em´ıryzajiˇstˇenanez´avislostna dan´em frameworku a celkovˇeto pˇrispˇejek znovupouˇzitelnostikomponent vytvoˇren´ych pro vlastn´ıknihovnu.

3.3.2 Podpora v´ıceform´at˚u Vˇsechny porovn´avan´eframeworky nˇejak´ymzp˚usobem nab´ızej´ıpodporu v´ıce form´at˚u,kter´em˚uˇzeuˇzivatel vyuˇz´ıt.Jedn´ase o velmi uˇziteˇcnoufunkciona- litu, kterou bych chtˇelzachovat i ve fin´aln´ımˇreˇsen´ı.Nejl´epe propracovanou stukturu vid´ımu frameworku Symfony, kdy je moˇzn´epomˇernˇesnadno dopl- nit dalˇs´ıform´atvyuˇziteln´ypro REST API. Podpora form´at˚uby pak mˇelab´yt zachov´anajak na vstupu, tak na v´ystupu.

Vlastnosti, kdy server vr´at´ıklientovi odpovˇed’ v poˇzadovan´emform´atuse ˇr´ık´a Content negotiation[10] , konkr´etnˇev t´etoknihovnˇebudeme vyuˇz´ıvat tzv. Server-driven content negotiation[10]. Rozliˇsen´ı,jak´yform´atbude pouˇzitse bude d´aleˇr´ıditpomoc´ı HTTP hlaviˇcekAccept a Content-Type.

3.3.3 Mapov´an´ıdo objektov´ereprezentace Velice uˇziteˇcn´ymn´astrojem pˇripr´acis REST API je jistˇemapov´an´ıvstupu do objektov´ereprezentace. To sam´eplat´ıpro v´ystup.Aby byla pr´aces vstu- pem nebo v´ystupem efektivn´ı.Obsluˇzn´ametoda by mˇelana vstupu dostat mapovan´yvstup, a na v´ystupuvr´atitobjekt, kter´yje urˇcenpro pˇreveden´ına

17 3. Analyza´

v´ystup.Dalˇs´ımpoˇzadavkem je moˇznostzpracov´avat sloˇzit´edatov´estruktury a tedy nutnost zajistit mapov´an´ınejen skal´arn´ıch hodnot, ale tak´esloˇzitˇejˇs´ıch objektov´ych struktur.

Mapov´an´ıv tomto pˇr´ıpadˇebude prov´adˇenopomoc´ıgetter˚ua setter˚u,je- likoˇzto d´ale umoˇzˇnujev´yvoj´aˇrirozˇs´ıˇren´ıfunkcionality, napˇr´ıkladpokroˇcilejˇs´ı transformace pˇr´ımov obejktu na z´akladˇehodnot. Tento pˇr´ıstuppouˇz´ıv´afra- mework Magento 2 a hodnot´ımjej velmi kladnˇe,proto byl zvolen pro v´ysledn´e ˇreˇsen´ı.

D´ıky tomuto z´ısk´av´yvoj´aˇrpˇresnˇejˇs´ı kontrolu nad daty a v´ysledn´aim- plementace v obsluˇzn´emetodˇese m˚uˇzezab´yvat ˇcistˇelogikou specifickou pro aplikaci.

3.3.4 Validace vstupu Validace dat jsou velmi d˚uleˇzit´esnad v kaˇzd´emAPI rozhran´ı(nejenom REST). C´ılemvalidace je zajistit, aby dan´apˇr´ıchoz´ıdata byla platn´aa nevznikaly probl´emy napˇr´ıklads datovou konzistenc´ı.Vstup bude ve v´ysledn´emˇreˇsen´ı typovˇevalidov´anjeˇstˇepˇredmapov´an´ımdo obejktov´ereprezentace. Dalˇs´ıpo- kroˇcilejˇs´ıvalidace (napˇr´ıkladplatnost relac´ına jin´eentity), bude moˇzn´ezajistit d´ıkymapov´an´ıpomoc´ısetter˚u,jak bylo zm´ınˇenov podkapitole 3.3.3.

3.3.5 Autentizace uˇzivatele Pokud chceme poskytovat rozs´ahlejˇs´ıREST API, kter´eumoˇzˇnujetak´e´upravu entit, avˇsaknechceme aby tato ´uprava byla provediteln´ak´ymkoli, je nutn´e zav´estjist´yzp˚usobautentizace. K tomuto ´uˇcelu bude knihovna samotn´aps´ana jako mezi vrstva – tzv. middleware – aby bylo moˇzn´ezaˇradit zpracov´an´ı knihovny aˇzpo definovan´eautentizaˇcn´ımechanismy. Tento mechanismus bude velice podobn´ytomu, kter´ypouˇz´ıv´aknihovna Apitte pro Nette. Samotn´aau- tentizace nem˚uˇzeb´ytsouˇc´ast´ıv´ysledn´eknihovny, jelikoˇzby to pˇrineslopˇr´ıliˇsn´e prov´az´an´ıs c´ılov´ymˇreˇsen´ım.

3.4 Dotazn´ıkov´eˇsetˇren´ı

Za ´uˇcelemovˇeˇren´ıd˚uleˇzitostir˚uzn´ych vlastnost´ıv´ysledn´eknihovny, jsem vy- pracoval dotazn´ıkzamˇeˇruj´ıc´ıse na zkuˇsenostia oˇcek´av´an´ıv´yvoj´aˇr˚upˇritvorbˇe REST API sluˇzeb.Sbˇerdat prob´ıhal v obdob´ı od 10.3.2020 do 15.4.2020. Bˇehemt´etodoby na dotazn´ıkodpovˇedˇelocelkem 35 responsent˚u.

Dotazn´ıkov´eˇsetˇren´ıbylo zvoleno aby bylo moˇzn´eporovnat vyspecifikovan´e poˇzedavky s re´alnoupotˇrebou uˇzivatel˚u,jelikoˇzv t´etopr´acivych´az´ımpˇrev´aˇznˇe z potˇreb,kter´evn´ım´amna r˚uzn´ych pozic´ıch v posledn´ıch letech. C´ılemdo- tazn´ıkuje tedy z´ısk´an´ıˇsirˇs´ıhopohledu na vˇeca v´ysledkydotazn´ıkuposlouˇz´ı

18 3.4. Dotazn´ıkov´eˇsetˇren´ı jako ukazatel, na kterou z vydefinovan´ych funkcionalit se ve v´ysledn´emˇreˇsen´ı zamˇeˇrit.

Dotazn´ıkbyl rozesl´anna poˇc´atkubˇrezna2020 tˇremihlavn´ımiinformaˇcn´ımi kan´aly, a to sice:

• Pomoc´ı firemn´ı platformy Slack (ve spoleˇcnosti,kde jsem v dobˇero- zesl´an´ıdotazn´ıkup˚usobil)

• PˇresFacebook skupiny, mezi spoluˇz´akyna FIT CVUTˇ

• Pomoc´ıemailov´ych kontakt˚una starˇs´ıspolupracovn´ıkya spoluˇz´akyze SPSEIˇ Ostrava

3.4.1 Clenˇen´ıdotazn´ıkuˇ

Dotazn´ıkje rozˇclenˇendo ˇctyˇrsekc´ıa to podle druhu informac´ı,kter´yse v dan´e sekci snaˇz´ım z´ıskat.Jedn´ase o n´asleduj´ıc´ısekce s uveden´ymv´yznamem:

Uvod´

C´ıl´ıpˇredevˇs´ımna z´akladn´ı´udaje o profilu program´atora,tedy s jak´ymin´astroji zat´ımpracoval, zda se aktivnˇevˇenuje v´yvoji v PHP a dalˇs´ıot´azkysmˇeˇrovan´e na jeho aktu´aln´ıstav. Na z´akadˇeodpovˇed´ızde uveden´ych se d´aleurˇc´ı,zda je nutn´eaby zodpov´ıdalot´azkyv sekci druh´e,nebo pˇrejderovnou do sekce tˇret´ı.

Tvorba REST API sluˇzeb v jazyce PHP

Snahou t´etosekce je z´ıskatinformace o tom, jak je konkr´etn´ıv´yvoj´aˇrspokojen s postupem tvorby REST API sluˇzebv jazyce PHP, jak´yframework povaˇzuje za nejlepˇs´ıa zda byly dan´en´astroje vyb´ır´any s ohledem na budouc´ıtvorbu REST API sluˇzeb.

Oˇcek´av´an´ı od n´astroj˚u

Jak´ajsou hlavn´ıoˇcek´av´an´ıod n´astroj˚upro tvorbu REST API, bez ohledu na framework, tedy co v´yvoj´aˇripovaˇzuj´ı za d˚uleˇzit´e,aby bylo ve v´ysledn´e implementaci zakomponov´ano.Z pohledu t´etopr´aceje tato sekce dotazn´ıku kl´ıˇcov´aa bude j´ıproto vˇenov´ananejvˇetˇs´ıpozornost.

Z´avˇer

Obsahuje z´akladn´ıdemografick´e´udaje o v´yvoj´aˇria jeho zaˇrazen´ıv pracovn´ım procesu.

19 3. Analyza´

3.4.2 V´ysledky dotazn´ıku Z celkov´eho dotazn´ıkubych nyn´ızd˚uraznilpˇredevˇs´ımsekci ˇc´ıslo3, jelikoˇzv n´ıse pojedn´av´ao oˇcek´av´an´ı,kter´am´av´yvoj´aˇrod zvolen´ehoˇreˇsen´ıa jakou hraj´ıroli. V tabulce 3.2 je vidˇetpˇrehledmoˇznost´ıa jakou v´ahu jim pˇrikl´adaj´ı responsenti:

Vlastnost Hodnocen´ı Moˇznostdefinovat validace nad daty 4,14 Rozs´ahlostdokumentace 3,86 Moˇznostsi flexibilnˇezadefinovat obsluˇzn´emetody 3,57 Podpora striktn´ıhotypov´an´ı 3,51 Vyˇsˇs´ım´ıraabstrakce - n´avrhna ´urovni interface 3,43 Snadn´ainstalace ˇreˇsen´ı 3,43 Podpora r˚uzn´ych datov´ych form´at˚u 3,34 Co vˇsesi m˚uˇzukonfigurovat bez z´asahu do k´odu 2,94 Tabulka 3.2: Pr˚umˇern´ezhodnocen´ıpoˇzadovan´ych vlastnost´ıdle responsend˚u

D´alev t´etosekci byla moˇznostpˇridatvlastn´ıpoˇzadovan´efunkcionality. Je- den respondent zd˚uraznilpotˇrebupodpory ORM entit, jeden oceˇnujemoˇznost generov´an´ıserveru i klienta z definice REST API (napˇr´ıkladze specifikace OpenAPI). D´alepak jeden resnpodent vyj´adˇriloˇcek´av´an´ıpodpory n´astroj˚u pro integraˇcn´ıtestov´an´ı.

Komplent´ıv´ysledkydotazn´ıkuje moˇzn´enal´eztna pˇriloˇzen´emm´ediujako pˇr´ılohu.

20 Kapitola 4

N´avrh

Tato kapitola se zab´yv´apodrobn´ymn´avrhemknihovny, vˇcetnˇevˇec´ı s t´ım souvijec´ıch, jako napˇr´ıkladpouˇzit´ıverzovac´ıch n´astroj˚u,zapracov´av´an´ıdalˇs´ıch verz´ıa celkovˇeproces˚ut´ykaj´ıch se v´ysledn´eknihovny.

4.1 Platforma

V´ysledn´aknihovna bude ps´anapro jazyk PHP ve verzi 7.2 kompatibiln´ı.Vzhle- dem k povaze knihovny nen´ınutn´evyb´ıratdatab´azi.

4.2 Verzov´an´ı

Jelikoˇzpl´anuji knihovnu d´aleupravovat, pˇr´ıpadnˇezveˇrejnit,je vhodn´ezvolit vyhovuj´ıc´ıverzovac´ıstrategii jiˇzna zaˇc´atkuprojektu. Za t´ımto ´uˇcelembyl zvolen n´astroj Git, kter´yposkytuje velice efektivn´ıspr´avuverz´ıa umoˇznuje zapojen´ıv´ıceautor˚u.

[13]V souˇcasn´edobˇeexistuje v´ıce strategi´ı,jak verzovat k´od,j´ase pokus´ım nejˇcastˇejˇs´ız nich popsat a vybrat takov´e,kter´ebude tomuto projektu nejv´ıce vyhovovat.

4.2.1 Centralized workflow

Jedn´ase o zp˚usobpr´aces n´astrojem GIT, kdy je na projektu udrˇzov´anje- den centr´aln´ıbod, ke kter´emu se vztahuj´ıvˇsechny zmˇeny prov´adˇen´euˇzivateli. V´yhodou tohoto workflow je jeho jednoduchost, kdy je nutn´eudrˇzovat pouze jednu hlavn´ıvˇetev– master.

Nev´yhodou tohoto workflow je naopak jeho n´ızk´aflexibilata, obt´ıˇzn´aspr´ava pˇr´ıspˇevk˚umimo t´ym/p˚uvodn´ıv´yvoj´aˇrea tak´enemoˇznost udrˇzen´ıv´ıcefunkˇcn´ıch

21 4. Navrh´ verz´ız´aroveˇn.Z tohoto pohledu se toto workflow jev´ız dlouhodob´ehohledika jako naprosto nevhodn´e,avˇsakv poˇc´ateˇcn´ı f´aziv´yvoje, zem´enajedn´a-lise projekt udrˇzov´anjedn´ımv´yvoj´aˇrem,jako je tato pr´ace,svou jednoduchost´ı zcela dostaˇcuje.

4.2.2 Feature branching workflow

Jedn´ase v podstatˇeo rozˇs´ıˇren´ıcentralizovan´ehoworkflow. Hlavn´ım rozd´ılemje to, ˇzeveˇsker´ynovˇevyv´yjen´yk´odje udrˇzov´anv samostatn´evˇetvi,tzv. feature branch. Jakmile je nov´afunkcionalita vyvinuta, je nejprve otestov´anaa teprve pot´ezahrnuta do hlavn´ıvˇetve, tzv. master branch.

V´yhodou je tedy ˇcist´avˇetev master, kter´aby nemˇelaobsahovat chybn´y k´oda mˇela by b´ytvˇzdyprovozu schopn´a.Dalˇs´ıv´yhodou je eliminace konflikt˚u pˇriv´yvoji v t´ymu.

Z pohledu t´etoz´avˇereˇcn´epr´aceje vˇsaki toto workflow z dlouhodb´eho hlediska nev´yhodn´e,a to sice z d˚uvodu obt´ıˇzn´epodpory v´ıcefunkˇcn´ıch verz´ı z´aroveˇn.Nevyhovuje ani v poˇc´ateˇcn´ıf´aziv´yvoje, jelikoˇzse nejedn´ao skupi- novou pr´aci.

4.2.3 Gitflow workflow

Jedn´ase o pomˇernˇepropracovan´eworkflow poskytuj´ıc´ıpodporu pro rychl´e opravy v k´oduu jiˇzzveˇrejnˇen´ych verz´ı,tzv. hotfix. Lze na nˇejpohl´ıˇzetjako na rozˇs´ıˇren´ı Feature branching workflow, avˇsakvˇetev,do kter´ev´yvoj´aˇrzapra- cov´av´asv´ezmˇeny nen´ı master, ale jedn´ase o develop, kter´ynemus´ıobsahovat vˇzdyspustiteln´yk´od, ale do kter´ehose integruj´ıvˇsechny vyvinut´efunkciona- lity pˇred zveˇrejnˇen´ımnov´everze.

Toto workflow se d´ad´alejednoduˇserozˇs´ıˇrito moˇznostpodpory v´ıce verz´ı souˇcasˇea to vyuˇzit´ım release verz´ıne jen jako integraˇcn´ıch a testovac´ıch vˇetv´ı pˇredzaˇclenˇen´ımdo master vetve, ale vyuˇz´ıv´an´ımtˇechto vˇetv´ıi po zaˇclenen´ı do master vˇetve jako z´azem´ıpro pˇr´ıpadn´eopravy ve chv´ıli, kdy je jiˇzvyd´ana novˇejˇs´ıverze.

Pro tento projekt se jedn´ao ide´aln´ıworkflow ve chv´ıli,kdy bude dokonˇcena prvn´ıverze a knihovna bude zpˇr´ıstupnˇenapro veˇrejnosta dalˇs´ıpˇrispˇevatele. D´ıky feature vˇetv´ımje moˇzn´ekontrolovat, kter´efunkcionality budou zaˇclenˇeny do nov´everze, stejnˇetak kontrolovat pˇr´ıpadn´ebugfixy.

Kompletn´ısch´ematohoto workflow lze nal´eztna obr´azku4.1:

22 4.2. Verzov´an´ı

Obr´azek4.1: Sch´emaGitflow

4.2.4 Forking workflow Jedn´ase o zcela odliˇsn´ypˇr´ıstupk p´acis n´astrojem GIT neˇzv pˇredchoz´ıch pˇr´ıpadech. Nen´ı zde totiˇzudrˇzov´anˇr´ydn´ycentr´aln´ı bod, kde by doch´azelo

23 4. Navrh´ k synchronizaci k´odus ostatn´ımiv´yvoj´aˇri.Kaˇzd´yv´yvoj´aˇrzapojen´ydo pro- jektu pracuje jednak na sv´elok´aln´ıkopii projektu, ale tak´evystavuje veˇrejnou podobu repozit´aˇre,kter´ymohou ostatn´ıv´yvoj´aˇrivyuˇz´ıt.

Toto workflow je ovˇsemproti z´amˇerut´etopr´acea to poskytnout v´yvoj´aˇr˚um knihvnu. Ta totiˇzmus´ıb´ytnˇekdepˇr´ıstupn´aa z pohledu t´etopr´aceby ned´avalo smysl aby byla distribuov´anatakto decentralizovanˇe.Proto nebude tohoto workflow nijak vyuˇzito.

4.2.5 Zvolen´eˇreˇsen´ı

Jelikoˇzz poˇc´atkuv´yvoje (obdob´ıtvorby t´etopr´ace)budu na projektu praco- vat pouze j´aa jelikoˇzse jedn´ao nov´yprojekt, nem´asmysl udrˇzovat sloˇzit´e workflow a tedy bude vyuˇzito Centralized workflow. V okamˇzikupˇr´ıpadn´eho zeveˇrejnˇen´ızdrojov´ych k´od˚upro veˇrejnosta umoˇznˇen´ıostatn´ımv´yvoj´aˇr˚um rozˇs´ıˇren´ıknihovny o dalˇs´ıfunkcionality, bude toto jednoduch´eworkflow na- hrazeno sofistikovan´ym Gitflow tak, jak bylo pops´anov kapitole 4.2.3.

4.3 Composer

Jedn´ase o n´astroj pro spr´avuz´avislost´ı.V komunitˇePHP v´yvoj´aˇr˚uje hojnˇe vyuˇz´ıv´ana um´ıpracovat tak´es n´astrojem GIT, kter´ybyl pops´anv kapitole 4.2. D´ıky Composeru, je moˇzn´eefektivnˇespravovat z´avislostina extern´ıch knihovn´ach, ˇr´ıditjejich verze, pˇr´ıpadnˇepublikovat vlastn´ıknihovnu pro ˇsirˇs´ı komunitu. Jelikoˇzje hojnˇevyuˇz´ıv´an,budu jej pouˇz´ıvat i ve v´ysledn´eknihovnˇe pr´avˇepro spr´avuverz´ıknihovny.

4.4 OOP Design a principy

Vytvoˇren´aknihovna bude ps´anaobjektovˇeorientovan´ympˇr´ıstupem. To s se- bou pˇrin´aˇs´ıtak´ezodpovˇednostza dodrˇzov´an´ıspr´avn´ehon´avrhu architektury. V t´etopodkapitole se budu vˇenovat d˚uleˇzit´ymOOP princip˚um,kter´eje tˇreba dodrˇzetza ´uˇcelem dosaˇzen´ıpokud moˇznovˇsech vyspecifikovan´ych poˇzadavk˚u. Z´akladn´ı principy pˇri n´avrhu v OOP jsou tzv. SOLID[14] principy, kter´e struˇcnˇepop´ıˇsiv t´etokapitole.

4.4.1 Princip jedn´eodpovˇednosti

Jedn´ase o velice jednoduch´yprincip, kter´yˇr´ık´a,ˇzekaˇzd´atˇr´ıdaby mˇelam´ıt pouze jednu zodpovˇednost(jeden d˚uvod ke zmˇenˇe).Pouˇzit´ıtohoto principu vede na mnoho menˇs´ıch tˇr´ıd,kter´epak lze samostatnˇeudrˇzovat a to vede k vˇetˇs´ıudrˇzitelnostisyst´emu. Rovnˇeˇzpˇrisp´ıv´ak moˇzn´emodularitˇesyst´emu, jelikoˇznab´ız´ıv´ıcemoˇznost´ık rozdˇelen´ın´avrhu na jednotliv´eoblasti.

24 4.5. PHP-FIG PSR

4.4.2 Princip otevˇrenostia uzavˇrenosti

Tento princip n´amˇr´ık´a,ˇzetˇr´ıdyby mˇelyb´ytnavrˇzeny tak, aby bylo moˇzn´eje rozˇs´ıˇritide´alnˇebez z´asahu do existuj´ıc´ıhok´odu.D´ıkytomuto se sn´ıˇz´ıriziko, ˇze pˇripˇrepisov´an´ıjedn´eˇc´astiaplikace poˇskod´ımeˇc´astijin´e.Kl´ıˇcempro spr´avnou aplikaci tohoto principu je hojn´evyuˇzit´ıabstrakce a polymorfismu.

4.4.3 Liskovov´eprincip zamˇenitelnosti

Velice jednoduch´y,ale velice jednoduˇseporuˇsiteln´yprincip, kter´yn´amˇr´ık´a,ˇze pokud m´amenˇejakou b´azovou tˇr´ıdu,kterou nahrad´ımjej´ımpotomkem, pak bude implementace fungovat korektnˇei s t´ımto potomkem. D´ıkytomuto prin- cipu je jasn´e,ˇzekaˇzd´apodtˇr´ıdamus´ıb´ytschopna poskytnout stejn´evlastnosti jako tˇr´ıdab´azov´a.Pr´avˇed´ıkyt´eto vlastnosti je moˇzn´eefektivnˇea jednoduˇse rozˇsiˇrovat v´ysledn´ysyst´em/knihovnu.

4.4.4 Princip oddˇelen´ırozhran´ı

V z´asadˇeˇr´ık´a,ˇzev´ıcer˚uzn´ych rozhran´ıje lepˇs´ıch, neˇzjedno velk´euniverz´aln´ı. Pokud m´amejedno spoleˇcn´erozhran´ı,ovˇsemjeho funkcionality spolu pˇr´ıliˇs nesouvis´ı, pak se rozr˚ust´aokruh tˇr´ıd, kter´ena dan´emrozhran´ı z´avis´ı a v pˇr´ıpadˇe´upravy je pot´en´aroˇcn´ekontrolovat zmˇeny, kter´eby mohly ovlivnit vˇsechny tˇr´ıdy, kter´eby mohly rozhran´ı pouˇz´ıvat. Pr´avˇed´ıky tomu je lepˇs´ı rozhran´ırozdˇelovat. Je vˇsaktˇrebad´avat pozor na vhodnou granularitu, jelikoˇz by striktn´ıdodrˇzov´an´ıtohoto principu mohlo vy´ustitv pˇr´ıliˇsmnoho drobn´ych rozhran´ı.

4.4.5 Princip obr´acen´ız´avislost´ı

Jedn´ase o princip vyˇzaduj´ıc´ıaby z´avislostibyly vˇzdyna abstraktn´ıma ne na konkr´etn´ım.Tedy podle totoho principu je nutn´e,aby konkr´etnˇejˇs´ıimplemen- tace z´aviselana abstraktnˇejˇs´ı,ne naopak. D´ıkytomuto principu v kombinaci s Liskovov´eprincipu zamˇenitelnosti je moˇzn´ejednoduˇsemˇenitimplementace dan´efunkcionality bez vˇetˇs´ıhoz´asahu do k´odu.

4.5 PHP-FIG PSR

PHP-FIG[15] nab´ız´ıPHP standardy – tzv. PSR – kter´e,pokud chceme m´ıt knihovnu kterou bude vyuˇz´ıvat v´ıcelid´ı,je dobr´edodrˇzovat. V t´etokapitole se budu vˇenovat d˚uleˇzit´ymstandard˚um,kter´evyuˇzijipˇriimplementaci a budu je aktivnˇevyuˇz´ıvat.

D´ıky tˇemto standard˚uma jejich dodrˇzov´an´ı je moˇzn´ejednotliv´ekom- ponenty pˇren´aˇsetmezi frameworky. A protoˇzec´ılemt´etopr´aceje knihovna

25 4. Navrh´ pˇrenositeln´amezi frameworky, pak je budu dodrˇzovat. V n´asleduj´ıc´ıch kapi- tol´ach pop´ıˇsistandardy, kter´ebudu nejˇcastˇejipouˇz´ıvat.

4.5.1 PSR-1

Jedn´ase o z´akladn´ıstandard, kter´yje trouf´amsi ˇr´ıctt´ımz´akladn´ım,co by mˇel v´yvoj´aˇrdodrˇzovat. Jedn´ase o popis vzhledu PHP souboru, kter´yby byo dobr´e dodrˇzovat kv˚uliˇcitelnosti.V mnoha firm´ach je tento standard vyˇzadov´an a je podporov´antak´ev mnoh´ych IDE. Nedodrˇzov´an´ıtohoto standardu vede k neˇciteln´emu, nebo tˇeˇzceˇciteln´emu k´odu,kter´yje obt´ıˇzn´eudrˇzovat.

4.5.2 PSR-4

D´ıkytomuto standardu je moˇzn´evyuˇz´ıvat knihovnu i mimo definovan´eprostˇred´ı. Standard popisuje jak m´avypadat adres´aˇrov´astruktura, aby bylo moˇzn´e tˇr´ıdya rozhran´ınaˇc´ıtatdynamicky. Tento standard je uˇz´ıv´anve spojistosti s n´astrojem Composer, kter´ybyl pops´anv kapitole 4.3.

4.5.3 PSR-7

Tento standard je pro tuto pr´acisnad nejd˚uleˇzitˇejˇs´ım.Popisuje totiˇzpr´acis HTTP poˇzadavky, jejich obsahem a obecnˇepopisuje, jak m´adan´erozˇs´ıˇren´ı zpracov´avat poˇzadavky a jak´en´astroje m´ak dispozici. Pr´avˇed´ıky tomuto standardu bude moˇzn´evyuˇz´ıvat v´yslednouknihovnu v r˚uzn´ych frameworc´ıch (kter´eposkytuj´ıimplementaci PSR-7 standardu).

4.5.4 PSR-11

Standard poskytuj´ıc´ırozhran´ıpro kontejner z´avislost´ı.D´ıkytomuto standardu nemus´ımv knihovnˇespecifikovat a popisovat vkl´ad´an´ız´avislost´ıa vyhled´av´an´ı sluˇzeb,ale m˚uˇzusi pohodlnˇevyˇz´adatkontejner, kter´ymi dan´esluˇzby poskytne i se z´avislostmi.

4.6 Implementaˇcn´ın´avrhj´adraknihovny

D´ıkyprincip˚umpopsan´ych v kapitole 4.4 a d´ıkyznalosti poˇzadavk˚uz kapitoly 3.3 m˚uˇzeme nyn´ı navrhnout knihovnu tak, aby bylo moˇzn´eknihovnu d´ale pouˇz´ıvat v r˚uzn´ych frameworc´ıch.

Bˇehemn´avrhu je nutn´ebr´atv ´uvahu pˇr´ıpadnoumoˇznostimplementaˇcn´ı zmˇeny dan´ych sluˇzeb.D´ıkytomu by se mˇeln´avrhpohybovat v maxim´aln´ı moˇzn´em´ıˇrena ´urovni rozhran´ı.Konkr´etn´ıimplementace bude dod´anaposl´eze kontejnerem c´ılov´eaplikaci.

26 4.6. Implementaˇcn´ın´avrhj´adraknihovny

Jednotliv´ed´ılˇc´ıimplementace knihovny pro pouˇzit´ıv r˚uzn´ych frameworc´ıch se d´ıkytomu m˚uˇzeliˇsita dod´avat sv´evlastn´ıspecifick´e´upravy pro danou sluˇzbu.

4.6.1 J´adroknihovny

Aby bylo moˇzn´epouˇz´ıvat knihovnu efektivnˇev r˚uzn´ych prostˇred´ıch, byla zvo- lena jak implementace jako koncov´erozhran´ı,tak jako middleware. To zna- men´a,ˇzeprogram´atorpouˇz´ıvaj´ıc´ıtuto knihovnu se m˚uˇzerozhodnout, jak ji zaˇclen´ıdo sv´ehok´odu.

Samotn´ej´adroje nutn´erozdˇelitna d´ılˇc´ısluˇzby, kter´ezajiˇst’uj´ıpodporu pro r˚uzn´efunkˇcn´ıcelky. Toto ˇclenˇen´ıbylo zvoleno zejm´enakv˚uliudrˇzitelnosti v´yvoje do budoucna. Sluˇzby, na kter´ese j´adrodˇel´ıjsou:

RestCore

Tato sluˇzbaby mˇela b´ytvstupn´ımbodem do knihovny. Poskytuje dvˇemˇetody, kdy jedna slouˇz´ıjako middleware - tedy pˇrij´ım´apoˇzadavek a odpovˇed’, po- tencion´alnˇepˇredszpracovanou jinou sluˇzbou, a vrac´ıodpovˇed’ obohacenou o vlastn´ı data. Poˇzadavek i odpovˇed’ jsou vyˇzadov´any dle doporuˇcen´ı PSR- 7, tedy jak´ykoli framework dodrˇzuj´ıc´ınebo poskytuj´ıc´ıPSR-7 implementaci HTTP poˇzadavku a odpovˇedibude moci vyuˇz´ıttuto knihovnu.

Router

Tato sluˇzbaslouˇz´ık vyhled´an´ıvhodn´ehokoncov´ehobodu (rzv. endpoint) pro pˇr´ıchoz´ı poˇzadavek a pokud nalzne vhodn´yendpoint, pak vr´at´ı jeho meta informace. O tom, jak´aje pouˇziteln´aHTTP metoda a jak´ym´ab´ytvzor pro URL (regex URL patter) rozhoduje samodn´yendpoint.

Vzhledem k odliˇsnostipˇr´ıstupuke konfiguraˇcn´ımsoubor˚umv r˚uzn´ych fra- meworc´ıch a r˚uzn´ymmoˇznostemparsov´an´ıjak soubor˚u,tak k´odu,je navrˇzeno ˇreˇsen´ıkdy knihovna vyˇzadujeobjekt, kter´yv sobˇedrˇz´ıinformace o dostupn´ych cest´ach. Tento objekt ve v´ysledn´eknihovnˇebude vych´azetz rozhran´ı Holde- rInterface, kter´eposkytuje jednoduchou metodu pro manipulaci s endpointy. Pro pohodlnou manipulaci s t´ımto objektem je navrˇzeno, aby implementoval rozhran´ı Iterator.

Samotn´yzp˚usobnaˇc´ıt´an´ıdostupn´ych cest, at’ uˇzz konfigurac´ı,nebo z k´odu (anotac´ı),je ponech´anna d´ılˇc´ıch podp˚urn´ych implementac´ıch pro konkr´etn´ı ˇreˇsen´ı.

27 4. Navrh´

Dispatcher Tato sluˇzbaby mˇelab´ytvol´anave chv´ıli,kdy je zn´am´e,kter´yendpoint bude obsluhov´an. Ukolem´ Dispatcher sluˇzby je zajistit spr´avn´ezjiˇstˇen´ıvstupn´ıch parametr˚upro poˇzadovanou cestu, spr´avn´enamapov´an´ızjiˇstˇen´ych parametr˚u a v neposledn´ıˇradˇetak´ezpracov´an´ıv´ystupuz obluhovan´emetody.

Dispatcher spol´eh´ana pˇr´ıtomnostpoˇzadovan´emetody v PSR-11 kontej- neru, tedy kontejneru, kter´ym´azajistit spr´avn´eposkytnut´ısluˇzebdle dan´eho typu. D´ıkypouˇzit´ıPSR-11 kontejneru je moˇzn´evyˇzadovat i sloˇzitˇejˇs´ıobjekty, kter´epˇr´ıpadnˇevyˇzaduj´ıdalˇs´ız´avislosti.

Ve chv´ıli, kdy z nˇejak´ehod˚uvodu nen´ı moˇzn´eobslouˇzitpoˇzadavek, coˇz m˚uˇzeb´ytzp˚usobeno napˇr´ıkladchybˇej´ıc´ımparametrem, nebo poskytnut´ıpa- rametru jin´ehoneˇzoˇcek´avan´ehotypu, je vytvoˇrenav´yjimkaa tato je d´ale zachycena a zpracov´anasluˇzbou ExceptionMapper.

ExceptionMapper Tato sluˇzbam´aza ´ukol mapovat v´yjimkuna vstupu do odpov´ıdaj´ıc´ıstruktury na v´ystupu.Za t´ımto ´uˇcelemje vytvoˇrenpomocn´yobjekt, viz kapitola 4.6.6. Sluˇzbaje zde zˇr´ızenapˇredevˇs´ımza ´uˇcelembudouc´ırozˇsiˇritelnostidle pˇr´an´ı program´atora,kter´ybude knihovnu vyuˇz´ıvat, protoˇzeposkytuje moˇznostma- povat r˚uzn´etypy v´yjimekdo r˚uzn´ych sturktur.

Vyuˇzit´ım˚uˇzeb´ytnapˇr´ıklad,pokud v aplikaci pouˇz´ıv´amv´yjimky NoSu- chEntityException a DuplicateEntryException, m˚uˇzukaˇzdouz nich namapo- vat do jin´estuktury, kterou posled´ezeknihovna vyrenderuje do v´ysledn´eho form´atutak, aby bylo moˇzn´eji zobrazit klientovi.

4.6.2 Form´aty Jak bylo deklarov´anov kapitole 3.3.2, ne nutn´ezajistit podporu v´ıceform´at˚u pro danou knihovnu a ne se jen spol´ehatna pˇredemdefinovan´evstupn´ı/v´ystupn´ı form´aty. Za t´ımto ´uˇcelem je navrˇzenorozhran´ı FormatInterface, kter´eobsa- huje metodu, kter´adefinuje metodu, d´ıky kter´eje moˇzn´ezjistit, zda dan´y form´at(na z´akladˇemime-type) je moˇzn´evyuˇz´ıt.

Z´aroveˇnposkytuje gettery pro tzv. Reader a Writer, tedy objekty, kter´e se d´alestaraj´ıo konverzi dat ze vstupu na intern´ıreprezentaci a obr´acenˇe. Form´atbude moˇzn´enadefinovat pouze jako vstupn´ı,pˇr´ıpadnˇev´ystupn´ına z´akladˇedostupn´ych Reader˚ua Writer˚u.

Zp˚usobudrˇzov´an´ıseznamu dostupn´ych form´at˚ubude realizov´anpodobnˇe, jako seznam dostupn´ych endpoint˚ua to s ohledem na vyˇsˇs´ım´ırukonfigurova- telnosti. D´ıkytomuto zp˚usobuje moˇzn´eprov´estnapojen´ına v´ysledn´eˇreˇsen´ı.

28 4.6. Implementaˇcn´ın´avrhj´adraknihovny

4.6.3 Reflexe

Jelikoˇzv knihovnˇebudeme ˇcastopracovat s reflex´ı[16], a to zejm´ena pˇrima- pov´an´ıobejkt˚ua jejich n´asledn´edekompozici zpˇetdo asociativn´ıho pole, je zde navrˇzenovyuˇz´ıtzastˇreˇsuj´ıc´ısluˇzby nazvan´e ReflectionHolder. Tato sluˇzba bude m´ıtna starosti spr´avn´ezjiˇst’ov´an´ıvstupn´ıch parametr˚upro settery a v´ystupn´ıch parametr˚upro gettery.

Pro pr´acis reflex´ıje vhodn´epouˇz´ıtnˇejakou z jiˇzexistuj´ıc´ıch knihovnen. Pro realizaci t´etoknihovny bylo zvoleno pouˇzit´ıknihovny -code[17] (dˇr´ıve zn´am´atak´ejako zend-code). Knihovna bylo zvolena pro svou jednoduchost pouˇzit´ı.

4.6.4 Mapov´an´ıvstupn´ıch dat

Ukolem´ knihovny je mimo jin´ezajiˇstˇen´ımapov´an´ıvstupn´ıch dat pro obluˇznou metodu, kdy pro zajiˇstˇen´ı spr´avn´ehomapov´an´ı a rozˇsiˇritelnostije vyuˇzito podobn´ehoprincipu jako u form´at˚u– tedy ˇzeexistuje jedna sluˇzbadrˇz´ıc´ı vˇsechny dostupn´emapovac´ıstrategie. Mapovac´ıstrategie budou realizov´any pomoc´ıtzv.: Mapper˚u a je pro to vyhrazeno rozhran´ı MapperInterface.

V z´akladn´ımstavu poskytuje knihovna mapov´an´ıpro vˇsechny primitivn´ı datov´etypy, objektov´emapov´an´ıa tak´emapov´an´ıpro objektovˇerelaˇcn´ıfra- mework Doctrine 2, resp. jeho entity.

Mapov´an´ıdo objekt˚uje prov´adˇenopomoc´ısetter˚u,coˇzpro ´uˇcelyknihovny jsou vˇsechny metody zaˇc´ınaj´ıc´ıkl´ıˇcovou pˇredponou set. Seznam tˇechto metod, vˇcetnˇejejich typ˚ubude z´ısk´anza pomoc´ıreflexe z ReflectionHolder kontej- neru. Struktura mapov´an´ı by mˇelab´yttakov´a,aby podporovala i vnoˇren´e datov´estruktury.

D´ıkymapov´an´ıpomoc´ısetter˚ubude moˇzn´ezav´estsloˇzitˇejˇs´ıvalidace spo- jen´e s business logikou pˇr´ımo v dan´e entitˇe. D´ıky prov´az´an´ı r˚uzn´ych va- lidaˇcn´ıch framework˚ua technik na dan´ec´ılov´eˇreˇsen´ı,bylo zvoleno z´akladn´ı typov´evalidov´an´ıv knihovnˇe,ale pokroˇcilejˇs´ıvalidaˇcn´ıpravidla souvisej´ıc´ıs business logikou aplikace necht’ jsou prov´adˇeny v pˇr´ısluˇsn´ych setterech.

U jednotliv´ych mapper˚umus´ıb´ytmoˇzn´eurˇcit,kter´ehotypu vstupu se mapper t´yk´a.Oblasti, kter´ych se m˚uˇzemapper t´ykatjsou:

• URI poˇzadavku

• Query string poˇzadavku

• Samotn´etˇelopoˇzadavku

29 4. Navrh´

4.6.5 Mapov´an´ıv´ystupn´ıch dat

Podobnˇejako u vstupu, kdy je moˇznomapovat vstupn´ıdata do objektov´e reprezentace, knihovna by mˇelaposkytovat tak´ezp˚usobjak mapovat objekty na v´ystupu do form´atupoˇzadovan´ehoklientem.

Sluˇzba,kter´atoto bude zajiˇst’ovat se bude jmenovat ServiceOutputPro- cessor a bude prov´adˇetmapov´an´ıobjekt˚udo asociativn´ıhopole na z´akladˇe getter˚u,tedy metody zaˇc´ınaj´ıc´ına kl´ıˇcovou pˇredponu get a poskytuj´ıc´ıhod- noty pro dan´yatribut. Zde je opˇethojnˇevyuˇzit ReflectionHolder k z´ısk´av´an´ı pˇr´ısluˇsn´ych informac´ı.

Mapov´an´ıv´ystupn´ıch dat, stejnˇejako mapov´an´ıvstupn´ıch dat, je navrˇzeno tak, aby bylo moˇzn´ezpracov´avat i sloˇzitˇejˇs´ıdatov´estruktury.

4.6.6 Zpracov´an´ıpoˇzadavku

Zpracov´an´ı poˇzadavku provede, jak bylo pops´anov kapitole 4.6.1, sluˇzba Dispatcher. Tato sluˇzbajist´ız pˇr´ıchoz´ıhopoˇzadavku v jak´ych form´atech ko- munikovat s klientem a v jak´emform´atukomunikuje klient samotn´y(je tedy moˇzn´epouˇz´ıtr˚uzn´eform´aty pro vstup a pro v´ystup).

V n´asleduj´ıc´ımkroku by si mˇel Dispatcher zjistit dostupn´ea poˇzadovan´e hodnoty na vstupu. Pro zjiˇstˇen´ı poˇzadovan´ych hodnot servisn´ı metody je nutn´epouˇz´ıtreflexi[16], kterou budeme ˇcastovyuˇz´ıvat a proto je pro ni zˇr´ızena speci´aln´ısluˇzba,tzv. ReflectionHolder. V´ıceo reflexi v kapitole 4.6.3

Po zjiˇstˇen´ıdostupn´ehoform´atuje provedena konverze vstupn´ıch hodnot do poˇzadovan´ych parametr˚uservisn´ımetody. D´ıkytomuto se uˇzivatel pouˇz´ıvaj´ıc´ı tuto knihovnu nemus´ıstarat o konverze, ani to, kde vz´ıtdan´ehodnoty. Jen- doduˇseuvede poˇzadovan´ytyp a ten n´aslednˇedostane.

N´aslednˇeje obluˇzn´ametoda poˇzadavku zavol´ana a jej´ı v´ystupje pot´e mapov´anjako odpovˇed’ klientovi. Odpovˇed’ m˚uˇzeb´ytr˚uzn´ych typ˚u,pˇriˇcemˇz existuj´ır˚uzn´apravidla pro mapov´an´ır˚uzn´ych typ˚u.

MinimalisticResponse

Pokud je vr´acenatato odpovˇed’, pak je jako v´ystupzpracov´anne cel´yobjekt, ale jeho data, ktr´avloˇzilpˇredvytvoˇren´ımtohoto objektu uˇzivatel. V´yhodou pouˇzit´ıtohoto objektu pro v´ystupje moˇznostdefinovat si n´avratov´yk´od,kter´y bude navr´acenklientovi.

30 4.6. Implementaˇcn´ın´avrhj´adraknihovny

ResponseInterface Pokud je z obluˇzn´emetody navr´acenobjekt implementuj´ıc´ı ResponseInterface, pak je z Dispatcheru vr´acenpˇr´ımotento objekt, jelikoˇzje zde pˇredpoklad, ˇze uˇzivatel v´ıco dˇel´aa odpovˇed’ n´aleˇzitˇezpracoval jiˇzdˇr´ıve.

Ostatn´ı typy Jak´ykoli jin´ytyp je mapov´anpomoc´ıtzv. ServiceOutputProcessoru, kter´yse star´ao pˇreveden´ıpˇr´ıpadn´eobjektov´ereprezentace do asociativn´ıhopole, kter´e je d´alekonvertov´anodo pˇr´ısluˇsn´ehoform´atu,jak bylo pops´anov kapitole 4.6.5 a 4.6.2.

4.6.7 Pˇr´ıkladybudouc´ıhouˇzit´ı Tato kapitola je urˇcen´apro bliˇzˇs´ıilustraci v´ysledn´ehopouˇzit´ıknihovny, spoleˇcnˇe s bliˇzˇs´ımpopisem tak, aby ˇcten´aˇrz´ıskalpˇredstavu o v´ysledn´emproduktu.

Z´akladn´ı uˇzit´ı knihovny Z´akladn´ıuˇzit´ıknihovny by mˇelob´ytvelice jednoduch´e.Staˇc´ıspr´avnˇeuv´adˇet typy, kter´eoˇcek´av´amna vstupu a kter´eposkytuji na v´ystupudan´eobluˇzn´e metody. N´aslednˇestaˇc´ızaregistrovat URI, kter´epovede k dan´eobluˇzn´eme- todˇea to je vˇse.Pro koncov´eho program´atoraby to mˇeloznamenat minimum konfigurace.

Mapov´an´ı s ORM objekty N´asleduj´ıc´ıpˇr´ıkladilustruje jednoduchost pouˇzit´ıve spojen´ıs ORM framewor- kem Doctrine 2. V pˇr´ıkladulze vidˇet,ˇzevyˇzadovan´ytyp na vstupu je Library.

31 4. Navrh´

Pokud je Library entita spravovan´apomoc´ıDoctrine 2 a j´am´amdefinova- nou cestu ke zdroji jako api/v1/library/:lib/booksAvailable, kde m´ısto parametru :lib dosad´ımkonkr´etn´ıID knihovny, pak se mapov´an´ıpostar´a o naˇcten´ı dan´eentity a j´aji m´amjako program´atork dispozici v obluˇzn´e metodˇe.

V pˇr´ıpadˇe,ˇzedan´aentita neexistuje, je vyhozena v´yjimka,kterou m˚uˇzu pohodlnˇenamapovat d´ıky ExceptionMapper sluˇzbˇe,kter´aje pops´anav kapi- tole 4.6.1.

getBooksAvailable(); } }

Jak si tak´em˚uˇzetevˇsimnout, n´avratov´ytyp uveden´yv PHP je array, ale re´alnˇese jedn´ao pole objekt˚utypu Book. Knihovna si tuto informaci spr´avnˇe zpracuje z anotace a provede pˇr´ısluˇsn´emapov´an´ıodpov´ıdaj´ıc´ıdan´emu typu.

32 Kapitola 5

Realizace

V t´etokapitole se budu vˇenovat v´ystup˚umpraktick´eˇc´astit´etopr´acea po- stup˚um,kter´evedly k jejich dokonˇcen´ı.

5.1 Postup realizace

V t´etokapitole pojedn´av´amo postupu relalizace dan´eknihovny v kontextu cel´epr´ace. Pro spr´avnouimplementaci bylo zapotˇreb´ınejprve pˇren´estn´avrhdo definovan´ych rozhran´ıv jazyce PHP. Rovnˇeˇzbylo zapotˇreb´ıvytvoˇren´ıbal´ıˇcku pro danou knihovnu.

Uvodn´ıf´aze´ Po zapracov´an´ırozhran´ıv jazyce PHP zaˇcalaimplementace hlavn´ıch kom- ponent, kter´ese staraj´ıo ˇzivotn´ıcyklus dan´ehopoˇzadavku. Pro snadnˇejˇs´ıa rychlejˇs´ıtestov´an´ıbylo jiˇzv prvotn´ıf´aziimplementace rozhodnuto o paraleln´ı implementaci referenˇcn´ıhopouˇzit´ıve frameworku Nette (v´ıceo referenˇcn´ıim- plementaci v kapitole 7).

Paraleln´ıimplementace umoˇzˇnilavyzkouˇsetsi aktu´aln´ırozpracovanou kni- hovnu, ale vyˇzadovalo to tak´estriktn´ıdodrˇzov´an´ırozhran´ı,kter´eknihovna obsahuje a mˇelaby obsahovat z d˚uvodu rozˇsiˇritelnostia pˇrenositelnosti.

Bˇehem´uvodn´ı f´azebylo rozhodnuto o implementaci tˇr´ı form´at˚u,kter´e m˚uˇzeuˇzivatel knihovny pouˇz´ıttak jak jsou. Jedn´ase o form´at JSON, XML a CSV.

Hlavn´ıf´azev´yvoje Bˇehemhlavn´ıf´azev´yvoje byly vyvinuty veˇsker´ekomponenty, do funkˇcn´ıho stavu a rovnˇeˇzjsem zaˇcalps´attesty pro kl´ıˇcov´ekomponenty knihovny (v´ıceo

33 5. Realizace testov´an´ıv kapitole 6). Bˇehemv´yvoje knihovny jsem se nepot´ykalse z´avaˇznˇejˇs´ımi probl´emy a knihovna vznikla bez nutnosti v´yraznˇemodifikovat n´avrh.

Bˇehemt´etof´azevˇsakdoˇslok situaci, kdy pr´aces reflex´ı byla ˇcastose opakuj´ıc´ı a bylo tedy nutn´eji v´ıce uhladit. Kv˚ulit´etoskuteˇcnostijsem se rozhodl k dalˇs´ıf´azi.

Refaktoring Po dokonˇcen´ıintenzivn´ıhov´yvoje bylo nutn´euhladit pr´acitak, aby zbyteˇcnˇe neobsahovala opakuj´ıc´ıc se k´oda byla co nejv´ıce minim´aln´ı (a d´ıky tomu udrˇziteln´ado budoucna). Kv˚ulit´etoskuteˇcnostin´asledoval refaktoring k´odu, tedy pˇreskupen´ıurˇcit´ych ˇc´ast´ık´odudo logick´ych celk˚u.

Tuto f´azipovaˇzujiza velmi d˚uleˇzitou, aˇcse nejedn´ao refaktoring v prav´em slova smyslu. Je d˚uleˇzit´apr´avˇed´ıkyskuteˇcnosti,ˇzedˇel´ak´odpˇrehlednˇejˇs´ıa mnohem v´ıceudrˇziteln´y.

Oprava chyb Na z´avˇerbyly doplnˇeny vznikl´etestovac´ısc´en´aˇreo jeˇstˇev´ıcepˇr´ıpad˚ua byly odhaleny chyby v r˚uzn´ych ˇc´astech knihovny. Zejm´enase jednalo o chyby v renderov´an´ıa konverze obsahu z a do form´atu XML. V z´avˇereˇcn´ef´azibyly tyto chyby zapracov´any a bylo doc´ılenofunkˇcn´ıhostavu knihovny.

5.2 Instalaˇcn´ıpˇr´ıruˇcka

Knihovna je psan´apro verzi PHP 7.2 a vyˇsˇs´ı.Instalace knihovny vyˇzaduje pouˇzit´ı n´astroje Composer[18]. Jelikoˇzse v dobˇezveˇrejnˇen´ı t´etopr´acene- jedn´ao veˇrejnˇepˇr´ıstupnou knihovnu, je nutn´esi st´ahnoutpˇr´ılohu t´etopr´ace a postupovat dle n´avodu v dokumentaci n´astroje Composer – konkr´etnˇese jedn´ao instalaci pomoc´ıartefaktu[19].

Pro r˚uzn´eframeworky je pot´enutn´einstalovat a nebo vytvoˇritmezivrstvu mezi c´ılovou aplikac´ıa knihovnou. V´ıceinformac´ınaleznete v kapitole 7 o referenˇcn´ıimplementaci.

5.3 Program´atorsk´adokumentace

Dokumentaci pro v´yvoj´aˇre,vˇcetnˇeuk´azkov´ehopouˇzit´ılze nal´eztv pˇr´ılozeve sloˇzce /lib/core/doc ve form´atuMarkdown[20]. V pˇriloˇzen´edokumentaci lze nal´eztdetailnˇejˇs´ıuk´azkypouˇzit´ı,vˇcetnˇedetailnˇejˇs´ıhopopisu vnitˇrn´ıar- chitektury. Pokud by to bylo nutn´e,je moˇzn´evygenerovat tak´edokumentaci z PHPDoc[21] anotac´ı.

34 5.4. Zhodnocen´ıv´ysledn´eknihovny

Aby bylo moˇzn´egenerovat dokumentaci pomoc´ı n´astroje phpDocumen- tor[22], bylo nutn´edodrˇzovat z´asadu,ˇzeveˇsker´yk´odje zdokumentov´an.To tak´eumoˇzˇnujˇedalˇs´ımv´yvoj´aˇr˚um,kteˇr´ıby se chtˇelido projektu zapojit ve snadnˇejˇs´ıorientaci v k´odu.

5.4 Zhodnocen´ıv´ysledn´eknihovny

V´ysledkem realizace je praktick´a,minimalistick´aknihovna, kter´yje velice snadno pˇrenositeln´amezi frameworky a splˇnujem´aoˇcek´av´an´ı.Je moˇzn´eji vyuˇz´ıtpro mapov´an´ısloˇzit´ych struktur, stejnˇejak jako i jednoduˇsˇs´ıch apli- kac´ı.

Knihovna jako takov´aposkytuje tak´emoˇznostnavrhnout API na z´akladˇe interfacu – tedy je moˇzn´evyuˇz´ıtvyˇsˇs´ım´ıruabstrakce jak u entit, tak u ser- visn´ıch metod, coˇzje velice uˇziteˇcn´avlastnost pr´avˇez d˚uvodu pˇrenositelnosti a udrˇzitelnosti.

35

Kapitola 6

Testov´an´ı

Ned´ılnousouˇc´ast´ıv´yvoje bylo a je tak´etestov´an´ı.Testov´an´ıse zamˇeˇrovalo na kl´ıˇcov´eˇc´astiaplikace, pˇredevˇs´ımpr´acis form´aty a mapov´an´ım.

6.1 Jednotkov´etestov´an´ı

Pro jednotkov´ehotestov´an´ıbylo vyuˇzitotestovac´ıhoframeworku PHPUnit[23]. Tento framework poskytuje stabiln´ız´azem´ıpro tvorbu jednotkov´ych test˚ua je velmi jednoduch´yna pouˇzit´ı.jednotkov´etest je moˇzn´enal´eztna pˇriloˇzen´em m´ediuve sloˇzce /lib/core/test.

Spuˇstˇen´ıtest˚uvyˇzadujeinstalaci knihovny jako takov´e,nikoli jako souˇc´ast vˇetˇs´ıhoˇreˇsen´ı.Instalace knihovny s PHPUnit se prov´ad´ıopˇetpomoc´ın´astroje Composer.

37

Kapitola 7

Referenˇcn´ıimplementace

Za ´uˇcelemdemonstrace vyuˇzit´ıknihovny a tak´eza ´uˇcelemn´azorn´euk´azky pr´aces knihovnou, jsem se rozhodl vytvoˇritreferenˇcn´ı implementaci mezi- vrstvy mezi knihovnou a c´ılov´ymframeworkem.

K tomuto ´uˇcelubylo nutn´eurˇcit vhodnou platformu pro takovou imple- mentaci a n´aslednˇev´yvoj mezivrstvy prob´ıhalspoleˇcnˇes hlavn´ıknihovnou.

7.1 V´ybˇervhodn´eplatformy

Pro implementaci mezivrstvy jsem vyb´ıralz framework˚u,kter´ejsem analy- zoval v prvotn´ıˇc´astit´etopr´ace.Nakonec byl vybr´anNette framework jako vhodn´aplatforma pro demonstraci moˇznost´ıknihovny.

D˚uvod˚upro Nette framework bylo v´ıce,pˇredevˇs´ımvˇsakdlouho trvaj´ıc´ı potˇrebam´ıtkvalitn´ın´astroj pro mapov´an´ıobjekt˚uv r´amciREST API do aplikace. JelikoˇzNette framework provozuji na vˇetˇs´ımmnoˇzstv´ıprojekt˚ua jiˇz v´ıcekr´atjsem byl poˇz´ad´ano tvorbu REST API v Nette, tento framework se stal pˇrirozenouvolbou.

7.2 Realizace

Realizace mezivrstvy poskytuje moˇznostvyuˇz´ıtkonfiguraci jak form´atuNeon[24], coˇzje z´akladn´ıform´atse kter´ymNette framework pracuje. Kromˇemoˇznosti nastavovat endpointy pro REST API pomoc´ıdefinovan´ych anotac´ı.

39

Z´avˇer

V´ysledn´aknihovna je velik´ympˇr´ınosempro m´est´avaj´ıc´ıi budouc´ıprojekty. Rovnˇeˇzsouˇcasnˇese zveˇrejnˇen´ımt´etopr´aceoˇcek´av´amzveˇrejnˇen´ırovnˇeˇzzdro- jov´ych k´od˚una platformˇeGitHub, kde bude moˇzn´etuto knihovnu vyuˇz´ıvat.

V´ysledn´aknihovna umoˇzˇnujemnohem vyˇsˇs´ımodularitu co se t´yˇceREST API neˇzz´akladn´ımoˇznostijednotliv´ych framework˚ua d´ıkytomu je moˇzn´e snadnˇejipˇrech´azetmezi frameworky. To pˇrispˇejek vyˇsˇs´ıudrˇzitelnostiprojekt˚u do budoucna.

Ve v´yvoji knihovny hodl´ampokraˇcovat i nad´ale,jelikoˇzje zde st´alespousta prostoru pro zlepˇsen´ı,napˇr´ıkladproveden´ıtest˚uv´ykonosti a n´asledn´ych opti- malizac´ı,zejm´enav oblasti mapov´an´ı.

Dle m´ehon´azorubyly splnˇeny vˇsechny ˇc´astizad´an´ı,avˇsakuk´azkov´aapli- kace mohla b´ytvˇetˇs´ıhorozsahu, coˇzby umoˇzniloprov´esttak´etestov´an´ıpo- moc´ın´astroje Postman na rozs´ahlejˇs´ıaplikaci. Toto rozˇs´ıˇren´ıuk´azkypl´anuji spoleˇcnˇes v´yvojem mezivrstvy pro Symfony framework.

41

Bibliografie

1. Google Trends - REST API [online] [cit. 2020-05-19]. Dostupn´ez: https: //trends.google.com/trends/explore?cat=32&date=all&q=REST% 20API. 2. FIELDING, Roy T. Architectural styles and the design of network-based architectures [online]. Irvine: University of California, Irvine, 2000 [cit. 2020-05-19]. Dostupn´ez: https://www.ics.uci.edu/˜fielding/ pubs/dissertation/fielding_dissertation.pdf. 3. JANDA, Radim. Technologie pro tvorbu RESTful API [online]. Fakulta informaˇcn´ıch technologi´ı CVUT,ˇ 2018 [cit. 2020-05-19]. Dostupn´ez: https: //dspace.cvut.cz/bitstream/handle/10467/76228/F8-DP-2018- Janda-Radim-thesis.pdf. 4. HANAK,´ Drahom´ır.Stopaˇr˚uvpr˚uvodce REST API [online] [cit. 2020- 05-19]. Dostupn´ez: https : / / www . itnetwork . cz / programovani / nezarazene/stoparuv-pruvodce-rest-api/. 5. PATCH Method for HTTP [online]. 2010 [cit. 2020-05-19]. Dostupn´ez: https://tools.ietf.org/html/rfc5789. 6. Laravel - dokumentace [online] [cit. 2020-05-19]. Dostupn´ez: https : //laravel.com/. 7. Symfony - dokumentace [online] [cit. 2020-05-19]. Dostupn´ez: https: //symfony.com/. 8. Magento - dokumentace [online] [cit. 2020-05-19]. Dostupn´ez: https: //devdocs.magento.com/. 9. Nette - dokumentace [online] [cit. 2020-05-19]. Dostupn´ez: https:// nette.org/cs/. 10. Content Negotiation [online] [cit. 2020-05-19]. Dostupn´ez: https : / / developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation.

43 Bibliografie

11. FOSRestBundle - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https://symfony.com/doc/master/bundles/FOSRestBundle/index. html. 12. SensioFrameworkExtraBundle - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/ index.html. 13. Comparing Workflows - Atlassian tutorial [online] [cit. 2020-05-19]. Do- stupn´ez: https://www.atlassian.com/git/tutorials/comparing- workflows. 14. JONA´S,ˇ Martin. N´avrhov´eprincipy: SOLID [online]. 2012 [cit. 2020- 05-19]. Dostupn´ez: https : / / www . zdrojak . cz / clanky / navrhove - principy-solid/. 15. PHP-FIG [online] [cit. 2020-05-19]. Dostupn´ez: https : / / www . php - fig.org/. 16. PHP Reflection - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https://www.php.net/manual/en/book.reflection.php. 17. Laminas Code - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https://docs.laminas.dev/laminas-code/. 18. Composer - A Dependency Manager for PHP [online] [cit. 2020-05-19]. Dostupn´ez: https://getcomposer.org/. 19. Composer - Documentation - Artifact installation [online] [cit. 2020-05- 19]. Dostupn´ez: https://getcomposer.org/doc/05-repositories. md#artifact. 20. Markdown - Specification [online] [cit. 2020-05-19]. Dostupn´ez: https: //daringfireball.net/projects/markdown/. 21. PHP Doc - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https: //docs.phpdoc.org/latest/. 22. phpDocumentor - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https://www.phpdoc.org/. 23. PHPUnit - documentation [online] [cit. 2020-05-19]. Dostupn´ez: https: //phpunit.de/. 24. Neon - dokumentace [online] [cit. 2020-05-19]. Dostupn´ez: https:// doc.nette.org/cs/3.0/neon.

44 Prˇ´ıloha A

Seznam pouˇzit´ychzkratek

JSON JavaScript Object Notation

XML Extensible markup language

REST Representational State Transfer

API Application Programming Interface

CSV Comma-separated values

ORM Object-relational mapping

PHP-FIG PHP Framework Interop Group

PSR PHP Standard Recommendation

HTTP Hypertext Transfer Protocol

OOP Object-oriented programming

IDE Integrated development environment

45

Prˇ´ıloha B

Obsah pˇriloˇzen´ehoCD

readme.txt ...... struˇcn´ypopis obsahu CD lib...... zdrojov´ek´odyimplementace core ...... hlavn´ıimplementace knihovny vˇcetnˇeunit test˚u nette...... referenˇcn´ıimplementace knihovny pro framework Nette text ...... text pr´ace bp.pdf...... text pr´aceve form´atuPDF source ...... text pr´aceve form´atuLATEX s pˇr´ısluˇsn´ymisoubory research...... dotazn´ıkprov´adˇen´yv r´amcipr´ace

47