Porovnání ORM systémů pro programovací jazyk PHP Bakalářská práce
Vedoucí práce: Ing. Jiří Lýsek
Lenka Chalupová
Děkuji vedoucímu mé bakalářské práce, Ing. Jiřímu Lýskovi, za vedení, vřelý a ochotný přístup, odbornou pomoc při psaní téhle práce a za velkou trpělivost.
Prohlašuji, že jsem bakalářskou práci vypracovala samostatně pod odborným vedením Ing. Jiřího Lýska a že jsem uvedla veškeré literární zdroje, ze kterých bylo při tvorbě této práce čerpáno. V Brně dne 25. května 2013
_________________
Abstract Chalupová L. Comparison of ORM systems for programming language PHP. Bachelor thesis. Brno, 2013. This bachelor thesis deals with a comparison of ORM systems for programming language PHP. Approaches of application development with ORM systems and also without them are compared. A sample application using selected ORM system was created for this thesis. This application was compared with non-ORM application. To create application NetBeans IDE, scripting language PHP, MySQL database server and the Doctrine 2 ORM system was used. Finally, the advantages and disadvantages of ORM systems usage are described. Keywords ORM System, PHP, Doctrine 2, NetBeans, MySQL
Abstrakt Chalupová, L. Porovnání ORM systémů pro programovací jazyk PHP. Bakalářská práce. Brno, 2013. Tato bakalářská práce se zabývá porovnáním ORM systémů pro programovací jazyk PHP. V práci jsou porovnány přístupy s ORM systémem a bez něj. K bakalářské práci byla vytvořena ukázková aplikace s oběma přístupy. K vytvoření aplikace bylo využito vývojového prostředí NetBeans, skriptovacího jazyka PHP, databázového serveru MySQL a ORM systému Doctrine 2. Klíčová slova ORM Systém, PHP, Doctrine 2, NetBeans, MySQL
Obsah
6
Obsah 1
2
3
Úvod a cíl práce 1.1
Úvod ......................................................................................................... 10
1.2
Cíl práce .................................................................................................... 10
Skriptovací jazyk PHP
11
2.1
Historie jazyka PHP .................................................................................. 11
2.2
Využití jazyka PHP .................................................................................... 12
2.3
OOP v PHP ................................................................................................ 12
2.4
Jiné jazyky pro tvorbu serverové části webu ........................................... 13
2.4.1
CGI (Common Gateway Interface) ................................................... 14
2.4.2
SSI (Server Side Includes) ................................................................ 14
2.4.3
ASP (Active Server Pages) ................................................................ 14
2.4.4
ASP.NET ............................................................................................ 15
Vývojová prostředí 3.1
16
NetBeans IDE ............................................................................................ 16
3.1.1
Historie NetBeans IDE ..................................................................... 16
3.1.2
PHP vývoj v NetBeans IDE ............................................................... 17
3.2
4
10
Eclipse ....................................................................................................... 17
3.2.1
Historie Eclipse ................................................................................. 17
3.2.2
PHP v Eclipse ....................................................................................18
3.3
PhpStorm ..................................................................................................18
3.4
phpDesinger ..............................................................................................18
Databázové servery 4.1
Databázový server MySQL ....................................................................... 19
4.1.1 4.2
Historie MySQL ............................................................................... 20
PostrgreSQL ............................................................................................. 20
4.2.1 4.3
19
Historie PostgreSQL ........................................................................ 20
SQLite ........................................................................................................ 21
Obsah
7
4.4
Oracle Database ........................................................................................ 21
5
ORM systémy 5.1
6
22
Návrhové vzory ........................................................................................ 23
5.1.1
Table Data Gateway ......................................................................... 24
5.1.2
Row Data Gateway ........................................................................... 24
5.1.3
Active Record ................................................................................... 24
5.1.4
Data Mapper .................................................................................... 25
5.1.5
Unit of Work..................................................................................... 25
5.2
Typy vztahů .............................................................................................. 26
5.3
Doctirne .................................................................................................... 27
5.3.1
Common vrstva ................................................................................ 28
5.3.2
DBAL (DataBase Abstraction Layer) vrstva ................................... 28
5.3.3
ORM (Object-Relational Mapping) vrstva ...................................... 29
5.4
php.activerecord ...................................................................................... 29
5.5
CakePHP .................................................................................................. 29
5.6
Propel ....................................................................................................... 30
5.7
CodeIgniter .............................................................................................. 30
5.8
Rocks ........................................................................................................ 30
Ukázková aplikace 6.1
Ukázková aplikace bez ORM frameworku ............................................... 31
6.1.1 6.2
31
Editace filmu bez ORM frameworku ................................................ 31
Ukázková aplikace s ORM frameworkem ............................................... 32
6.2.1
Editace filmu s ORM frameworkem Doctrine 2 ............................. 33
7
Závěr
34
8
Literatura
35
A
Relační model databáze
39
B
Vzhled ukázkové aplikace
40
C
Obsah přiloženého CD
41
Seznam obrázků
8
Seznam obrázků Obr. 1 Serverový skript
14
Obr. 2
Schéma spolupráce PHP s databází
19
Obr. 3
Table Data Gateway
24
Obr. 4
Row Data Gateway
24
Obr. 5
Active Record
25
Obr. 6
Data Mapper
25
Obr. 7
Unit of Work
26
Obr. 8
Vztahy mezi objekty
27
Obr. 9
Doctrine rozhraní
29
Obr. 10
Editace filmu bez ORM frameworku
32
Obr. 11
Editace filmu s frameworkem Doctrine 2
33
Obr. 12
Relační model databáze
39
Obr. 13
Ukázková aplikace
40
Seznam tabulek
9
Seznam tabulek Tab. 1 ORM frameworky pro PHP
23
Tab. 2
28
Datové typy
Úvod a cíl práce
10
1 Úvod a cíl práce 1.1
Úvod
V dnešní době se v podstatě webové stránky neobejdou bez podpory skriptu na straně serveru. Jazyk PHP je v tomto případě jednou z možností. Jazyk PHP disponuje mnoha funkcemi a alespoň jedna by se určitě dala využít v každém webu. Pomocí funkcí v jazyku PHP si můžeme vytvořit například šablonu pro webové stránky, protože v každé stránce se nám opakuje minimálně jedna z částí, ať už je to hlavička, menu nebo třeba patička. Jazyk PHP se vyvíjí po mnoho let a ještě není zdaleka u konce. Do původně čistě skriptovacího jazyka se po vzoru objektových programovacích jazyků, jako je JAVA či C++, začali využívat objekty. Objekty se přidali především pro přehlednost zdrojového kódu a pro co nejvěrohodnější zachycení reality. S příchodem PHP5 a ustálení koncepce objektového programování, začal také vývoj ORM frameworků pro php. (Tröster, 2010) ORM, nebo také objektově relační mapování, má za cíl převod dat mezi nekompatibilními typy systémů v relační databázi, pro snadné vyhledání při zachování vlastností objektů a jejich vztahů. (Novulo, nedatováno) ORM frameworky jsou založené na několika typech návrhových vzorů. ORM frameworků je nyní až několik desítek a stále se vyvíjí nové typy a nové verze již vytvořených frameworků a snaží se najít a vyladit postupně nedostatky, které zatím mají. V téhle době informace o ORM frameworcích jsou nedostatečně knižně zpracované, většinu informací o nich nalezneme na webových stránkách jednotlivých frameworků, které mají zpracovanou dokumentaci pro již vytvořené funkce. Pro některé frameworky jsou zpracované tutoriály i na českých webových stránkách, které se věnují informačním technologiím.
1.2 Cíl práce Cílem práce je seznámit se s tvorbou aplikací ve skriptovacím jazyku PHP a vyzkoušet vybrané ORM systémy pro programovací jazyk PHP. Získání informací z daného oboru. Vytvořená aplikace bude demonstrovat možnosti použití PHP a zvoleného ORM systému k tvorbě aplikací propojených s databází.
Skriptovací jazyk PHP
11
2 Skriptovací jazyk PHP PHP je hypertextový preprocesor, který na serveru interpretuje stránky HTML s vlastními příkazy před jejich odesláním ke klientovi (obvykle je jím webový prohlížeč). To znamená, že PHP umožňuje vkládat vlastní skripty (krátké úseky kódu, ale i celé programy) přímo do hypertextových stránek. Jazyk PHP je interpretovaný, což znamená, že až do okamžiku svého použití (spuštění) je uchováváno ve zdrojovém tvaru. Interpret jazyka tento kód vezme a překládá jej do strojového kódu pro počítač, na kterém PHP běží. To je samozřejmě pomalejší než v případě kompilovaného kódu, který je k dispozici přímo ve spustitelném tvaru – cílový počítač soubor vezme, zde uvedeným instrukcím rozumí a může je ihned provádět. PHP je interpretovaný jazyk, podobně jako Perl. Oproti Perlu (i dalším skriptovacím jazykům) však nabízí podstatně více možností díky rozšířením, pohodlnější práci s proměnnými i objekty, výbornou podporu mnoha databázových systémů, a také přehlednější syntaxi. (Brázda, 2005, s. 15-17) Má syntaxi velmi podobnou jazyku C a je tedy většině vývojářů dost blízký. Podporuje širokou řadu souvisejících technologií, formátů a standardů. Je to otevřený projekt s rozsáhlou podporou komunity. Dají se najít velká množství již hotového kódu k okamžitému použití nebo přímo funkční PHP aplikace. Podstatná část z hotového kódu je šířena pod nějakou svobodnou licencí (GPL, Apache, MIT aj.) a dá se použít ve vlastních projektech. PHP spolupracuje i s webovým serverem Apache, který je sesterským projektem spravovaný Apache software foundation, komunikuje také s databázemi, jako je MySQL, PostgreSQL a řada dalších. PHP je multiplatformní a lze jej provozovat s většinou webových serverů a na většině dnes existujících operačních systémů. Protože je PHP aktivně vyvíjen, v budoucích verzích jazyka se mohou některé funkce změnit nebo se mohou chovat jinak než doposud. (Zajíc, 2004)
2.1 Historie jazyka PHP Počátky jazyka PHP se datují k roku 1995, kdy jeden nezávislý vývojář vyvíjející software jménem Rasmus Lerdorf vytvořil skript Perl/CGI, který mu umožňoval zjistit, kolik návštěvníků četlo jeho online resumé. Tenhle skript dělal dvě věci: protokoloval informace o návštěvnících a zobrazoval na webové stránce počet návštěvníků. Díky tomuhle čítači byl zahrnut e-maily se žádostmi o daný skript. Lerdorf proto začal dávat sadu nástrojů k dispozici a opatřil ji titulem Personal Home Page (PHP). Dožadování sady nástrojů přimělo tvůrce, aby začal k PHP vyvíjet dodatky. Jeden z nich měl převádět data zadané v HTML formuláři do symbolických proměnných, aby je uživatelé mohli exportovat do jiných systémů. Aby toho dosáhl, opustil Perl a dál pokračoval ve vývoji v jazyku C. Postupné přidávání dodatků vyvrcholilo v listopadu 1997 vydáním PHP 2.0, neboli Personal Home Page – Form Interpreter (PHP-FI). Díky rostoucí popularitě PHP se verze 2.0 do-
Skriptovací jazyk PHP
12
čkala různých zobecnění od programátorů z celého světa. V roce 1997 došlo také ke změně slov tvořící význam zkratky PHP, již to neznačilo Personal Home Page, ale Hypertext Preprocessor. Brzy se k jádru týmu vývojářů přidal i samotný Lerdorf. Tým se držel myšlenky vkládání kódu přímo do HTML a přepsal parsing engine, tak přišla na svět verze PHP 3. Podle vydání verze 3.0 z června 1998 využívalo PHP pro obohacení svých webových stránek již přes 50 000 uživatelů. V roce 1999 se stal jedním z nejpopulárnějších skriptovacích jazyků na celém světě. Odhad uživatelů přesahoval 1 000 000. Popularita překročila i očekávání vývojářů. Uživatelé chtěli jazykem PHP vytvářet širší paletu aplikací, než se původně předpokládalo. Iniciativu převzali dva klíčoví vývojáři Zeev Surraski a Andi Gutmans. Byli v čele týmu, který znovu promýšlel dosavadní funkčnost PHP, což vyvrcholilo v přepsání parseru PHP a pojmenovali ho Zend scripting engine. V květnu 2002, zhruba osmnáct měsíců po prvním oficiálním oznámení o novém vývojovém úsilí, byla vydána verze PHP 4.0. V této době se odhadovalo, že je PHP nainstalován na více než 3,6 miliónech domén. Ve verzi 4 byly přidány doslova stovky funkcí pro rozšíření jazyka. Verze 5, která vznikla v roce 2004, je dalším zlomovým prvkem v evoluci jazyka PHP. Tahle verze přidává několik nových schopností jako například: zdokonalená výbava objektově orientovaného programování, zpracování výjimek ve stylu try/catch, zdokonalené zpracování řetězců, zdokonalená podpora XML a webových služeb, vlastní podpora SQLite a spoustu dalších dodatků a zdokonalení. Ze začátku téhle verze bylo PHP instalováno téměř na 19 miliónech domén. (Gilmore, 2005, s. 31-35)
2.2 Využití jazyka PHP Jazyk PHP je všestranný programovací jazyk, který lze využít například pro naprogramování internetového obchodu, diskuzních fór, podnikových informačních systémů, redakčních systémů, dynamických osobních nebo firemních stránek, webových poštovních klientů nebo databázových klientů, reklamních systémů. Pomocí jazyka PHP se také vytváří menší aplikace například vyhledávače, počítadla, ankety. Především slouží pro zpracování dat z formulářů. (Lahvička, 2000)
2.3 OOP v PHP Každý projekt je třeba udržovat a inovovat. V této etapě jsou pojmy jako přehlednost, dobrá dokumentace, strukturovanost a modularita prakticky k nezaplacení. Právě v takových oblastech nachází uplatnění objektově orientované programování (OOP). Tento způsob programování má dvě základní myšlenky. První z nich vychází ze skutečnosti, že softwarové aplikace jsou odrazem vnějšího světa, a ten je objektový a hierarchicky strukturovaný. Objektově oriento-
Skriptovací jazyk PHP
13
vané programování umožňuje zvýšit efektivitu práce vývojářských týmů při současném zvýšení kvality a spolehlivosti výsledných produktů. Druhou myšlenkou je důsledné oddělení implementace od publikovaného rozhraní. Tento aspekt programování umožňuje programátorům používat objekty vytvořené jinými programátory nebo programátorskými týmy, aniž by klientští programátoři znali algoritmy implementované v používaném objektu. Jako příklad lze uvést grafickou knihovnu, kdy stačí znát pouze publikované rozhraní a pomocí volání členských funkcí (metod) můžeme pohodlně vykreslovat geometrické obrazce. V nové verzi disponuje jazyk PHP více než tisícovkou funkcí. Určitý řád je zaveden již v konvenci názvů. Ale řád a přehlednost do systému vnesla až objektová hierarchie a provázení funkcí s třídami. Objektově orientovaný způsob programování podporoval už jazyk PHP ve verzi 3. Tento rys však nebyl implementován, aby respektoval všechny zásadní principy objektově orientovaného programování. Nebyla v něm zabezpečena ochrana přístupu k členským proměnným třídy. Pozornost si zaslouží rovněž rozšíření PEAR (PHP Extension and Aplication Repository). PEAR je Framework obsahující opakovaně využitelné komponenty PHP. (Lacko, 2007, s. 163-164) S vydáním verze PHP 5 v roce 2004 došlo k výraznému vylepšení OO možností PHP. V daném okamžiku byla Java, nejpopulárnější OO jazyk této doby, na trhu již téměř 10 let. Každý OOP jazyk nabízí nějaké zabudované třídy a ani PHP není výjimkou. PHP 5 zavádí Standardní knihovnu SPL (Standard PHP Library, která nabízí velké množství přednastavených tříd a rozhraní. (Lavin, 2009, s. 31-32)
2.4 Jiné jazyky pro tvorbu serverové části webu Princip serverových skriptů je takový, že při požadavku server vykoná program a klientovi posílá pouze data ve formátu HTML. Klient s programem nepřichází vůbec do styku.
Skriptovací jazyk PHP
14
Obr. 1 Serverový skript Zdroj: Janovský, nedatováno
2.4.1
CGI (Common Gateway Interface)
Základní výměnné prostředí pro příjem vstupu a publikování výstupu jakéhokoli programu (třeba z Pascalu nebo Perlu). Omezením je pro něj, že je potřeba další jazyk. Dříve byl oblíbený ve spolupráci s jazykem Perl, který umí výborně pracovat s řetězci. Perl je interpretovaný jazyk, relativně komplikovaný a hůře spolupracuje s HTML. Dalším jazykem, se kterým bylo CGI spojeno, je Python, který je přehledným objektovým skriptovacím jazykem, avšak také hůře spolupracuje s HTML. (Janovský, nedatováno) 2.4.2
SSI (Server Side Includes)
Nejstarší a nejrozšířenější druh serverem vkládaných vsuvek. Princip spočívá v tom, že do zápisu stránky v HTML můžeme doplnit některé příkazy zapsané ve speciálním formátu. Webový server HTML stránku před odesláním klientovi prohlédne a všechny vložené příkazy provede. (Kosek, 1999) 2.4.3
ASP (Active Server Pages)
ASP patří mezi serverem vkládané vsuvky. Je to technologie od firmy Microsoft použitá v IIS (Internet Information Server). Pracuje na stejném principu jako SSI, nabízí však mnohem větší možnosti. (Kosek, 1998, s. 131) V dokumentech můžeme kromě HTML-tagů používat příkazy speciálního skriptovacího jazyka. Před odesláním stránky klientovi jsou provedeny všechny příkazy a posílá se již obyčejná HTML stránka. Jako skriptovací jazyk se v ASP standardně používá Visual Basic Script. Toto nastavení je však možno změnit v konfiguraci Internet Information Serveru a použít třeba JavaScript. (Kosek, 1998, s. 134)
Skriptovací jazyk PHP
2.4.4
15
ASP.NET
ASP a ASP.NET jsou velice odlišné technologie. ASP se mnohem více podobá jazyku PHP. Naproti tomu ASP.NET je postavená na .NET frameworku. (Suk, 2012) ASP.NET je technologie firmy Microsoft sloužící k tvorbě webových aplikací. Architektura ASP.NET (i celého .NET frameworku) byla navržena pro nezávislost na OS a HW platformě. Na rozdíl od ASP je ASP.NET plně kompilované prostředí. V ASP.NET je možné oddělit prezentační vrstvu webové stránky a programový kód používaný ve stránce. ASP.NET má několik programových modulů např. Web Form není lineární, ale je řízený událostmi. Webová aplikace tak může reagovat na určité události a objekty mohou definovat svoje vlastní události. (Furman, 2002)
Vývojová prostředí
16
3 Vývojová prostředí Pro vytváření PHP skriptů lze využít i obyčejný textový editor, jako je třeba Poznámkový blok, není to ovšem ideální pokud se chceme více PHP věnovat. Je mnoho vylepšených textových editorů, které jsou přímo určeny pro programování skriptů, patří mezi ně hojně využívaný PSPad nebo výchozí linuxový textový editor gedit. Pokud se chceme však více věnovat programování v PHP, tak je lepší použít vývojové prostředí (IDE - Integrated Developer Environment). Vývojové prostředí pro programovací jazyky nám nabízí spoustu výhod na rozdíl od textových editorů. Mezi výhody můžeme zařadit automatické dokončování textu, které nám omezí překlepy a pak jejich následné chyby, které se hůře hledají v textovém editoru. Dále nám vývojové prostředí kontroluje syntaxi a zobrazuje případné chyby v ní pomocí nápovědy. Nabízí nám také nápovědy funkcí, lepší orientaci v kódu nebo také zvýrazňování proměnných. Vývojové prostředí můžeme rozdělit podle licence do dvou hlavních skupin na placené vývojové prostředí a vývojové prostředí poskytované zdarma. Vývojových prostředí je obrovská spousta a stále se další vyvíjejí. Mezi nejrozšířenější vývojové prostředí, které je dostupné zdarma, patří NetBeans a Ecipse, obojí jsou vývojové prostředí určené pro více programovacích jazyků. Placené vývojové prostředí se více soustřeďují na určité programovací jazyky, proto také zde vybrané jsou zaměřené jen na skriptovací jazyk PHP.
3.1 NetBeans IDE NetBeans IDE umožňuje rychle a snadno vytvořit Java počítačové aplikace, mobilní a webové aplikace a zároveň poskytuje silné nástroje pro PHP a C/C++ vývojáře. Je zdarma a open source a má velkou komunitu uživatelů a vývojářů po celém světě. (NetBeans, nedatováno) 3.1.1
Historie NetBeans IDE
NetBeans začal jako projekt studenta (původně nazvaný Xelfi) v České republice v roce 1996. Xelfi byl první Java IDE napsaný v Javě. V té době to byl zábavný projekt zejména proto, že Java IDE prostor byl v té době jako nezmapované území. Projekt přilákal dostatečný zájem a tvůrci byli kontaktováni Romanem Staňkem, obchodníkem, který hledal dobrý nápad, do kterého by investoval. Původní plán byl vytvořit síť povolující JavaBeans komponenty. Jaroslav Tulach, který navrhl pro IDE základní architekturu, přišel s názvem NetBeans. Na jaře roku 1999 byl spuštěn NetBeans DeveloperX2 podporující Swing. Výkonnostní vylepšení, která přišla v JDK 1.3 vydané na podzim roku 1999, udělala z NetBeans životaschopnou volbu vývojových nástrojů. V létě roku 1999 tým předělal DeveloperX2 do více modulární formy NetBeans, která tvoří základ programu dodnes.
Vývojová prostředí
17
V létě roku 1999 chtěl Sun Microsystems lepší Java vývojové nástroje a začal se zajímat o NetBeans. Sun Microsystems získal rovněž další nástrojovou společnost Forté a rozhodl se přejmenovat NetBeans na Forté to Java. Mladí vývojáři, kteří byli zapojeni do open source projektů, zmínili myšlenku open source NetBeans. Pro Sun se stal tak prvním sponzorovaným open source projektem. V červnu 2000 vznikly první netbeans.org webové stránky. Když v roce 2010 Oracle získal Sun, NetBeans se stal součástí Oracle, který ji nadále sponzoruje. Oracle aktivně vyhledává nové vývojáře pro práci v týmu NetBeans a vidí NetBeans IDE jako oficiální IDE pro platformu Java. (NetBeans, nedatováno) 3.1.2
PHP vývoj v NetBeans IDE
NetBeans PHP editor nabízí šablony kódů a generování kódů, parametry popisů, rady a rychlé opravy kódů a inteligentní doplňování kódů. Využívá také syntaktického a sémantického zvýraznění, bublinové dokumentace, označování výskytů a výstupních míst, chytré try/catch doplnění kódu, inteligentní předvyplnění parametru metody a obdélníkový výběr. NetBeans IDE podporuje webové frameworky: Zend Framework, Symfony1 Framework, Symfony2 Framework. NetBeans IDE pro PHP má podporu pro kontinuální integraci. Kontinuální integrace je vývoj softwaru založený na praktickém ovládání verzí na specializovaném serveru. Specializovaný server spustí naplánovanou PHPUnit a Code Coverage testuje na softwaru. Výsledky testů jsou spojeny s informacemi verzí, takže vývojáři mohou identifikovat chyby, které je zavádějí k softwaru rychle a snadněji. Projekt NetBeans nabízí verzi IDE, sestavenou na míru pro vývoj PHP webové stránky, které se skládají z různých skriptovacích jazyků a značek. Editor PHP je dynamicky integrován s HTML, JavcaScript a CSS. (NetBeans, nedatováno)
3.2 Eclipse Eclipse je komunita pro jednotlivce i organizace, kteří chtějí spolupracovat na komerčně-přátelském open source softwaru. Eclipse Foundation je nezisková společnost podporující Eclipse projekty a pomáhá rozvíjet i open source komunitu doplňkových produktů a služeb. 3.2.1
Historie Eclipse
Projekt Eclipse byl původně vytvořen firmou IBM v listopadu 2001 a podporován konsorciem dodavatelů softwaru. Eclipse Foundation byla založena v roce 2004 jako nezisková společnost, aby jednala jako správce Eclipse komunity. Dnes se komunita Eclipse skládá z jednotlivců a organizací z celého spektra softwarového průmyslu. Průmysloví představitelé Borland, IBM, MERANT, QNX Software Systems, Rational Software, Red Hat, SuSE, TogetherSoft a Webgain tvořili počáteční eclipse.org radu komisařů v listopadu 2001. Do konce roku 2003 se toto původní konsorcium rozrostlo na více než 80 členů. Rada komisařů Eclipse oznámila
Vývojová prostředí
18
2. února 2004 reorganizaci do neziskové společnosti. Eclipse se stala nezávislým subjektem, který si řídí vývoj platform k prospěchu poskytovatele softwarového rozvoje a konečného uživatele. Všechny technologie a zdrojový kód poskytnutý přes Eclipse Public License. (Eclipse, nedatováno) 3.2.2
PHP v Eclipse
Projekt PHP IDE má dodávat PHP integrované vývojové prostředí pro platformu Eclipse. Projekt zahrnuje komponenty potřebné k rozvoji PHP. Projekt se skládá ze souboru rozšiřitelných funkcí pokrývající životní cyklus vývoje PHP, včetně funkcí, která se zabývá vývojem, nasazením, dokumentování, ladění a testování aplikací založených na PHP. PHP IDE jádro poskytuje infrastrukturu pro PHP IDE a zahrnuje: PHP Language Model, PHP Inspector/Code Builder, PHPDoc Support, PHP User Model, PHP Source Code Formatter. PHP IDE projekt je vytvořen pomocí několika Eclipse Web Tools Platform (WTP) projektových komponent. WTP poskytne obecné, rozšiřitelné a na standardech založené nástroje pro centrální webový vývoj aplikací. To poskytuje editory pro různé webové jazyky jako: HTML, CSS, JavaScript, WSDL. Kromě toho poskytuje zázemí pro konfiguraci a připojení k webovému serveru. (Eclipse, nedatováno)
3.3 PhpStorm PhpStorm patří mezi placené PHP IDE, které se soustřeďuje pouze na programovací jazyky pro tvorbu webu. PhpStorm poskytuje automatické doplňování kódu, podporuje PHPUnit a umožňuje rozvíjet a provozovat testování přímo z IDE. Obsahuje všechny funkce WebStorm a přidává plnohodnotnou podporu pro PHP. Mezi klíčové vlastnosti patří dokončování kódu, detektor duplicitních kódů, podpora PHPDoc. Obsahuje také JavaScript editor a HTML/CSS editor. (WebStorm, nedatováno)
3.4 phpDesinger PhpDesinger patří taktéž mezi placené IDE, založené výhradně na editorech pro tvorbu webových stránek. PhpDesinger 8 je rychlý a výkonný PHP IDE a PHP editor s plnohodnotnými vestavěnými editory pro HTML5, CSS3 a JavaScript. Vysoce přizpůsobitelné IDE poskytuje inteligentní zvýrazňování syntaxe, podporu ladění, syntaktické analýzy, podporu pro objektově-orientované kódování, kód šablony, práce s projekty a frameworky, intuitivní navigace kódem a vše zabalené do pěkně vypadajícího uživatelského rozhraní. (MOSOFTWARE, nedatováno)
Databázové servery
19
4 Databázové servery Jedním z hlavních využití jazyka PHP je propojení s databázovým serverem pro získání informací z databází a jejich sjednocení a zveřejnění pro uživatele. Databáze musí běžet na serveru. Je to program, který umí vkládat informace do tabulek, rychle je třídit, filtrovat a poskytovat jiným programům. Převážná většina internetových serverů nějakým způsobem pracuje s databází. Databází existuje spousta druhů, například MS Acces, PostgreSQL, MySQL atd. Jako databáze se dá využít i prostá tabulka v MS Excel, ale není to praktické. Nejoblíbenější mezi programátory PHP je zřejmě databáze MySQL, která je rychlá, existuje pro všechny platformy a je zadarmo. Ke každému databázovému serveru přistupuje PHP pomocí odlišných funkcí. Naštěstí jsou si funkce pro různé databázové servery výrazně podobné. Existují už také univerzální rozhraní například ODBC. Přímo k databázi se přistupuje, pomocí jazyka SQL. Příkazy jazyka SQL se píší jako parametry určitých funkcí. (Janovský, nedatováno)
Obr. 2 Schéma spolupráce PHP s databází Zdroj: Janovský, nedatováno
4.1 Databázový server MySQL MySQL patří mezi světově populární open source databázové systémy, s více než 100 milionů stažených kopií. Mnohé z největších světových a nejrychleji rostoucích organizací používá MySQL – včetně předních organizací jako je Facebook, Yahoo!, Google, Nokia, YouTube, Wikipedia a nebo Booking.com. MySQL je klíčovou součástí LAMP (Linux, Apache, MySQL, PHP/Perl/Python). (Oracle, nedatováno)
Databázové servery
4.1.1
20
Historie MySQL
Relační databázový server MySQL byl vytvořen jako interní firemní projekt, který tvořili zaměstnanci TCxDataKonsult sídlící ve Švédsku. Jejich projekt, v té době jen pod přezdívkou MySQL, poprvé vydali pro veřejnost ke konci roku 1996. Tenhle produkt si získal popularitu a tak jeho tvůrci založili firmu, která se zabývala pouze MySQL, poskytování služeb i nabídky produktů, dali jí název MySQL AB. Již od založení byla společnost zisková a od té doby prudce expanduje, zřídila pobočky v několika zemích, přilákala značný kapitál a oznámila partnerství s významnými světovými společnostmi v oblasti informačních technologií, včetně Red Hat, Novell a Rackspace. Již od prvního vydání kladli vývojáři důraz na výkon a škálovatelnost softwaru. To vedlo k vysoce optimalizovanému produktu, který však postrádal mnohé schopnosti, které se považují za standardní u databázových aplikací určených pro velké společnosti. S každou novou vydanou verzí přibývali postupně další schopnosti, které přilákaly nové uživatele. Denně se stahuje více než 65 000 kopií softwaru. Beta vydání verze MySQL 5 bylo možné stahovat od března 2005. Mnozí lidé tuto verzi považují za nejvýznamnější vydání v historii celého produktu. MySQL obsahuje několik nových schopností jako například kompletní podpora cizích klíčů, uložené procedury, triggery, INFORMATION_SCHEMA. (Gilmore, 2007, s. 569) V roce 2008 Sun Microsystems získal MySQL AB a ke konci roku byla vydána verze 5.1. Dne 27. Ledna 2010 Oracle odkoupil MySQL V prosinci 2010 byla vydána verze 5.5, která obsahovala spoustu vylepšení. (Wikipedia nedatováno)
4.2 PostrgreSQL PostgreSQL je výkonný objektově-relační open source databázový systém. Má za sebou více než 15 let aktivního vývoje. Běží na všech hlavních operačních systémech. Má plnou podporu cizího klíče, pohledů, triggerů a uložených procedur. Má nativní programovací rozhraní pro C/C++, Java, Perl, Python, Ruby, ODBC. Podporuje mezinárodní znakové sady, vícebajtové kódování znaků. Součástí jeho standardní knihovny jsou stovky vestavěných funkcí. Triggery a uložené procedury mohou být napsány v jazyku C a načteny do databáze jako knihovna, která umožňuje vysokou flexibilitu při rozšiřování svých schopností. PostgreSQL obsahuje také rámec, který umožňuje vývojářům definovat a vytvářet vlastní datové typy spolu s podporou funkce a operátorů, které definují jejich chování. PostgreSQL zdrojový kód je k dispozici pod liberální open source licencí: PostgreSQL Licence. (PostgreSQL, nedatováno) 4.2.1
Historie PostgreSQL
PostgreSQL, nejdříve nazývaný Postgres, byl vytvořen profesorem počítačové vědy Michaelem Stonebrakerem. Stonebraker začal Postgres vytvářet v roce
Databázové servery
21
1986 jako navazující projekt k jeho Ingres, nyní vlastnící Computer Associates. Název Postgres vznikl podle jeho předchůdce, znamenal „affter Ingres“. Ingres, vyvinuté v rozmezí let 1977-1985, byl cvičením při tvorbě databázového systému podle klasické teorie RDBMS. Postgres se vyvíjel mezi lety 1986-1994. Tenhle projekt chtěl nové obzory v databázových pojmech, jako je průzkum „objektově relačních“ technologií. Stonebraker a jeho studenti aktivně rozvíjeli Postgres po dobu osmi let. Během této doby Postgres představil pravidla, procedury, rozšiřitelné typy s indexy a objektově-relační koncepty. Postgres byl později komercializovaný, aby byl později koupen Informixem a začleněn do jejího Universal Serveru. Informix byl koupen IBM v roce 2001. V roce 1995, dva studenti doktorského studia z Stonebrakerovy laboratoře nahrazují POSTQUEL dotazovací jazyk s rozšířenou podmnožinou jazyka SQL a přejmenovávají systém Postgres95. V roce 1996 Postgres95 odešel z akademického světa a začal nový život v open source světě. Noví vývojáři přinesli soudružnost a jednotnost kódové základny, přidali neuvěřitelné funkce. V dnešní době je uživatelská základna větší než kdy jindy a zahrnuje značnou skupinu velkých korporací. Některé z těchto společností, jako jsou Afilias a Fujitsu poskytli významné příspěvky krozvoji PostgreSQL. (PostgreSQL, nedatováno)
4.3 SQLite SQLite je velmi kompaktní databázový stroj SQL určený pro více platforem, napsaný v jazyku C. SQLite je v souladu s SQL92 a nabízí mnoho klíčových schopností pro správu databází, přináší však výrazné úspory, co se týče nákladů, doby potřebné na jeho zvládnutí, i administračních investic. SQLite ukládá celou databázi pouze do jednoho souboru, takže se snadno zálohuje a přenáší. SQLite je dostupný zadarmo, pod veřejnou doménovou licencí, pro platformy Windows i Unix. Od verze PHP 5.0 je standardně zapnutá podpora databázového serveru SQLite. Bylo tak učiněno na základě rozhodnutí odvázat se od MySQL kvůli licenčním neshodám. (Gilmore, 2007, s. 532)
4.4 Oracle Database Platformy Oracle Database se vyznačují tím, že mají za číslem verze i písmeno, které vyjadřuje, kterou oblast se Oracle zaměřil v dané verzi nejvíce. Nejnovější verze Oracle 11g poskytuje inovace k přechodu na zpracování v gridu. Mezi ně patří automatická správa databáze, nové funkce pro optimalizaci úložného prostoru databáze pomocí komprese dat a zároveň jejich fyzické rozdělení na oddíly. Firmami využívající zpracování v gridu jsou například amazon.com, monster.com nebo forexast.com. Na Oracle Database běží i databáze meteorologického výzkumu. (Panský, 2007)
ORM systémy
22
5 ORM systémy ORM (Object Relation Mapping) je objektově relační mapování, je to spojení mezi relačními databázemi a objektově orientovaným programováním. V podstatě jde o snahu namapovat objekty na data v databázi. ORM by nám mělo umožnit automatické skládání SQL dotazů a zabezpečení základních operací CRUD (creat, read, update, delete). (Matěna, 2009) Metoda mapování relační databáze na objekty, má podporu téměř ve všech jazycích. S verzí PHP5 a se stabilizací objektového programování začal také vývoj ORM frameworků pro PHP. V současnosti je rozvoj ORM frameworků v plném proudu. Frameworky lze dělit podle počtu operací, které nabízí programátorovi. Některé frameworky nabízí komplexní přístup a přidávají různé nadstavby pro usnadnění vývoje rozsáhlejších systémů. Frameworky jsou založené na návrhových vzorech. (Tröster, 2010) Významným autorem v oblasti návrhových vzorů pro ORM systémy je softwarový architekt Martin Fowler, který vydal několik knih a popisuje v nich také nejvýznamnější návrhové vzory týkající se ORM. Dělí je na návrhové vzory architektury a návrhové vzory chování. (Matěna, 2009) Přehled několika dostupných frameworků pro skriptovací jazyk PHP je zobrazen v tabulce 1 ORM frameworky pro PHP. Výběr jednoho určitého frameworku závisí také na nárocích, které jsou kladeny na vyvíjenou aplikaci. Komplexnější frameworky jsou nejvhodnější pro aplikace, od kterých se očekává dlouhodobý vývoj a nasazení vícečlenného týmu nebo modulární aplikace jako například internetový obchod nebo redakční systém, u kterých je potřeba mít možnost připojovat nezávislé moduly. ORM framework dobře doplňuje MVC (Model View Controler) Framework a unit testy, které jsou výborným základem pro vývoj velkých webových aplikací. Komplexnější frameworky mohou být založené na více návrhových vzorech nebo mohou být i kombinací návrhových vzorů. Díky nejednotnému zápisu SQL příkazů pro různé dotazovací jazyky (například MySQL a Postgre) ORM nabízí možnost univerzálního zápisu databázových dotazů, které jsou tak přenositelné mezi různými databázemi. Většina ORM frameworků nabízí předgenerované třídy pro každou tabulku v databázi se základními metodami CRUD, gettry a settry. ORM frameworky mají často zajištěnou kvalitu kódu pomocí unit testů a je možné testovat i metody v rozšířených třídách. Pokud ORM Framework podporuje databáze s paměťovým uložištěm, probíhají unit testy velice rychle. Hodnoty objektu, tedy i záznamu tabulky, jsou nastavovány přes generované gettry a settry nebo také přes magické metody jazyka PHP5. ORM frameworky, které jsou generované z databáze nebo popisných souborů (XML, YML nebo anotace), samy vygenerují základní validátory na povinné hodnoty a datové typy proměnných tříd. Základní operace se záznamy v tabulkách jsou hlavním účelem administrativního systému. ORM framework má schopnost na základě definic v databázi vytvořit uživatelské rozhraní pro
ORM systémy
23
základní operace včetně validátorů a výpisů s filtrací. Tohle rozhraní je možné dále rozšiřovat pro rozsáhlé administrační systémy. ORM frameworky mají i nějaké nevýhody. Největší nevýhodou je nutnost naučit se s vybraným frameworkem pracovat. Čím komplexnější Framework tím více dokumentace je potřeba zpracovat. Kvalitně zpracovaná dokumentace a funkční komunita, která je schopna podat pomocnou ruku v okamžiku, kdy si nevíme rady, je základ pro aktivní využití ORM frameworků. ORM framework přidává do aplikace další vrstvu, což v případě větších komplexnějších frameworků znamená vyšší paměťovou náročnost, která je pak znatelná. (Tröster, 2010) Tab. 1
ORM frameworky pro PHP
Framework
Návrhový vzor
Licence GNU LPGL GNU LPGL
Domovská stránka
Doctrine
Active Record
Doctrine 2
Data Mapper
Cake PHP
Active Record
MIT
http://cakephp.org/
Propel
Active Record
MIT
http://propelorm.org
Rocks
Active Record
GNU
http://www.php-rocks.com/
php.activerecord Active Record
MIT
http://www.phpactiverecord.org/
Codelgniter
BSD
http://ellislab.com/codeigniter
5.1
Active Record
http://www.doctrine-project.org/ http://www.doctrine-project.org/
Návrhové vzory
Podle Martina Fowlera a jeho knihy Patterns of Enterprise Application Architecture se návrhové vzory, které se týkají ORM, dají rozdělit na návrhové vzory architektury a návrhové vzory chování. Návrhový vzor architektury popisuje vazby mezi relačním databázovým uložištěm a objektovým modelem. Doménový model je souhn tříd obsahující logiku vazeb, specifikuje atributy tříd, primární klíče, cizí klíče a další potřebné vlastnosti odpovídající tabulkám v databázi. Mezi návrhové vzory architektury patří Table Data Gateway, Row Data Gateway, Active Record, Data Mapper. Návrhové vzory chování se zabývají způsobem efektivního načtení a uložení dat. Mezi nejvýznamnější návrhové vzory patří Unit of Work, Identity Map, Join fetching a Lazy Load.
ORM systémy
5.1.1
24
Table Data Gateway
Objekt fungující jako brána do databázové tabulky. Jeden příklad zpracovává všechny řádky v tabulce. Table Data Gateway obsahuje všechny SQL pro přístup jediné tabulky nebo zobrazení, výběr, vložení, aktualizace a odstranění. Jiný kód volá jeho metody pro všechny interakce s databází. (Fowler, 2003)
Obr. 3 Table Data Gateway Zdroj: Fowler, 2003
5.1.2
Row Data Gateway
Objekt fungující jako brána do jednoho záznamu ve zdroji dat. K dispozici je jedna instance pro řádek. Row Data Gateway objekty vypadající přesně jako záznam struktury, ale lze k němu přistupovat pomocí běžných mechanizmů programovacího jazyka. (Fowler, 2003)
Obr. 4 Row Data Gateway Zdroj: Fowler, 2003
5.1.3
Active Record
Objekt, který zabalí řádek databázové tabulky a zapouzdřuje přístup k databázi, přidává doménovou logiku k těmto datům. Objekt přenáší jak data, tak i chování. Active Record dává datovou logiku v objektu domény. Pro snadný způsob čtení dat z databáze a zapisování dat do databáze. (Fowler, 2003)
ORM systémy
25
Obr. 5 Active Record Zdroj: Fowler, 2003
5.1.4
Data Mapper
Vrstva mapování přenášející data mezi objekty a databází nezávisle na sobě a mapování samotné. Samotné objekty a struktura relační databáze mají různé mechanismy pro strukturování dat. Data Mapper je vrstva softwawru oddělující v paměti objekty z databáze. Jeho úkolem je přenos dat mezi dvěma strukturami a také je izolovat od sebe navzájem. S návrhovým vzorem Data Mapper v paměti objekty nemusí vědět, že je přítomna databáze, nepotřebují žádný SQL kód rozhraní a ani žádnou znalost schématu databáze. (Martin Fowler, 2003) Návrh Data Mapper se využívá hlavně pro účely, kdy nejsou totožné pohledy schématu relační databáze a objektového schématu. Vhodným příkladem pro návrhový vzor Data Mapper je například přihlašování uživatelů. (Roman Matěna, 2009)
Obr. 6 Data Mapper Zdroj: Fowler, 2003
5.1.5
Unit of Work
Unit of Work uchovává informace o objektech ovlivněných busniess transakcí a přiřazuje psaní ze změn a vyřešení souběžných problémů. Unit of Work udržuje informace o všem, co se provádí během bussnies transakcí, které mohou ovlivnit databázi. (Martin Fowler, 2003)
ORM systémy
26
Obr. 7 Unit of Work Zdroj: Fowler, 2003
5.2 Typy vztahů Vztahy v objektu schémat jsou realizovány pomocí kombinace odkazů na objekty a operací. Když je vztah jednosměrný, kód je implementovaný pouze objektem, který ví o dalším objektu. Obousměrné asociace jsou realizovány v obou třídách. Vztahy v relačních databázích jsou uskutečňovány pomocí cizích klíčů. Cizí klíč je datový atribut, který se objeví v tabulce a může být součástí jiné tabulky. Objektové vztahy lze rozdělit do dvou kategorií. První kategorie je založena na kardinalitě a zahrnuje tři typy: One-to-one, One-to-many, Many-to-many. Druhá kategorie je založena na směrovosti a obsahuje dva typy vztahů: jednosměrné a obousměrné vztahy. (Amber, nedatováno)
ORM systémy
27
Obr. 8 Vztahy mezi objekty Zdroj: Amber, nedatováno
5.3 Doctirne Framework Doctrine zajišťuje mapování objektů na relační databázi. Nyní je Doctrine ve verzi Doctrine 2, které má s Doctrine společný jen název. Každá z verzí je založena na jiném návrhovém vzoru. Doctrine bylo založeno na návrhovém vzoru Active Record a Doctrine 2 na návrhovém vzoru Data Mapper. Kdo přecházel na novější verzi, mohl postrádat řadu funkcí, na které byl zvyklý z původní verze Doctrine. Například v Doctrine 2 zcela chybí behaviours zajišťující snadné verzování, řazení, hieararchizaci, vícejazyčnost a spoustu dalších užitečných chování. Doctrine 2 je koncipována jako čisté ORM. Systém zajistí namapování objektů na databázi. Doctrine 2 se stále vyvíjí. Pro běh Doctrine 2 je zapotřebí mít verzi PHP 5.3 a vyšší, na starších verzích se již nerozběhne. Využívá totiž nové vlastnosti jazyka PHP, jako jsou namespace nebo vylepšený garbage collerctor. Doctrine 2 je inspirován ORM frameworkem pro Javu Hibernate (http://www.hibernate.org/). Pro definice vlastností jednotlivých entit se zde používají komentářové anotace, nebo XML a YAML skripty. Doctrine 2 využívá uvnitř anotací i datové typy pro popis sloupců. Datové typy má Doctrine 2 předdefinované, ale jdou vytvořit i vlastní. Jsou to speciální mapovací typy, kterými se určuje, co a jak se má z PHP namapovat do databáze. Srovnání a přehled datových typů pro Doctrine 2, PHP a databázové typy je zobrazen v tabulce Datové typy. (Tichý, 2010)
ORM systémy Tab. 2
28
Datové typy
DOCTRINE 2 TYP string text integer smallint bigint decimal boolean date time
PHP TYP string string integer integer string double boolean DateTime DateTime
datetime
DateTime
datetimetz
DateTime
object array
object array
DATABÁZOVÝ TYP VARCHAR CLOB INT SMALLINT BIGINT DECIMAL BOOLEAN DATETIME TIME DATETIME či TIMESTAMP bez časové zóny DATETIME či TIMESTAMP s časovou zónou CLOB CLOB
Zdroj: Tichý, 2010
Struktura databáze i veškeré její změny se generují automaticky z definic entit. Klasické SQL dotazy lze nahradit DQL (Doctrine Query Language) notací, kde se místo názvů tabulek a atributů využívá výhradně názvů entit a jejich proměnných. Doctrine 2 je rozdělena do tří vrstev. 5.3.1
Common vrstva
Vrstva definuje základní obecná rozhraní, třídy a knihovny. Obsahuje například nástroje pro práci s kolekcemi, anotacemi, událostmi apod. Tuhle vrstvu pak využívají obě vyšší vrstvy. Vrstva Common je na zbylých dvou vrstvách zcela nezávislá, takže by mohla byt použita i samostatně. Vše, co patří k téhle vrstvě, je definováno v namespace DoctrineCommon. 5.3.2
DBAL (DataBase Abstraction Layer) vrstva
Odděluje zbytek aplikace od konkrétního typu databáze. Není tedy podstatné, s jakou databází pracujete, jestli s MySQL nebo třeba Postgre. Hlavně rozšiřuje standardní PDO (PHP Data Objects) driver, ale umí pracovat i s jinými drivery. Zavádí také notaci DQL (Doctrine Query Language). Vrstva DBAL je závislá na nižší vrstvě Common, ale lze ji opět použít i samostatně bez poslední vrstvy. Vše k téhle vrstvě je definováno v namespace DoctrineDBAL.
ORM systémy
5.3.3
29
ORM (Object-Relational Mapping) vrstva
Nejvyšší vrstva, na které je založený celý framework. Vrstva umožňuje mapování aplikačních objektů na relační databázi a jejich persistování a načítání. ORM vrstva je závislá na obou nižších vrstvách. Namespace téhle vrstvy je DoctrineORM. (Tichý, 2010)
Obr. 9 Doctrine rozhraní Zdroj: Tröster, 2010
5.4 php.activerecord php.activerecord je open source ORM knihovny založené na návrhovém vzoru Active Record. Cílem tohoto frameworku je masivní zjednodušení interakce s databází a odstranění ručně psaného SQL kódu pro běžné operace. Na rozdíl od jiných ORM systémů se zde nemusí používat žádné generátory kódu, ani zachovávání mapovacích souborů pro tabulky. Knihovna je licencována pod MIT licencí. (phpactiverecord, nedatováno)
5.5 CakePHP CakePHP je rychle rozvíjený open source framework pro PHP. Hlavním cílem je umožnit pracovat strukturovaně a rychlým způsobem. CakePHP je kompatibilní s PHP4 a PHP5, má integrovaný CRUD generátor pro databáze. Využívá MVC (Model View Controller) architekturu. CakePHP využívá běžné návrhové vzory jako ActiveRecord, Association Data Mapping a MVC a nepotřebuje téměř žádnou konfiguraci Appache. (developmentguruji.com, 2009) V roce 2005 napsal Michal Tatarynowicz minimální verzi Rapid Application Framework v PHP. Zjistil však, že se jedná o velmi dobrý začátek pro framework. Publikoval framework pod licencí MIT a nazval jej Cake a otevřel ho také
ORM systémy
30
pro komunitu vývojářů, kteří Framework nyní udržují pod názvem CakePHP. (CakePHP, nedatováno)
5.6 Propel Propel je open ORM framework pro PHP5. Umožňuje přístup k databázi pomocí sady objektů, která poskytuje jednoduché API pro ukládání a načítání dat. Propel používá PDO jako abstraktní vrstvu, implementuje také všechny klíčové koncepty vyspělých ORM vrstev: návrhový vzor ActiveRecord, validátory, dědičnost, behaviors, lazy loading, vnořené transakce apod. Propel podporuje rozhraní MySQL, PostgreSQL, SQLite, MSSQL a Oracle. Kód vygenerovaný v Propelu je dobře okomentován. Projekt Propel byl zahájen v roce 2005 a již je využíván na více jak tisících webových stránkách. (Propel, nedatováno)
5.7 CodeIgniter CodeIgniter je aplikační vývojový framework pro lidi, kteří chtějí vytvářet webové stránky pomocí PHP. Cílem je umožnit rozvíjet projekty mnohem rychleji, než když by se psali kódy od začátku tím, že poskytuje bohatou sadu knihoven pro běžně potřebné úkoly, také poskytuje jednoduché rozhraní a logickou strukturu přístupu. CodeIgniter je licencován pod open source licencí BSD. Jádro celého systému vyžaduje pouze několik velmi malých knihoven. Další knihovny jsou načítány dynamicky na vyžádání, na základě potřeb pro daný proces. Systém lze také rozšířit pomocí vlastních knihoven. Velká skupina knihoven umožňuje nejčastější potřebné úkoly pro vývoj webových aplikací, jako je přístup k databázi, posílání e-mailů, ověřování dat z formuláře, udržování relací, manipulaci s obrázky, práci s XML daty a mnohem více. CodeIgniter používá MVC přístup, který umožňuje velký odstup mezi logikou a prezentací dat. (EllisLab, nedatováno) První beta verze vznikla ke konci února 2006. Poslední stabilní verze 2.1.3 vznikla v roce 2012. (EllisLab, nedatováno)
5.8 Rocks Knihovna Rocks začala původně jako aplikace pro domácí použití, nakonec však byla uvolněna jako open source projekt pomocí GNU General Public License (GPL), takže je zdarma k použití jako nekomerční software. Rocks podporuje interaktivní uživatelskou podporu prostřednictví fór určených pro tenhle projekt a také má zajištěnou dokumentaci k projektu, další součástí podpory jsou rozsáhlé tutoriály. Framework Rock obsahuje například funkce pro databáze nezávislé na přístupu tříd. RocksDBO třída, která umožňuje přístup do databázových tabulek bez použití SQL rychlým a snadným způsobem. (Rocks, nedatováno)
Ukázková aplikace
31
6 Ukázková aplikace Jako ukázková aplikace byla zvolena databáze filmů. Pro srovnání byla vytvořena aplikace ve dvou verzích. V jedné verzi byl použit skriptovací jazyk PHP spolu s databázovým serverem MySQL. U druhé verze byl doplněn ORM systém Doctrine 2, u kterého nezáleží na výběru databázového serveru. Framework Doctrine 2 byl zvolen, protože patří mezi nejrozšířenější komplexní ORM systémy pro jazyk PHP. Na závěr byla k oběma verzím doplněna CSS šablona se stejným vzhledem pro obě verze aplikace. Pro porovnání obou verzí jsou u každé z verzí zobrazeny části kódu pro editaci filmů.
6.1 Ukázková aplikace bez ORM frameworku V případě verze bez ORM systému, byl nejdříve vytvořen relační databázový model, kde se ujasnilo, jaké tabulky bude aplikace obsahovat, který je zobrazen na obrázku 12. Ukázková aplikace obsahuje tabulky potřebné k získání informací o filmu, osobách spolupracujících na filmu a jejích rolích. Databáze byla vytvořená pomocí jazyka MySQL a serveru phpMyAdmin. Poté se vytvořili pomocí skriptovacího jazyku PHP potřebné skripty pro připojení k databázi a další skripty k vypsání, vytvoření, mazání a úpravě dat. V téhle verzi bylo přidáno i přihlášení uživatele, pro správu aplikace. 6.1.1
Editace filmu bez ORM frameworku
Při editaci filmů se nejdříve kontroluje, zda bylo zmáčknuto tlačítko na provedení úprav ve filmu. Musí se pomocí SQL dotazu UPDATE upravit data daného filmu, jehož id se předává v adrese webové stránky. Změněné hodnoty upraví podle dat, které se upravily ve formuláři. Pokud MySQL dotaz na úpravu proběhne správně tak se stránka přesměruje na stránku věnovanou celkovému výpisu všech filmů. Kód k editaci je zobrazen na Obrázku 10.
Ukázková aplikace
Obr. 10
32
Editace filmu bez ORM frameworku
6.2 Ukázková aplikace s ORM frameworkem K vytvoření aplikace s ORM frameworkem se nejdříve musel daný framework nainstalovat. Nejdříve se nainstaloval program Composter, pomocí něhož se stáhly všechny části ORM systému Doctrine 2. Vývojové prostředí spolupracuje s Doctrine 2, musely se však v nastavení propojit pomocí souboru doctrine. Díky téhle spolupráci se nemusí systémové příkazy pro doctrine psát do příkazové řádky, ale obsahuje je právě i vývojové prostředí NetBeans, kde jsou příkazy i popsány. Pro tuhle verzi se museli vytvořit jednotlivé třídy, které představovali entity systému. Do každé třídy se napsali atributy, které měla daná entita obsahovat. K vytváření entit se u frameworku Doctrine 2 využívají anotace u tříd, nebo zápis tříd v jazyce XML nebo YAML. V téhle aplikaci bylo využito anotací u tříd a následné vygenerování tříd v jazyku XML a YAML. Doctrine 2 obsahuje příkazy pro usnadnění psaní tříd, příkaz doctrine orm:generate-entities, nám díky anotacím tříd, které obsahují i zápisy vazeb tříd mezi sebou a datové typy jednotlivých atributů, vygeneruje základní funkce pro jednotlivé entity. Databázové schéma se vytvoří pomocí příkazu doctrine orm:schema-tool:create a upravuje se pomocí doctrine orm:schema-tool:update. Správné namapování tříd zjistíme pomocí příkazu doctrine orm:info. Nakonec zjistíme, zda je vytvořené schéma validní s namapovanými třídy pomocí příkazu doctrine orm:validate-schema. Všechny příkazy jde také zadávat do příkazové řádky, kde fungují stejně. Skripty pro vypsání, editaci, mazání a vytvoření dat se zapisují pomocí vygenerovaných funkcí, jako jsou funkce get a set. V relační databázi jsou vytvořené dvě tabulky mezi tabulkami Osoba a Film, jelikož se jedná o vazbu M:N, jedna určuje režiséry a druhá herce k filmu. Doctrine 2, však dokáže po namapování tříd u takových vazeb vytvořit spojovací tabulky sám a nemusí se pro ně tvořit třídy. U vytvořené ukázkové aplikace však byla vytvořena třída Smlouva, která je jako entita místo propojovací tabulky Film_herec, protože se
Ukázková aplikace
33
na tabulku váže ještě jedna tabulka a to tabulka Role, proto zde byla vazba M:N mezi entitou Film a Osoba rozdělena na dvě vazby 1:N mezi entity Film – Smlouva a Smlouva – Osoba. Výchozí skript pro verzi s ORM systémem Doctrine2 je filmList.php, který zobrazuje výpis filmů. U každého filmu jsou zde základní informace, dále obsahuje odkaz na herce k filmu a také odkazy na skripty pro úpravu filmu. Najdeme zde také odkaz na přidání nového filmu a tlačítko na smazání vybraného filmu. Díky nedostatku zkušeností se systémem se u složitější rozložené vazby mezi entitami film a osoba nepodařilo zprovoznit smazání herce u filmu, přidání herce k filmu a u úprav herce změna jeho role. 6.2.1
Editace filmu s ORM frameworkem Doctrine 2
Při editaci filmu s ORM frameworkem Doctrine 2 se po zmáčknutí tlačítka ve formuláři vykonají příkazy na editování. Nejdříve si do proměnné načteme daný film, který chceme upravovat pomocí zjištěného idFilmu, získané z adresy webové stránky. Potom na tu samou proměnou voláme metody pro nastavení daných parametrů. U entit Země a Žánr, které jsou k filmu přiřazeny pomocí vazby 1:N máme metodu pro nastavení země nebo žánru, do které se pomocí entity manageru načte země nebo žánr vybraný z rozevíracího seznamu. U režiséra, kde je vazba M:N se přidává režisér pomocí metody add, nejdříve však musíme aktuálního režiséra smazat, to lze udělat pomocí metody remove a nebo zavolání metody clear. Poté přidáme režiséra, kterého jsme opět vybrali z rozevíracího seznamu. Nakonec se zavolá na entity manager metoda persist, kde je jako parametr daná proměnná, která se upravovala. Metoda persist zajišťuje přidání, nebo úpravu proměnných. Metoda flush zavolaná na entity manager nám dané příkazy vykoná a uloží. Popsaný kód pro editaci filmu je zobrazen na obrázku 11.
Obr. 11
Editace filmu s frameworkem Doctrine 2
Závěr
34
7 Závěr Práce popisuje všechny potřebné komponenty při tvorbě webových aplikací se skriptovacím jazykem PHP. Jsou zde popsána vývojová prostředí, které ulehčují práci při tvorbě webových aplikací. Práce obsahuje také informace o ORM systémech a jejich přehled v tabulce, kde jsou vypsány základní informace ke každému systému. V této práci byly srovnány přístupy s ORM systémem a bez něj. Byla vytvořena ukázková aplikace s oběma přístupy pro srovnání zápisu. V práci je také popsána ukázková aplikace, která vznikla pro přehledné srovnání ve dvou verzích. Ke každé verzi je zde zmíněna ukázka kódu, který vykonává v obou verzích stejnou funkci. ORM systémy jsou v dnešní době už poměrně rozšířené do většiny programovacích jazyků, stále se vyvíjejí nové systémy a jejich nové verze. V této práci byly popsány rozšířené ORM systémy, z nichž jsou některé komplexnější a některé jsou zaměřené pouze na určité funkce. Mezi rozšířené komplexní ORM systémy patří právě Doctrine 2, který zde byl využit pro ukázkovou aplikaci. Podobný tomuto systému je Propel, který je postavený na podobném základu jako Doctrine. Spousta uživatelů srovnává jednotlivé systémy mezi sebou i podle vykonaných SQL dotazů, které si tam mohou nechat zobrazit nebo přímo podle výkonnosti a rychlosti. Tyto aspekty se však nedají objektivně porovnávat, systémy bývají založené na jiném návrhovém vzoru a každý je tvořený trochu jinak, takže i propracovanější systém nám může ubrat na rychlosti a výkonu. ORM systémy dokáží ulehčit práci při tvorbě větších komplexnějších webových aplikací, avšak má jednu velkou nevýhodu, musí být nastudována, někdy hodně rozsáhlá, dokumentace daného ORM systému. Ne každému také vyhovují funkce, které daný systém obsahuje a chtěl by třeba využívat nějaké jiné funkce. Tento problém mnozí uživatelé řeší tím, že si napíší vlastní ORM systém, což jim sice zabere čas, ale vědí, co si tam naprogramují za funkce, které budou potřebovat a naprogramují si to také podle toho jak jim to bude nejlépe vyhovovat a co nejvíce budou využívat. Možná to v podstatě vyjde na stejno, jako studovat dokumentaci ke komplexnímu ORM systému. Spousta uživatelů však stále dává přednost klasickému použití PHP než využít objektový přístup natož pak s nějakým ORM systémem. Především se jedná o uživatele, kterým takový přístup vyhovuje a neučí se nové věci s novými možnostmi jazyka. Pro základní webové aplikace nemá v podstatě smysl používat ORM systém, avšak pro vyzkoušení daného systému postačí i malá základní aplikace, kde se dají vyzkoušet funkce ORM systému a poté se rozhodnout pro jeho nasazení i v komplexních projektech.
Literatura
35
8 Literatura AMBER, S. W. Mapping Objects to Relational Databases: O/R Mapping In Detail. [online]. [cit.2013-05-13]. Dostupné z: http://www.agiledata.org/ essays/mappingObjects.html. BRÁZA, J., PHP 5: začínáme programovat. Praha: Grada Publishing a.s. ., 2005. 244 s. ISBN 80-247-1146-X. CAKEPHP. Introduction to CakePHP. [online]. [cit. 2013-05-13]. Dostupné z: http://book.cakephp.org/1.1/en/introduction-to-cakephp.html. DEVELOPMENTGURUJI.COM. About CakePHP. [online]. [cit. 2013-05-13]. Dostupné z: http://www.developmentguruji.com/blog/120/AboutCakePHP.html. ECLIPSE. About the Eclipse Foundation. [online]. [cit. 2013-05-13]. Dostupné z: http://www.eclipse.org/org/. ECLIPSE. Eclipse PHP Integrated Development Environment. [online]. [cit. 2013-05-13]. Dostupné z: http://www.eclipse.org/proposals/php-ide/. ELISLAB. CodeIgniter at a Glance. [online]. [cit. 2013-05-13]. Dostupné z: http://ellislab.com/codeigniter/user-guide/overview/at_a_glance.html. ELISLAB. Change Log. [online]. [cit. 2013-05-13]. Dostupné z: http://ellislab.com/codeigniter/user-guide/changelog.html. FOWLER, M. Active Record. [online]. 2003 [cit. 2013-05-13]. Dostupné z: http://martinfowler.com/eaaCatalog/activeRecord.html. FOWLER, M. Data Mapper. [online]. 2003 [cit. 2013-05-13]. Dostupné z: http://martinfowler.com/eaaCatalog/dataMapper.html. FOWLER, M. Row Data Gateway. [online]. 2003 [cit. 2013-05-13]. Dostupné z: http://martinfowler.com/eaaCatalog/rowDataGateway.html. FOWLER, M. Table Data Gateway. [online]. 2003 [cit. 2013-05-13]. Dostupné z: http://martinfowler.com/eaaCatalog/tableDataGateway.html. FOWLER, M. Unit of work. [online]. 2003 [cit. 2013-05-13]. Dostupné z: http://martinfowler.com/eaaCatalog/unitOfWork.html. FURMAN, S. Otaznik menom ASP.NET. [online]. 2002 [cit. 2013-05-13]. Dostupné z: http://interval.cz/clanky/otaznik-menom-aspnet/. GILMORE, J. W. Velká kniha PHP a MySQL 5: kompendium znalostí pro začátečníky i profesionály. Vyd. 1. [i.e. 2. vyd.]. Brno: Zoner Press, 2007, 864 s. ISBN 80-868-1553-6. JANOVSKÝ, D. Možnosti PHP [online]. [cit. 2013-05-13]. Dostupné z: http://www.jakpsatweb.cz/php/moznosti-php.html. JANOVSKÝ, D. Programování stránek [online]. [cit. 2013-05-13]. Dostupné z: http://www.jakpsatweb.cz/programovani.html.
Literatura
36
KOSEK, J. HTML: tvorba dokonalých www stránek : podrobný průvodce. Vyd. 1. Praha: Grada, 1998, 291 s. ISBN 80-716-9608-0. KOSEK, J. Server Side Includes [online]. 1999 [cit. 2013-05-13]. Dostupné z: http://www.kosek.cz/clanky/iweb/02.html. LACKO, L. PHP 5 a MySQL 5: hotová řešení. Vyd. 1. Brno: Computer Press, 320 s. ISBN 978-80-251-1695-1. LAHVIČKA, J. PHP-základní informace. [online]. 2000 [cit. 2013-05-13]. Dostupné z: http://interval.cz/clanky/php-zakladni-informace/. LAVIN, P. PHP - objektově orientované: koncepty, techniky a kód. 1. vyd. Praha: Grada. ISBN 978-802-4721-378. MATĚNA, R. ORM, Row Data Gateway, Table Data Gateway, Active Record, Data Mapper. [online]. 2009 [cit. 2013-05-13]. Dostupné z: http://www.webfaq.cz/clanek/ORM-Row-Data-Gateway-Table-DataGateway-Active-Record-Data-Mapper. MOSOFTWARE. PhpDesigner 8. [online]. [cit. 2013-05-13]. Dostupné z: http://www.mpsoftware.dk/phpdesigner.php. NETBEANS. A Brief History of NetBeans. [online]. [cit. 2013-05-13]. Dostupné z: http://netbeans.org/about/history.html. NETBEANS. NetBeans IDE Features. [online]. [cit. 2013-05-13]. Dostupné z: http://netbeans.org/features/index.html. NETBEANS. PHP development. [online]. [cit. 2013-05-13]. Dostupné z: http://netbeans.org/features/php/index.html. NOVULO. ORM. [online]. [cit. 2013-05-13]. Dostupné z: http://www.novulo.com/Orm.aspx. ORACLE. About MySQL. [online]. [cit. 2013-05-13]. Dostupné z: http://www.mysql.com/about/. PANSKÝ, M. Jedenáctý Oracle podruhé. [online]. 2007 [cit. 2013-05-13]. Dostupné z: http://www.dbsvet.cz/view.php?cisloclanku=2007100901. PHPACTIVERECORD. PhpActiveRecord. [online]. [cit. 2013-05-13]. Dostupné z: http://www.phpactiverecord.org/. POSTGRESQL. About. [online]. [cit. 2013-05-13]. Dostupné z: http://www.postgresql.org/about/. POSTGRESQL. History. [online]. [cit. 2013-05-13]. Dostupné z: http://www.postgresql.org/about/history/. PROPEL. Propel. [online]. [cit. 2013-05-13]. Dostupné z: http://propelorm.org/. ROCKS. Rocks PHP library. [online]. [cit. 2013-05-13]. Dostupné z: http://www.php-rocks.com/rocks_php_library.php. SUK, M. ASP.NET WebForms – 1.díl – Úvod. [online]. 2012 [cit. 2013-05-13]. Dostupné z: http://programujte.com/clanek/2012033100-asp-netwebforms-1-dil-uvod/.
Literatura
37
TICHÝ, J. Doctrine 2: úvod do systému. [online]. 2010 [cit. 2013-05-13]. Dostupné z: http://www.zdrojak.cz/clanky/doctrine-2-uvod-do-systemu/. TICHÝ, J. Doctrine 2: základní definice entit. [online]. 2010 [cit. 2013-05-13]. Dostupné z: http://www.zdrojak.cz/clanky/doctrine-2-zakladni-definiceentit/. TRÖSTER, F. ORM frameworky pro PHP5: Obecný úvod. [online]. 2010 [cit. 2013-05-13]. Dostupné z: http://www.zdrojak.cz/clanky/orm-frameworkypro-php5-obecny-uvod. WEBSTORM. PhpStorm - PHP IDE for developing smarter, not harder. [online]. [cit. 2013-05-13]. Dostupné z: http://www.jetbrains.com/ phpstorm/index.htm. MySQL. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation [cit. 2013-05-13]. Dostupné z: http://en.wikipedia.org/wiki/MySQL. ZAJÍC, P. PHP (1) - Historie a budoucnost. [online]. 2004 [cit. 2013-05-13]. Dostupné z: http://www.linuxsoft.cz/article.php?id_article=171.
Přílohy
38
Přílohy
Relační model databáze
39
A Relační model databáze Pro ukázkovou aplikaci bylo využito modelu relační databáze s tabulkami a vazbami zobrazenými na Obrázku 12.
Obr. 12
Relační model databáze
Vzhled ukázkové aplikace
40
B Vzhled ukázkové aplikace Výsledná ukázková aplikace má vytvořený vzhled pomocí šablony CSS. Na obrázku 13 je vyobrazena ukázková aplikace bez ORM systému. Obě verze mají však téměř stejný vzhled.
Obr. 13
Ukázková aplikace
Obsah přiloženého CD
41
C Obsah přiloženého CD Složky a jejich obsah: Doctrinefilm – zdrojové kódy pro ukázkovou aplikaci s ORM frameworkem Doctrine 2 Dokumenty – elektronická verze bakalářské práce, návod k instalaci frameworku Doctrine 2, obrázek relačního modelu databáze, vzorová data, struktura databáze, soubor se strukturou databáze a vzorovými daty Film – zdrojové kódy pro ukázkovou aplikaci bez ORM frameworku