10th Lis 2007

Zend Framework v kostce

V tomto článku bych chtěl v kostce představit Zend Framework. Obsah vychází z materiálů k mojí přednášce na Konferenci php frameworky podzim 2007.

Materiály ke stažení lze nalézt v článku PHP seminář podzim 2007 (a moje první přednáška) je za námi. Na mém blogu lze nalézt i článek Zend Framework – Hello World projekt (a MVC pattern), který (i když pojednává o verzi frameworku 0.7) vysvětluje pojem MVC a obsahuje i ukázkový příklad.

Jádro Zend Frameworku

Zend_Controller

Jádrem ZF je Zend_Controller. Je to balíček, který se stará o obsloužení požadavku, vytvoření modelu a vyrenderování view (odeslání odpovědi). Je postaven na návrhových vzorech MVC (pro oddělení aplikační logiky a view vrstvy) a Front Controller (všechny požadavky jsou přes jeden objekt, který rozhoduje, který z action controllerů požadavek obslouží).

Životní cyklus obsluhy požadavku je pak následující:
  1. V bootstrap souboru (index.php) se zavolá metoda Front controlleru (run nebo dispatch), která začně obsluhovat požadavek. Pokud nebyly předány instance objektů Zend_Controller_Re­quest a Zend_Controller_Res­ponse jsou vytvořeny
  2. Další krokem je routování – z URL se zjistí název action controlleru a akce, která požadavek obslouží. Tyto hodnoty jsou nastaveny do objektu Zend_Controller_Re­quest. Standardní routování funguje tak, že pracuje s adresáři v URL – například URL http://vavru.cz/clanek/editovat bude při routovací procesu zpracována tak, že název action controlleru bude clanek a název metody bude editovat.
  3. Nyní vykoná svoji práci Zend_Controller_Dis­patcher, který na základě názvu action controlleru a jeho akce vytvoří jeho instanci a zavolá příslušnou metodu. Dispatcher pracuje s danou konvencí v názvech action controllerů a akcí. Název clanek z bodu 2. bude přeložen na název controlleru ClanekController a editovat bude přeloženo na název metody editovatAction. Tato třída musí být uložena v příslušném adresáři a mít název ClanekController­.php. Standardní struktura ZF aplikace viz online dokumentace.
  4. V příslušné metodě action controlleru dojde k naplnění modelu daty. Tento bod může probíhat i ve smyčce. Můžeme „přesměrovat“ na jiný action controller a metody. Proto se této fázi (společně s bodem 3) říká dispatch loop.
  5. Dojde k vyrenderování view a jeho nastavení do objektu Zend_Controller_Res­ponse. Nastaví se též případné hlavičky. Odpověď je odeslána klientovi.
To byl ve zkratce výčet základních bodů, kterými prochází obsloužení každého requestu (požadavku). ZF obsahuje tři typy objektů, který můžeme použít při obsluhování požadavku. Jsou to:
  • Pluginy -** mohou se napojit na životní cyklus obsluhy požadavku** a mají přistup k objektům Zend_Controller_Re­quest a Zend_Controller_Res­ponse. Životním cyklem jsou myšleny následující „události“: začátek routování, konec routování, začátek dispatchování, začátek dispatchovací smyčky, konec dispatchovací smyčky, konec dispatchování. Na kteroukoliv z těchto události se můžete napojit, a například modifikovat požadavek (nastavovat do jeho kontextu třeba přihlášeného uživatele), pracovat s cache, logovat…atd. ZF obsahuje plugin ErrorHandler, který se stará o zachytávání vyjímek, které vzniknou během dispatchování.
  • Action Helpery – jsou podobné pluginům v tom smyslu, že též mají přístup k událostem – tentokráte jsou ale pouze tři – inicializace action controlleru, predispatch (před zavoláním metody v action controlleru) a postdispatch (po zavolání metody v action controlleru). K action helperům lze přistupovat buď staticky nebo přímo v action controlleru. ZF obsahuje několik implicitních action helperů. Zmíním např. ViewRenderer – postará se o automatické vytvoření Zend_View při inicializaci action controlleru a automatické vyrenderování přislušného view skriptu (jeho název je odvozen od názvu action controlleru a metody, která je právě obsluhována), Redirector – action helper umožňující přesměrování na jinou stránku (pomocí hlaviček v odpovědi), jiný action controlleru a metodu nebo přesměrování na jinou routu (tady bych pro více detailů odkázal na přednášku nebo online dokumentaci).
  • View Helpery – používají se ve view skriptech a slouží k usnadnění opakujících se akcí – renderování formulářových prvků atd. ZF opět obsahuje velké množství hotových helperů (v dokumentaci je popsán způsob jak si vytvořit helpery svoje vlastní).
