Vývoj webových aplikací pomocí PHP frameworků IV

June 18, 2009 // Zařazeno do Seriál vývoj webových aplikací pomocí php frameworků  

Dnes základní text bakalářky z teoretického hlediska – popis Zend Frameworku. Lehký nástin jednotlivých komponent.

Základní koncept Zend Frameworku

Zend Framework je jednoduchý PHP framework určený k tomu, aby pomohl odstranit nudné programování a naopak pomohl zaměřit se na řešení konkrétních problémů. Jeho síla je ve vysoce modulárním MVC designu, díky kterému je naprogramovaný kód opakovaně použitelný a rychle vyvíjený. Využívá komponentový a kompletně objektový přístup. Tento framework obsahuje předpřipravené řešení pro obrovské množství problémů, na které může programátor narazit. Díky komponentovému přístupu je však možno tuto funkcionalitu extrahovat a používat zvlášť. Díky relativně malé provázanosti jednotlivých komponent je také rychlejší pochopení a učení práce s frameworkem. Za celým projektem stojí firma Zend Technologies Ltd, která stojí i za samotným PHP. [18]

Filozofie existence

• Poskytnout zdroj vysoce kvalitních komponent, napsaných kompletně v PHP verze 5
a vyhovující E_STRICT. Každá chyba je tedy výsledkem kódu aplikace a ne frameworku.

• Poskytnout kompletní systém pro vývoj webových aplikací. Není tedy nutné používat jiné knihovny, přestože je to umožněno.

• Jednoduše, jak jen to je možné. Neměnit PHP, které je postaveno na jednoduchém
a elegantním řešení. V této zásadě pokračovat.

• Podporováno firmou Zend, je tudíž menší šance že framework se přestane vyvíjet. Firma také dodá kapacity na tvorbu dokumentace, která je často problémem.

Popis komponent

V následujícím textu jsou uvedeny komponenty, které byly použity při vývoji aplikace. Důraz je kladen na tři hlavní komponenty MVC, tedy Zend_Db, Zend_View
a Zend_Controller.

Zend_Acl
Komponenta pro práci a autorizací. Umožňuje nastavit uživatelská práva a dále spravovat přístup uživatelů k zadaným sekcím. Uživatelská práva lze dědit a vytvořit tak hierarchickou strukturu uživatelů.
Název Acl je odvozen od spojení Access Control List (seznam kontrolovaných přístupů). Pro práci s touto knihovnou je třeba rozlišovat dva pojmy, role a zdroj. Zdroj je chráněný objekt, jehož přístup je kontrolován. Role je poté objekt, který žádá
o přístup ke zdroji. Zend_Acl pak spravuje právě tyto dva objekty, neboli způsob přidělování rolí ke zdrojům. [25][20]

Zend_Auth
Při práci s uživateli je třeba je jednoznačně identifikovat. O tuto problematiku se stará právě tato komponenta, využívající Zend_Session ve výchozím nastavení.
Zend_Auth se zabývá pouze autentizací, nikoli autorizací. Autentizace je identifikační kontrola subjektu. Autorizace je proces rozhodování o tom, zda umožnit přístup k subjektu, čímž se zabývá knihovna Zend_Acl.[25][20]

Zend_Cache
Ukládání výsledků jednotlivých operací je nutnou podmínkou pro rychlý chod aplikací. Ukládat lze výstup funkcí, tříd, či souborů. Lze definovat i místo uložení. Označení jednotlivých výsledků umožňuje pokročilou správu dat. [25][20]

Zend_Config
Konfigurační nastavení je možno ukládat v konstantách a dále s nimi takto v aplikaci pracovat. Tato komponenta umožňuje nyní toto nastavení uložit v externím souboru ve formátu XML či INI a jednotlivé prvky uspořádat hierarchicky. [25][20]

