Zend framework: základné súbory a komponenty

Zaujíma vás, na čo slúži a index.php a Bootstrap.php? Chcete vedieť, čo je modul? Ako vám zjednoduší orientáciu vo vašej aplikácii? Aké sú základne komponenty Zend frameworku? Všetko toto sa dozviete v treťom dieli nášho seriálu.
Seriál: Začínáme se Zend Framework (3 díly)
- Zend Framework: Úvod do frameworku 6. 8. 2012
- Zend Framework: Hello world 20. 8. 2012
- Zend framework: základné súbory a komponenty 3. 9. 2012
Nálepky:
index.php
Súbor index.php by mal byť jediným spustiteľným súborom vo vašom projekte. Nachádza sa v adresári public/. Front controller zabezpečuje, že všetky požiadavky na webový server budú spracované pomocou tohto súboru. Index.php tiež zabezpečuje jeho konfiguráciu, ale tak isto aj konfiguráciu PHP prostredia.
// Define path to application directory define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); // Define application environment define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ?getenv('APPLICATION_ENV') : 'production')); /** Zend_Application */ require_once'Zend/Application.php'; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run();
Výpis: Vzorový súbor index.php
Riadok APPLICATION_PATH nastaví konštantu s cestou k aplikácii a APPLICATION_ENV nastaví konštantu názov serveru. Nakoniec je načítaný súbor s komponentom Zend_Application, je vytvorená inštancia triedy a sú zavolané metódy bootstrap() a run(). Starajú sa o zavedenie aplikácie a odštartovanie front controlleru. Konštruktoru triedy sú poslane cesta ku konfiguračnému súboru a definované PHP prostredie.
Bootstrap.php
Od verzie 1.8 a s príchodom Zend_Application sa spôsob konfigurácie zjednodušil a štandardizoval. Bootstrap.php slúži na konfiguráciu Zend Frameworku. Nájdete ho v adresári application/
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { }
Výpis: Vzorový súbor Bootstrap.php
Celá konfigurácia sa presunula do konfiguračného súboru application.ini v adresári application/config.
[production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 [staging:production] [testing:production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development:production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
Výpis: Vzorový súbor application.ini
Zend_application zabezpečuje flexibilný spôsob zavádzania. V súbore application/Bootstrap.php môžete vytvoriť triedu, ktorá bude obsahovať inicializačné metódy. V praxi sa najčastejšie používa kombinácia inicializácia aj pomocou index.php aj pomocou Bootstrap.php.
Čo všetko je možné nastaviť v application.ini, index.php a Bootstrap.php sa postupne dozviete v ďalších častiach seriálu.
Zend_Application
Komponenta Zend_Application štandardizuje proces zavádzania aplikácie pre znovu použiteľné zdroje, ako sú modulovo závisle Bootstrap triedy, a kontroluje ich závislosť alebo databázové adaptéry. Taktiež zabezpečuje nastavenie PHP prostredia a automatické nahrávanie tried.
Zend_Registry
Často v aplikácii existujú objekty, ku ktorým potrebujete pristupovať. Môže to byť objekt s nejakými údajmi, ku ktorým chcete pristupovať v radiči, pohľade ale aj v modele. Taktiež to môžu byť objekty obsahujúce preklad textu. Často sa tento problém rieši tým, že sú tieto objekty uložené do globálnych premenných. V Zend frameworku je toto možne riešiť pomocou komponenty Zend_Registry.
Poskytuje vám registráciu objektu a k objektom, ktoré ste si uložili, môžete pristupovať z ľubovoľnej časti svojej aplikácie po celý čas jej behu.
$objekt = “text, string alebo pole”; Zend_Registry::set(‘premena’,$objekt); $hodnota = Zend_Registry::get (‘premena’); echo $hodnota;
V prípade potreby je možní register vyčistiť. Dochádza k odstráneniu objektov, preto treba túto metódu použivať opatrne:
Zend_Registry::_unsetInstance();
Zend_Log
Komponent Zend_Log slúži k zaznamenávaniu udalosti. Poskytuje možnosť zaznamenávanie do súboru, do databázy, ale aj posielanie emailov. Udalosti, ktoré chcete zaznamenať, majú 8 typov priorít.
úrovne logovania | popis |
DEBUG | Hlásenia o ladení |
INFO | Infromativné hlásenie |
NOTICE | Hlásenie |
WARNING | Upozornenie |
ERR | Chybové hlásenia |
CRIT | Kritické chybové hlasenia |
ALERT | Upozorňovacie hlásenie |
EMERG | Núdzové chybové hlasenie |
Tabulka1: Podporované úrovne logovania v Zend_Log
Zapisovač | Popis |
Zend_Log_Writer_Stream | Zapíše záznam do súboru, URLs … |
Zend_Log_Writer_Db | Zapíše záznam do databazy |
Zend_Log_Writer_Firebug | Zapíše záznam do Firebug konzoly |
Zend_Log_Writer_Mail | Zapíše záznam do emailu |
Zend_Log_Writer_Mock | Výsledok záznamu pošle sám seba aby sa dal použiť na testovacie účely |
Zend_Log_Writer_Null | Zapíše záznam do /dev/null |
Zend_Log_Writer_Syslog | Zapíše záznam do systemového logu (syslogd na UNIX a event viewer na Windows) |
Tabulka2: Možnosti zapisovania záznamu v Zend_Logu
Najpoužívanejšia možnosť je použitie jednoduchých logovacích súborov.
$logger = new Zend_Log(); $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/../data/logs/example.log'); $logger->addWriter($writer); $format = '%timestamp%: %priorityName%: %message%' . PHP_EOL; $formatter = new Zend_Log_Formatter_Simple($format); $writer->setFormatter($formatter); $logger->log('Upozornenie', Zend_Log::ALERT);
Na začiatku je inicializovaný Zend_Log objekt. Po inicializácii nasleduje pridanie zapisovača, ktorý má v tomto príklade zapisovať do súboru (ostatné zapisovače vid tabuľka 2). Je možné vybrať aj viacej zapisovačov a zapisovať do databázy a súboru súčasne.
Moduly
Stránka, ktorú vytvárate, sa môže skladať z viacerých celkov, napríklad fórum, blog, e-shop. Pre každú túto časť stránky potrebujete vlastné radiče, modely, pohľady, ale aj konfiguračné súbory. Môžete použiť aj základnú adresárovú štruktúru, ale veľmi rýchlo by ste sa v súboroch mohli stratiť. Aby ste si v súboroch zachovali väčší prehľad, Zend Framework vám poskytuje možnosť vytvoriť si moduly. Toto je nejaká skupina radičov, modelov a pohľadov, ktoré spolu súvisia. Pre každý modul si v adresári application/modules vytvoríte svoj adresár (štandardne v application sa modules nenachádza, treba vytvoriť aj ten). Do tohto adresára vytvoríte štruktúru známu z adresára application.
V ďalšej časti seriálu si budete môcť prečítať o Radiči a o komponentoch, ktoré slúžia na prácu s ním.
Proč má unsetInstance podtržítko? Nemají mít podtržítko jen privátní a protected metody?
Ano, takový je CS, ale z neznámého důvodu tam podtržítko skutečně je. Původním smyslem bylo asi naznačit, že je to metoda, která by se „neměla používat“. Používá se prakticky pouze pro unit testy, aby se zrezetovala statická proměnná v Zend_Registry.
Ano, autor článku si skutečně dal práci a našel jednu z mála metod v Zend Frameworku, která má podtržítko (tedy je podle konvencí private), ale ve skutečnosti je public. Je to z toho důvodu, že se volá v testech. V aplikaci byste ji opravdu volat neměli a pokud vím, tak jsem jí za 5 let používání ZF nepotřeboval ani jednou…
Do článku by som pridal upozornenie, že používanie Zend_Registry je bad OOP practice.
Navíc to má znamenitou, funkčně zcela ekvivalentní, alternativu přímo v PHP. Jmenuje se $_GLOBAL.
No predovsetky je to $GLOBALS
a naviac pouzitie tohto sposobu je urcite x-krat rychlejsie ako cez Registry…
Díky za tuto sérii článků. Alespoň mám možnost porovnat, jak je Zend oproti Nette hrozný :-)
V prvom rade sa jedna o ZF1. Myslim, ze keby si porovnal voci ZF2 tak by si nieco take netvrdil.
To je pravda, 2ka totiz kopci od sf2 :-)
Začínám mít pocit, že Peter Grezo je pseudonym Davida Grudla, protože aby někdo psal a záměrně vytahoval ty nejhorší věci z celého frameworku, to snad ani možné.
Vážně? Ovšem David neumí slovensky, což je snad dostatečný důkaz, že to nepíše on. A navíc sehnat toho překladatele do slovenčiny dalo pěknou fušku 8-)
You don’t know the power of the dark side! ;)
Nedalo mi to a sepsal jsem doplňující blogpost obsahující některé věci, které jsem považoval za důležité a které podle mého názoru v článku chyběly nebo naopak neměli co dělat.
http://blog.tomasfejfar.cz/?p=120
Já především nechápu, proč píšete o jedničce, když vychází dvojka. Autor se rozhodl sepsat svoje paměti?
Už jsme to tu probírali pod předchozími díly. Stručně. Dvojka se na poslední chvíli ještě dost měnila a rádi o ní pak navážeme třeba dalším seriálem, pokud se najde schopný autor. A jednička tu rozhodně nějaký čas bude, viz všechny ty weby, co ji používají.
Hlavně nechápu, proč vlastně zdroják píše o PHP. Už více jak deset let je jasné, že to je hrozný a zastaralý jazyk, který nahradí novější, výkonější a elegantnější technologie.
Tak to víme všichni, že je to mrtvá technologie 8-) Ale občas nějaký článek na to téma vydáme, aby čtenáři nebyli moc smutní.
A na co se teda zaměřit, když ne PHP – Ruby, Python nebo jen HTML5?
Mohli bychom to rozšířit i dál. Třeba o Javu a .NET. Začal bych zvažováním, co vlastně chcete. Zkoumáním, v čem jsou napsané projekty, které vás něčím inspirují. Jaký jazyk (a hlavně ekosystém okolo něj) vám nejvíc sedne? Třeba se tak cesta pak ukáže sama.
Jako PHPčkař jsem si střihl webovou aplikaci v kombinaci Spring (MVC, data)+JSP a nenabyl jsem pocit, že jsou až o tolik dále.
Ano, Java je vyzrálejší jazyk než zpatlané PHP. Má lepší podporu v IDE. Ale hromada věcí se mi daleko snáze dělala ve starém ZendF nebo Nette2.
sice s tím plně souhlasím, ale je zvláštní, že za těch 10 let se žádná taková technologie ještě nenašla :-) holt budu čekat dál a zatím bastlit v PHP :-)
Takže Zendu se jen tak nezbavíme? To jsou teda vyhlídky…
Myslim ze michate dva pojmy. Jazyk a technologie.
Pokud se nekdo rozhodne ze v PHP bude delat frameworky, tak jsou urcite lepsi napady. I kdyz dnes, treba frameworky v javascriptu :-)
Nicmene pokud pouzijete PHP jako zobrazovaci (sablonovaci) vrstvu, tak to funguje.
Mne se na PHP libi, jak se jednoduse pracuje s asociativnimi poli. To algoritmy elegantne zkrati.
Jinak ja jeste pamatuju PHP3 ktery se narodil nekdy na konci roku 98. A rozhodne si nemyslim, ze vice nez 10 let (tj. pred rokem 2002, a pokud vice chapu jako vyznamne vice tak pred rokem 1997) si nekdo myslel, ze je PHP hrozny a zastaraly jazyk. Spis bych rekl, ze do verze 3 (1998) o nem nikdo moc nevedel.
1998 – to plně souhlasí, Jirkova slavná knížka o PHP, která to změnila, totiž vyšla v roce 1999. 8-)
Jo z ty jsem se to naucil :-)
…Mne se na PHP libi, jak se jednoduse pracuje s asociativnimi pol…
V porovnání s čím?
Keď poznáte novšie a lepšie technológie ako PHP, tak by ste mohli napísať o tom článok alebo aspoň odkázať. Navyše nemôžem súhlasiť. Z praktického hľadiska je PHP veľmi podarený jazyk, a vývoj nezastal.
Jirka přece už roky programuje weby v XSLT 8-))
„Keď poznáte novšie a lepšie technológie ako PHP, tak by ste mohli napísať o tom článok alebo aspoň odkázať.“
myslis nove a lepsie technologie na vyrobu webov spokojne fungujucich na zdielanom hostingu dynamicky generujucich stranky z db? nie niesu, PHP je skutocne najlepsie. ale na vsetko ostatne existuje kvantum lepsich technologii.