Mirin webspace

Nejbohatší život má ten, kdo žije s minimem nároků

18. 7. 2009 - Komentáře (2) Zend Framework PHP

Tipy pro přechod na Zend_Application

Tak jsem konečně snad dorefaktoroval všechny knihovní třídy a třídy pro modely do namespaces, jak jsem psal posledně. Jak jsem uvedl v článku o autoloadingu, tuhle změnu je dobré nějak výhledově naplánovat, pokud uvažujete o přechodu na Zend Framework 1.8 a novější. Já jsem tam měl ani něco okolo 10 knihovních a 20 tříd pro modely a předělat to bylo pěkně otravná a zdlouhavá práce. Když to jen tak přejmenujete tak se stejně najdou místa, kdo jste to opoměli. Někdo, kdo má rozsáhlý web může mít klidně okolo stovky model tříd a to už je pak skoro nereálné to předělat a pokud tam někdo má ještě 100-ky unit testů…

Něco málo poznámek k tomu, na co by jste si měli dávat pozor, pokud hodláte přejít na Zend_Application. Prvně si samozřejmě prostuduje příslušné kapitoly v manuálu, dál z toho budu vycházet.

Dohledávání options pro resources

Jaké jsou vlastně možné parametry v konfiguraci pro daný resource? V dokumentaci toho bohužel moc není, nejlepší je se podívat do zdrojových kódů resources a hledat tam něco okolo volání getOptions.

Ini není bez vady

Ačkoli se zdá, že mít konfiguraci aplikace dle quickstartu v ini souboru je pohoda, opak je pravdou. Php ini parser není až tak dokonalý, jak by se zdálo, někde vynecháte ukončovací uvozovky a už se vám všechno sesype. V dlouhém ini souboru se to pak špatně hledá. Mít konfiguraci v php je sice trochu více psaní, ale syntaxi vám kontroluje IDE, máte zadarmo bytecode cachování a parser samotného php je lepší než ten pro ini soubory. Nicméně já jsem to nechal v ini.

Velikosti písmem v konfiguraci

Dejte si pozor na velikost písmen, narazil jsem na to, že nezáleží na tom, jaká je velikost, ale hlavně musí být pořád stejná. Tohle jsem měl na začátku production sekce a pořád jsem se divil, proč se mi i na produkčním ty errory vypisují do stránky.

phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
; tohle je řádka, která má jinou velikost písmen v 'phpsettings', po
; opravě na 'phpSettings' bylo vše v pořádku
phpsettings.date.timezone = Europe/Prague

V tomhle případě se uplatnila pouze poslední řádka s časovou zónou, takže pozor na velikosti písmen.

Modulární aplikace

S moduly a Zend_Application je trochu problémů, ne že by snad nebyly moduly podporovány, to by si vývojáři frameworku nemohli dovolit, ale dokumentace v téhle oblasti není zrovna vzorná a implementace má taky trochu mouchy.

Inicializace modulární aplikace probíhá takto

  1. Hlavní bootstrap celé aplikace spustí inicializaci Modules resource pluginu (třída Zend_Application_Resource_Modules) až na jeho inicializaci narazí v konfiguraci.
  2. Tento resource modul postupně zavolá bootstrapy všech vašich modulů. Bootstrapy modulů jsou odvozeny od tříd Zend_Application_Module_Bootstrap, nikoli jako hlavní aplikační bootstrap od Zend_Application_Bootstrap_Bootstrap.
  3. Sekce které patří modulu, se v konfiguraci prefixují jménem modulu, tyto jsou v této fázi uplatněny bootstrapem u příslušných resource modulů. Např. se tedy doplní routy pro daný modul, doplní se konfigurace view nebo controllerů pokud to modul potřebuje atd.
  4. Až tohle skončí, vrátí se běh zpět do hlavního bootstrapu aplikace a ten dokončí inicializaci podle konfigurace.

Důležitý je první bod, řádek, který spouští tu modulovou bootstrap mašinérii je

resources.modules[] =

Před ním je vhodné mít nainicializovaný adresář pro moduly ve front controlleru, takže lépe asi nějak takto.

resources.frontController.moduledirectory = APPLICATION_PATH "/modules"

resources.modules[] =

Je tedy nutné si uvědomit skutečnost, že před spuštěním celé aplikace probíhá inicializace všech modulů. Není to tak, že by se nějak chytře poznalo co je potřeba a pak se provedla inicializace jen těchto potřebných modulů, tak to nefunguje.

Jeden velmi pěkný článek s ještě hezčím diagramem volání při inicializaci modulární aplikace je na mzBlogu.

Warningy kvůli autoloadingu

Problém je v tom, že pokud máte váš globální autoloader inicializován v hlavním bootstrapu a máte ho jako fallback se zapnutými warningy - viz minulý článek, tak se vám budou vypisovat podivné warningy o nenalezení tříd pro resources. Je to z důvodu bugů ve třídách frameworku. Je tam totiž použita php funkce class_exists() bez nastaveného druhého parametru na false. V tom případě se použije aktuální class loader. Dokud to vývojáři frameworku neopraví (a asi to hned tak nebude), musíte ty warningy ignorovat, na produkčním se neobjeví. Pokud se zbavíte fallback autoloadingu tak se jich zbavíte nadobro.

Doporučené nastavení front controlleru

Je doporučené nastavit front controller na vyhazování výjimek v development prostředí, jinak se nedozvíte co se děje. Takže asi takto

[production]
...
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.moduledirectory = APPLICATION_PATH "/modules"
resources.frontController.actionhelperpaths.Controller_Helper = APPLICATION_PATH "/controllers/helpers"
resources.frontController.plugins[] = My_Plugin_Main
resources.frontController.throwexceptions = false
...

[development : production]
...
resources.frontController.throwexceptions = true
...

Verze 1.9 je za dveřmi, tam snad půjde o drobnější vylepšení a menší změny než tomu bylo u 1.8.


Komentáře (2)

  1. snop - 19. 7. 2009 13:04

    Ahoj,

    a ja ze proc mi stale nefunguje:

    phpsettings.error_reporting = E_ALL & ~E_NOTICE
    uz to funguje :)

    Diky

  2. AdamMichnik - 10. 1. 2010 11:46

    Pěkný článek a i celkově máte hodně zajímavé stránky. Jen tak dál. Dobře se to čte a je to inteligentní - to se často na internetu nevidí.

Komentáře jsou uzavřeny.