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í:- 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_Request a Zend_Controller_Response jsou vytvořeny
- 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_Request. 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.
- Nyní vykoná svoji práci Zend_Controller_Dispatcher, 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.
- 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.
- Dojde k vyrenderování view a jeho nastavení do objektu Zend_Controller_Response. Nastaví se též případné hlavičky. Odpověď je odeslána klientovi.
- Pluginy -** mohou se napojit na životní cyklus obsluhy požadavku** a mají přistup k objektům Zend_Controller_Request a Zend_Controller_Response. Ž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í).
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_Backend_File, Zend_Cache_Backend_Sqlite, Zend_Cache_Backend_Memcached, Zend_Cache_Backend_Apc, Zend_Cache_Backend_ZendPlatform.
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_Adapter_DbTable, který pracuje s databázovou tabulkou jako zdrojem dat o uživatelích. Další adaptéry – Zend_Auth_Adapter_Basic, Zend_Auth_Adapter_Digest.
Samotný proces autentizace se vykoná zavoláním Zend_Auth::getInstance()->authenticate($adapter). 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
Odporucal bysom lepsiu kontrolu a uvadzianie skutocnych adries – na adresach http://jirava.net/blog ani http://php.interval.cz/zend-framework nic nie je, malo by to byt http://jirava.net/blog/ , respektive http://php.interval.cz/zend-framework/ !
To je zvláštní – mně uvedené linky fungují.
2 Vlasta: Ano, v případě Intervalu linky (odkazy) bez koncového lomítka skutečně fungují – tedy http://php.interval.cz/zend-framework i http://php.interval.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.interval.cz/zend-framework přesměrovává na správné http://php.interval.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 ;–)
[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. :)
[…] Zend Framework v kostce (Vlasta Vávrů) […]
[…] Zend Framework v kostce (Vlasta Vávrů) […]