Zend_Controller
Zend Framework využívá návrhového vzoru Front controller [19]. Myšleno tím je to, že všechny požadavky obsluhuje jediný soubor, který se stará o další zpracování.
Zend_Controller odesílá požadavek na konkrétní action příslušného controlleru. Pro usnadění programování lze zaregistrovat pluginy, a to ve všech krocích zpracování. Plugin je funkce, která je spouštěna dle zadaných kritérií, upravující výchozí chování. Odeslání požadavku na konkrétní action se odehrává ve dvou fázích. V první router na  základě adresy urči, který modul, controller a action se má s jakými parametry spustit
a tuto informaci předá dispatcheru. Ve druhé přichází na řadu zmíněný dispatcher, který již požadavek odesílá na vybraný controller a action, tak jak je zobrazeno na obrázku Obr. 2. Proces výběru je velmi důležitý, protože transformuje URL, úpravou tohoto procesu lze měnit výchozí chování. To počítá s adresou ve tvaru server.com/{modul}/{controller}/{action}/{další parametry} (modul je volitelný), změnou chování routeru můžeme definovat, dnes používané a oblíbené, SEO  adresy.
Obrázek č. 2 – Zpracování požadavku prohlížeče

Zdroj: ALLEN, Rob, LO, Nick, BROWN, Steven: Zend Framework in Action. Greenwich: Manning Publications, 2008. ISBN 978-1933988320.

Zmíněné pluginy lze zaregistrovat v šesti fázích procesu zpracování (každý plugin bude volán dle použité funkce).

Pojmenování jednotlivých funkcí v pluginech může být následující:

• routeStartup() je volána před začátkem procesu směrování (routing).

• dispatchLoopStartup() je volána předtím, než začne probíhat proces odesílání (dispatch).

• preDispatch() je volán před každou action.

• postDispatch() je volána po skončení action.

• dispatchLoopShutdown() je volána po skončení všech action.

• routeShutdown() je volán po skončení procesu směrování.

Nyní je tedy zřejmé, že pomocí pluginů lze libovolně měnit chování aplikace
e všech krocích zpracovávání úživatelského požadavku. O samotné spouštění se stará framework, stačí tedy plugin zaregistrovat a následně pojmenovat. Pojmenování následně určí okamžik, kdy bude plugin spuštěn. Proces zpracovávání je zobrazen na obrázku Obr. 3.

Obrázek č. 3 – Zpracování požadavku prohlížeče dle probíhajících procesů

Zdroj: ALLEN, Rob, LO, Nick, BROWN, Steven: Zend Framework in Action. Greenwich: Manning Publications, 2008. ISBN 978-1933988320.

K přidávání funkcionality lze naprogramovat vlastní helpery, které lze volat kdekoliv v controlleru. Framework obsahuje některé předdefinované helpery. [25][20]

Zend_Date
Tato komponenta nabízí detailní a jednoduché API  pro práci s časem. [25][20]

Zend_Db
Jednou z nejrozsáhlejších komponent v Zend Frameworku je právě Zend_Db. Umožňuje pracovat se všemi databázemi prostřednictvím jednoho rozhraní. Zend_Db obsahuje množství adaptérů na různé databáze. Knihovna Zend_Db obsahuje také parser, který přizpůsobí SQL dotaz pro konkrétní databázi, navíc obsahuje profiler, takže můžete snadno zjišťovat, kolik času zabralo spojení s databází či konkrétní dotazy. [20] Aplikací návrhových vzorů Table Data Gateway [21] a Row Data Gateway [22] vznikají třídy Zend_Db_Table a Zend_Db_Table_Row. Práci rovněž ulehčuje třída Zend_Db_Select, která vytváří objektové rozhraní pro databázové dotazy.
Vhodné je také přidat další logiku do vlastních funkcí, které mohou vracet již naformátované výsledky. Využijeme toho například v modulu Shop, kdy je třeba kompetní informace o konkrétním produktu poskládat z několika tabulek. Vytvořením vlastní funkce getProduct, umístíme tuto funkčnost přímo ke zdroji dat.
Zend_Db podporuje množství adaptérů, které můžeme vybrat pro komunikaci
s databází. Každý adaptér je založen na nějakém PHP rozšíření a výběr je tedy závislý na parametrech hostingu. [25][20]

