ORM frameworky pro PHP5: Obecný úvod

ORM (Object Relational Mapping), tedy metoda mapování relační databáze na objekty, má podporu ve všech moderních programovacích jazycích. S příchodem PHP5 a ustálením koncepce objektového programování začal také vývoj ORM frameworků pro PHP. V tomto třídílném miniseriálu se seznámíme se dvěma zástupci návrhového vzoru Active Record a ukážeme si přínosy jejich nasazení v reálných situacích.

Seriál: ORM frameworky pro PHP (3 díly)

  1. ORM frameworky pro PHP5: Obecný úvod 27.1.2010
  2. ORM frameworky pro PHP5: Doctrine ORM 3.2.2010
  3. ORM frameworky pro PHP5: Databázový model 10.2.2010

Významnějších ORM frameworků pro PHP5 je v současnosti několik desítek. Většina je založena na návrhovém vzoru Active Record, kdy objekt reprezentuje řádek tabulky a obstarává základní operace s řádkem: vytvoř, aktualizuj a smaž (v angličtině zkratka CRUD, která bude i dále použita jako označení základních operací). Frameworky je možné dělit podle počtu funkcí, které nabízejí programátorovi.

Může se jednat o minimalistický přístup, kdy je poskytnuta abstraktní databázová vrstva pro jednotný přístup k různým databázovým systémům, základní operace CRUD a případně další funkce pro rychlé získání záznamu (např. podle primárního klíče). Komplexní přístup kromě výše uvedených funkcí přidává další nadstavby, které usnadní vývoj rozsáhlejšího nebo modulárního systému. Frameworky Doctrine a Propel jsou zástupci komplexních frameworků a v následujících článcích se seznámíme s jejich přínosem v reálných projektech.

Před výběrem frameworku je potřeba určit, jaké jsou nároky na vyvíjenou aplikaci. Frameworky Doctrine i Propel jsou nejvhodnější pro aplikace splňující alespoň jednu z těchto podmínek:

  • Aplikace s očekávaným nasazením vícečlenného vývojářského týmu a dlouhodobým vývojem.
  • Modulární aplikace, např. internetový obchod nebo redakční systém, u které je potřeba mít možnost připojovat jednotlivé nezávislé moduly.
  • Kritická aplikace s nutností zajištění kvality kódu.

Výhody použití ORM frameworku

Přínos frameworků klesá se snižující se velikostí aplikace a pro jednoduchou stránku bez redakčního systému a s několika tabulkami ztrácí jejich nasazení smysl. ORM framework vhodně doplňuje MVC (Model View Controler) framework a unit testy, což jsou dobré základy pro vývoj robustních webových aplikací. Pojďme se podrobněji pozastavit nad obecnými výhodami nasazení ORM frameworku:

  • Abstraktní databázová vrstva

    Ačkoliv PHP standardně nabízí PDO pro univerzální přístup k databázovým systémům, stále zůstává nejednotný zápis SQL příkazů (např. omezení pro výběr prvních 10 záznamů z dotazu je různý pro MySQL a MSSQL). Doctrine i Propel nabízí zápis databázových dotazů, který je přenositelný mezi různými databázemi a to i včetně dotazů pro tvorbu nebo aktualizaci struktury tabulek.

  • Zapouzdření do objektů

    Možnost zapouzdřit související funkce přímo do objektu reprezentujícího řádek tabulky velice usnadní čitelnost a testovatelnost kódu. Většina ORM frameworků nabízí předgenerované třídy pro každou tabulku databáze se základními metodami CRUD, gettery a settery. Tyto objekty je možné dále rozšiřovat, aniž by došlo při dalším generování základních tříd k jejich nežádoucímu přepsání.

  • Unit testy

    ORM frameworky mají v mnoha případech zajištěnu kvalitu kódu pomocí unit testů a jsou napsány tak, aby bylo možné testovat i metody v rozšířených třídách. Pokud ORM framework podporuje databáze s paměťovým úložištěm (např. SQLite memory), jsou unit testy velice rychlé a je zajištěno izolované prostředí pro každý běh testu.

  • Validátory hodnot

    Hodnoty objektu (a tedy i záznamu tabulky) jsou nastavovány přes vygenerované gettery a settery nebo přes magické metody představené v PHP5. Proto je možné hodnoty před nastavením validovat případně vyčistit od nebezpečných znaků. ORM frameworky, které jsou generované z databázové struktury nebo popisných souborů (XML, YML nebo anotace), samy vygenerují základní validátory na povinné hodnoty a datové typy proměnných třídy.

  • CRUD generátor

    Základní operace se záznamy jsou hlavním účelem administračního systému. ORM framework je schopen na základě definice databázových objektů vytvořit uživatelské rozhraní pro tyto operace včetně validátorů a výpisů s filtrací. Vygenerované rozhraní je možné dále rozšiřovat a CRUD generátor může úspěšně fungovat jako základ rozsáhlých administračních systémů.