Celý ZF je programován do interfaců a nejinak je tomu i v části Zend_Controller. Jakoukoliv část aplikace si lze naimplementovat a upravit tak defaultní chování. Velmi snadné je například výměna view vrstvy – z defaultních PHP skriptů např. na Smarty. To je záležitostí doslova několika řádků.

Zend_Db

Balíček Zend_Db považuji také za jádro ZF. Ukažte mi webovou aplikaci, která nepracuje s daty (přesněji s databázemi). Zend_Db nabízí abstrakci na přistupem k databází (podobně jako PDO).

Třída Zend_Db_Select umožňuje skládat SQL příkaz pomocí PHP api a generovat SQL příkaz podle dialektu nastavené databáze.

Na přednášce jsem zapomněl zmínit užitečnou třídu Zend_Db_Profiler. Jak už název vypovídá lze při jeho aktivaci přistupovat ke všem vykonaným SQL dotazům a jejich parametrům (např. rychlost vykonání) a odstranit tak případné úzké hrdlo práce s databázi.

To nejzajímavější nakonec – Zend_Db_Table – třída pracující s řádky tabulky jako se skutečnými objekty. Velmi zjednodušeně řečeno. Jedná se o implementaci návrhového vzoru Table Data Gateway (a Row Data Gateway u objektu Zend_Db_Table_Row). Bez nutnosti explicitního mapování lze přistupovat k sloupcům tabulky jako kdyby to byly public vlastnosti objektů. Třída umožňuje i namapování vztahů mezi objekty (tabulkami) – one to many, many to one, many to many. Pro více informací bych opět odkázal na přednášku (a příklad) nebo online dokumentaci.

Další důležité balíčky

Zend_Cache

Lze kešovat výstup, soubor, funkci, metodu, celou stránku. Propracované je zejména kešování celé stránky, kde lze nastavit, zda se do cache mají ukládat cookies, session parametry a jestli na nich cache závisí.

Jako backend (úložiště pro cache) je naimplementováno několik možností – Zend_Cache_Bac­kend_File, Zend_Cache_Bac­kend_Sqlite, Zend_Cache_Bac­kend_Memcached, Zend_Cache_Bac­kend_Apc, Zend_Cache_Bac­kend_ZendPlat­form.

Zend_Auth

Zend_Auth je balíček, který pracuje s autentizací uživatelů. Autentizace je proces ověřování, zda objekt (identity) je tím za koho se vydává (prokazuje pomoci credentials). Nejpoužívanějším adaptérem je Zend_Auth_Adap­ter_DbTable, který pracuje s databázovou tabulkou jako zdrojem dat o uživatelích. Další adaptéry – Zend_Auth_Adap­ter_Basic, Zend_Auth_Adap­ter_Digest.

Samotný proces autentizace se vykoná zavoláním Zend_Auth::ge­tInstance()->authenticate($a­dapter). Návratovou hodnotou je objekt Zend_Auth_Result, který obsahuje informaci o výsledku autentizace, samotnou identity (obvykle username) a případně chybové hlášky.

Po úspěšném přihlášení se údaje o uživateli ukládají do Zend_Auth_Storage (v defaultní implementaci do session).

Zend_Acl

Balíček pracující s autorizací. Autorizace je proces, při kterém zjišťujeme, zda daná role (např. přihlášený uživatele) má práva k přístupu k daném resource (např stránka nebo jiný objekt).