Podporované databáze

• IBM DB2 a IDS (pdo_ibm PHP rozšíření)
• MySQL (pdo_mysql PHP rozšíření)
• MS SQL (pdo_mssql PHP rozšíření)
• Oracle (pdo_oci PHP rpzšíření)
• Postrge SQL (pdo_pgsql PHP rozšíření)
• SQLite (pdo_sqlite PHP rozšíření)
• MySQL (mysqli PHP rozšíření)
• Oracle (oci8 PHP rozšíření)
• IBM DB2 (ibm_db2 PHP rozšíření)
• Firebird/Interbase (php_interbase PHP rozšíření)
• Firebird/Interbase, using the php_interbase PHP extension

Zend_Form
Cílem této komponenty je zjednodušení práce s formuláři. V aplikaci lze nadefinovat jednotlivé prvky, jejich validátory, filtry a způsob zobrazení. Ve view pak již stačí formulář pouze zobrazit. Použití zmíněných validátorů při tvorbě formuláře následně velmi usnadní prácí s validací po odeslání. Použitím jediné funkce isValid() lze zkontrolovat celý formulář.[25][20]

Zend_Layout
Umožňuje skládání stránek ve vybraném layoutu (šabloně). Je aplikací dvoukrokového zpracování HTML [23]. Hlavní cíle této komponenty jsou následující:
• automatizovat výběr a zobrazování layoutu, pokud je použit návrhový vzor MVC
• poskytovat samostatný prostor pro proměnné související s daným obsahem
• umožnit kompletní konfiguraci layoutů
• umožnit vypnutí, či změnu layoutu odkudkoliv (controller či view)
• dodržovat stejná pravidla chování jako ViewRenderer, ale umožnit je změnit
• umožnit použití jako samostatné komponenty

Přestože je možno tuto komponentu používat jako součástí MVC frameworku či samostatně, chování a používání je velmi podobné. U obou variant je nutno vytvořit soubor obsahující základní layout a v něm zobrazovat proměnné. Způsob naplnění je pak zcela na volbě programátora. [25][20]

Zend_Loader
Základní komponenta pro nahrávání potřebných souborů a tříd. Využívá jmenných konvencí frameworku a překládá názvy tříd do skutečných adresářových adres. Je možno využít PHP funkce pro automatické nahrávání tříd. [25][20]