Nevýhody ORM frameworků

  • Učící křivka

    Největší nevýhodou ORM frameworku je nutnost naučit se framework používat. Čím více je framework komplexní, tím více dokumentace je potřeba zpracovat. Při výběru vhodného frameworku je nutné si předem ověřit dostupnost kvalitní dokumentace a zda existuje funkční komunita, která bude schopna podat pomocnou ruku v okamžiku, kdy se dostaneme mimo pole pokryté dokumentací.

  • Riziko výběru špatného ORM frameworku

    Jak již bylo uvedeno výše, ORM frameworků pro PHP je mnoho a výběr toho správného je komplikovaný. Musíme si uvědomit, jaké funkce očekáváme a zhruba jaký objem dat bude cílová aplikace obsahovat. ORM frameworky jsou poměrně mladé a stále se intenzivně vyvíjejí a přichází s novými funkcemi, proto je důležité vybrat framework se silnou vývojářskou komunitou a dostatečně otevřenou licencí, aby nebyly překážky v dalším vývoji. Dále je dobré předem zjistit, jak framework pracuje s většími objemy dat a zda nenarazíme na paměťové limity.

  • Paměťová a procesorová náročnost

    ORM framework přidává do aplikace další vrstvu a v případě větších frameworků je vyšší paměťová náročnost znatelná. Při mapování záznamu tabulky na objekt dochází k takzvané hydrataci (angl. hydrate), každý objekt zabírá své místo v paměti a při načtení většího počtu záznamů můžeme narazit na paměťový limit pro běh jednoho skriptu. Navíc až do PHP 5.3 byly problémy s uvolňováním paměti, zejména u objektů s cyklickými vazbami.

    Nejedná se o nepřekonatelný problém, jen je vždy nutné s paměťovou náročností počítat. Větší množství pasivní záznamů (např. výpis položek) je lepší načíst do proměnné typu pole a pouze položky, na kterých budou volány funkce, načítat do objektů.

Chcete se naučit o PHP víc?

Akademie Root.cz pořádá školení Kurz programování v PHP5. Jednodenní kurz programování v PHP 5 je určen všem webovým vývojářům, kteří se chtějí do hloubky seznámit a sžít s programovacím jazykem PHP ve verzi 5. První část kurzu je zaměřena na nový objektový model se všemi jeho vlastnostmi, ošetření chyb pomocí výjimek a efektivní využití těchto konceptů. Druhá část je zaměřena na nové knihovny PHP 5, především pro práci s databázemi, XML a objekty. Pozornost je věnována i zajištění kompatibility s PHP 4, přechodu z této verze a výhledu na PHP 6. Máte zájem o jiné školení? Napište nám!

ORM frameworky Doctrine a Propel

V dalším dílu článku se podrobněji seznámíme s frameworkem Doctrine. Vlastnosti popsané pro tento framework platí s menšími odchylkami i pro framework Propel. Tyto frameworky byly vybrány, protože se jedná o nejčastěji používané komplexní ORM frameworky. Projekt Propel započal v roce 2005, bohužel ale zhruba od roku 2007 došlo ke zpomalení vývoje a uživatelé zůstali dlouho s poslední stabilní verzí 1.2, která obsahovala ovšem několik nepříjemných vlastností a chyb. V roce 2009 došlo k výměně hlavního vývojáře a opětovnému oživení projektu. Propel je nyní ve verzi 1.4.

Vrstvy ORM frameworku Doctrine

Od roku 2007 byl vyvíjen projekt Doctrine, který zvolil trochu jiný přístup než Propel a přinesl lepší výkon a nové zajímavé funkce. První stabilní verze projektu Doctrine byla představena 1. září 2008. Lze říci, že koncepce zvolená v případě Doctrine je konzistentnější a čistota kódu je mnohem větší (díky stovkám unit testů je vyšší i kvalita kódu). V současnosti probíhá vývoj na verzi Doctrine 2, která naplno využívá možností PHP 5.3 (jmenné prostory, anonymní funkce, vylepšený garbage collector a anotace). Za Doctrine stojí významný MVC framework Symfony a silná vývojářská i uživatelská komunita.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 33

Přehled komentářů

Jiří Knesl Nesouhlasím s první větou
Jiří Knesl Re: Nesouhlasím s první větou
Mastodont Re: Nesouhlasím s první větou
frantisek.troster Re: Nesouhlasím s první větou
Jiří Knesl Re: Nesouhlasím s první větou
frantisek.troster Re: Nesouhlasím s první větou
jos Re: Nesouhlasím s první větou
Jan Tichý Re: Nesouhlasím s první větou
Jiří Knesl Re: Nesouhlasím s první větou
frantisek.troster Re: Nesouhlasím s první větou
Jiří Knesl Re: Nesouhlasím s první větou
frantisek.troster Re: Nesouhlasím s první větou
smilelover CRUD na objektu?
Přezdívka: Re: CRUD na objektu?
frantisek.troster Re: CRUD na objektu?
smilelover Re: CRUD na objektu?
Petr Novotny Re: CRUD na objektu?
František Kučera Re: CRUD na objektu?
ToM Re: ORM frameworky pro PHP5: Obecný úvod
frantisek.troster Re: ORM frameworky pro PHP5: Obecný úvod
ToM Re: ORM frameworky pro PHP5: Obecný úvod
none_ Lazy loading?
frantisek.troster Re: Lazy loading?
none_ Re: Lazy loading?
Srigi Nette + Doctrine
Matej Re: Nette + Doctrine
Ped Re: Nette + Doctrine
Tom Re: Nette + Doctrine
frosty22 Re: Nette + Doctrine
backup neni to vsechno nejak moc komplikovane ?
frantisek.troster Re: neni to vsechno nejak moc komplikovane ?
analytik Kam zmizela ta diskuze o Propelu?
analytik Re: Kam zmizela ta diskuze o Propelu?
Zdroj: https://www.zdrojak.cz/?p=3160