Konfigurace vypadá tak, že si vytvoříme všechny resource (chráněné objekty) a všechny roles (role) . Pomocí Zend_Acl pak nadefinujeme vazby – explicitně vyjmenuje jaká role má (nebo naopak nemá) přístup k jakým resourcům. Jak resource (Zend_Acl_Resource) tak role (Zend_Acl_Role) obsahují dědičnost – role dokonce vícenásobnou. Pro více informací opět dokumentace nebo přednáška.

Další balíčky

  • Zend_Search_Lucene – fulltextové vyhledávání
  • Zend_Validate, Zend_Filter, Zend_Filter_Input – třídy pro validaci a filtraci dat
  • Zend_Log – logování do souboru, databáze
  • Zend_Mail – posílání MIME zpráv včetně příloh (a správného kódování češtiny)
  • Zend_Pdf – vytváření PDF
  • Zend_Feed – RSS a Atom klient
  • Zend_Json – vytváření a čtení JSON
  • Zend_Session – wrapper nad $_SESSION
  • Lokalizace – Zend_Locale, Zend_Translate, Zend_Date, Zend_Calendar

Závěr

Zend Framewok je skvělý framework, který používá standardní názvosloví, abstrakci nad požadavkem a odpovědí, návrhové vzory, metodiku vývoje, na který můžete narazit nejen ve světě PHP, ale například i v javovských webových frameworcích (Spring Framework).

Jeho používáním se tak nenaučíte pouze framework samotný, ale budete mít ulehčenou práci při seznamování s frameworky novými – právě díky používání standardních přístupů a návrchových vzorů.

Na úplný závěr přehled dalších výhod ZF:
  • Bohatá dokumentace na stránkách projektu
  • Více než rok vývoje a velmi silná komunita
  • Napsán v PHP5, výborně testovatelný (distribuce ZF obsahuje přes 3600 testů)
  • Full stack framework – obsahuje řešení pro běžné aspekty vývoje webových aplikací
  • Není invazivní – lze používat i jednotlivé části frameworku.
  • Díky přístupu convention over configuration nutná velmi malá konfigurace
  • Za vývojem stojí firma Zend
  • Vývojová prostředí – Zend Studio, Zend Studio for Eclipse

Odkazy

6 Responses to “Zend Framework v kostce”

  1. Pavol Says:

    Odporucal bysom lepsiu kontrolu a uvadzianie skutocnych adries – na adresach http://jirava­.net/blog ani http://php.in­terval.cz/zend-framework nic nie je, malo by to byt http://jirava­.net/blog/ , respektive http://php.in­terval.cz/zend-framework/ !

  2. Vlasta Says:

    To je zvláštní – mně uvedené linky fungují.

  3. Vilém Málek Says:

    2 Vlasta: Ano, v případě Intervalu linky (odkazy) bez koncového lomítka skutečně fungují – tedy http://php.in­terval.cz/zend-framework i http://php.in­terval.cz/zend-framework/ vedou k cíli. To je ale dáno tím, že engine webu provádí analýzu příchozích požadavků a chybné žádosti o zobrazení dokumentu http://php.in­terval.cz/zend-framework přesměrovává na správné http://php.in­terval.cz/zend-framework/ – ono totiž URL bez lomítka a s lomítkem není totéž…

    Předpokládám, že podobné opatření pro zvýšení blbuvzdornosti svého webu má i pan Jirava na svém blogu ;–)

  4. Vlasta Says:

    [3] Uvedený mechanizmus je mi dobře znám – funguje tak na 99% webů. Možná je to moje lenost nebo fakt, že nevím která z uvedených variant adres je ta správná – zda s lomítkem na konci nebo bez něj. :)

  5. Zend Framework 00: Proč? | Hujer.org Says:

    […] Zend Framework v kostce (Vlasta Vávrů) […]

  6. Zend Framework Blog » Archiv » ZFTut00: Proč si vybrat Zend Framework Says:

    […] Zend Framework v kostce (Vlasta Vávrů) […]

Leave a Reply

grupa LGBT