Zend_Locale
Tato komponenta zajišťuje zobrazování obsahu ve správném jazyce. Nejde však jen o pouhý překlad, ale přímo o lokalizaci, protože např. Stejné číslo může být v jiných zemích jinak zobrazováno (desetinná čárka, tečka). Tato komponenta spolupracuje
s mnoha dalšími a zajišťuje nezbytnou podporu pro lokalizační komponenty celého frameworku, jako jsou:
• Zend_Translate, překlad textu
• Zend_Date, lokalizace data a času
• Zend_Calendar, lokalice kalendářních dat
• Zend_Currency, lokalizace měn
• Zend_Locale_Format, zpracování a generování lokalizovaných čísel
• Zend_Locale_Data, práce s daty z CLDR (http://cldr.unicode.org/)

Pracuje s mezinárodně uznávaným standardem pro rozeznávání regionů
a jazyků, jehož seznam je na [24], seznam aktuálně podporovaných identifikací je uveden v manuálu frameworku. [25][20]

Zend_Registry
Tato třída slouží k uchovávání globálních dat napříč celou aplikací. [25][20]

Zend_Session
Obsahuje mechanizmy pro práci se sessions. Komponentu používá například Zend_Auth jako svůj výchozí adaptér. [25][20]

Zend_Translate
Komponenta potřebná pro vícejazyčné aplikace. Aktuálně podporuje devět adaptérů pro vstup dat jako je Gettext, Csv či běžné PHP pole. Komponenta poskytuje vlastní třídu umožňující snadno vytvořit libovolný jiný adaptér.[25][20]

Zend_Validate
Komponenta pro validaci dat. Aktuálně obsahuje následující třídy pro kontrolu dat:
• Alnum – pouze abeceda a čísla (mezera volitelně)
• Alpha – pouze abeceda
• Barcode – čárový kód (aktuálně EAN-13 a UPC-A)
• Between – porovnává velikost čísla vzhledem k daným mezím. Je možno nastavit i jen jednu.
• Ccnum – kontrola platnosti kreditních karet
• Date – ve výchozím nastavení porovnává s tvarem YYYY-MM-DD
• Digits – kontrola pouze čísel
• EmailAddress – kontrola platnosti emailové adresy. Je možno zapnout i kontrolu, jestli emailová adresa přijímá emaily, či kontrolu IDN  domén.
• Float – kontrola čísla s desetinnou čárkou
• GreaterThan – porovnává s předem nastavenou hodnotou (větší než)
• Hex – kontrola hexadecimálního čísla
• Hostname – ve výchozím nastavení kontrola DNS adresy, je možno zapnout i kontrolu IP adresu
• InArray – kontroluje zda se zadaný řetězec vyskytuje jako součást jiného
• Int – kontrola celého čísla
• Ip – kontrola platnosti IP adresy
• LessThan – porovnává s předem zadanou hodnotou (menší než)
• NotEmpty – kontrola, jestli hodnota obsahuje nějaká data
• Regex – porovnávání s regulárním výrazem
• StringLength – kontrola délky řetězce, pracuje i s kodováním UTF-8

S touto komponentou se nejčastěji setkáme společně s Zend_Form, kdy je možno validátory přidat přímo k formuláři při jeho tvorbě. Kontrola následně probíhá pomocí funkce isValid(). [25][20]
 Zend_View
Základní komponenta pro správu view (pohledů). Kooperativně Zend_View může pracovat s komponentou Zend_Layout, která umožňuje spojování jednotlivých view v layoutech (šablonách). Framework lze samozřejmě používat se sofistikovanými produkty jako je například Smarty, zde budeme však používat řešení nabízené přímo tímto frameworkem. U větších projektů se aplikace neobejde bez oddělení aplikační a prezentační logiky, vcelku však nezáleží jakou z variant programátor zvolí. Zend Framework nabízí tuto možnost a pro svou jednoduchost je v této aplikaci použita. Jednotlivé view jsou vytvořeny pomocí PHP, takže oproti Smarty není třeba znát další speciální tagy.  Jednotlivé proměnné se do view přiřazují v příslušném controlleru.
K přidávání funcionality lze naprogramovat vlastní helpery, které můžeme volat kdekoliv ve view. Framework obsahuje některé předdefinované helpery. [25][20]

Všechny komponenty frameworku lze rozdělit do šesti kategorií:
MVC
• Zend_Controller, Zend_Db, Zend_Layout, Zend_View

Autorizace, autentizace
• Zend_Acl, Zend_Auth, Zend_Session

Webové služby
• Zend_Feed, Zend_GData, Zend_OpenId, Zend_InfoCard
• Zend_Service_* (skupina tříd pro podporu externích služeb)

Internacionalizace (I18N) a lokalizace (L10N)
•Zend_Currency, Zend_Date, Zend_Locale, Zend_View, Zend_Translate

Meziaplikační komunikace
• Zend_Http_Client, Zend_Json, Zend_Ldap, Zend_Rest, Zend_TimeSync, Zend_XmlRpc

Jádro
• Zend_Cache, Zend_Config, Zend_Filter, Zend_Form, Zend_Log, Zend_Mail, Zend_Memory, Zend_Pdf, Zend_Registry, Zend_Search, Zend_Uri, Zend_Validate

Každá komponenta obsahuje množství tříd, včetně hlavní třídy, podle které je pojmenována a uvedena v seznamu. Například Zend_Config obsahuje Zend_Config_Ini a Zend_Config_Xml třídy.

Komentáře jsou uzavřeny.