Mirin webspace

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

26. 8. 2009 Zend Framework PHP

Nevhodný action view helper, přechod na php 5.3

Prováděl jsem teď trochu úprav a refaktoringu a narazil jsem na jednu věc. Je jím Action View Helper. Použití tohoto helperu se zdá jako velká výhoda ve znovupoužitelnosti kódu. Bohužel je to matoucí. Znovupoužitelnost sice získáte ale zejména na úkor výkonnosti. V tom nepoužívat dále tento helper mě utvrdil článek Ryana Maugera, tohle je tak trochu jeho volný překlad.

Použil jsem ten helper, když jsem dělal ajaxové zobrazení kalendáře a seznamu měsíců v pravém sloupci, říkal jsem si, že to snad ani jinak nejde. Opak je pravdou, nedávno jsem to poměrně srozumitelně předělal na klasické view helpery a opravdu je to o i vizuálně o dost rychlejší. S action view helperem je to totiž tak, že se vytváří další interní požadavek, který se následně zprocesuje. Tím vlastně vznikne další odbavovací cyklus v už aktuálním odbavovacím cyklu. No a celý odbavovací proces požadavku je v Zend Frameworku opravdu hodně náročný. Navíc jsem pak měl problémy s viewRenderer action helperem. Dokonce se doporučení o tom nepoužívat action view helper dostalo i do sekce manuálu popisující výkonost.

Dvojité provádění metod helperů a pluginů

Protože se spouští celý proces odbavení požadavku, tak se vykonávají např. i požadavky na ACL, požadavky do db, které nejsou třeba atd. Dost často si to člověk ani neuvědomí, co všechno se vlastně v takovém requestu, který je spuštěn až při vykreslování stránky vykoná.

Přílišná komplexnost toku aplikace a jejího designu

Action view helper a také ActionStack action helper přidávají to toku aplikace velký stupeň komplexnosti, který není příliš potřeba. Ve většině případů je nejlepší, pokud je pod url které vidím v prohlížeči, opravdu jen jedna action controller metoda.

Pokud používáte action view helper nebo ActionStack, tak možná ta část kódu, která je v action metodách volaných těmito helpery, vůbec nepatří do controlleru. Jinými slovy se asi odchylujete od správného designu aplikace podle MVC. Pravděpodobně by jste měli Váš kód z těchto action metod přesunout do modelu nebo do view helperů.

Doporučení se dá shrnout do pár bodů.

  1. lehčí controllery, bohatší modely - zkuste odlehčit své controllery tak, že se pokusíte kód z action metod přesunout do modelů. V ideálním případě by action metody controllerů měly být více méně jen prodlouženou rukou http a tupou lopatou, která přehazuje věci související s modelem do view.
  2. zapojte view helpery - tam kde potřebujete mít nějakou lehčí logiku i ve view, zkuste použít view helper.
  3. rozdělte šablony na části - rozdělte šablony na kousky, které je potřeba nějak separovat a v použijte v šablonách metody render("part.html") na view objektu.
  4. separace v partial view helperech - partial view helpery jsou výhodné na izolaci určitých částí view, které se opakují v cyklech. Poskytují separaci view kontextu pro iterovaný view skript.

Možná se najdou situace kdy se použití ActionStacku nebo action view helperu hodí, nicméně už vznikl i bug ZF-5840 na to, aby se action view helper v major verzi odstranil z frameworku. Tak uvidíme.

přechod na PHP 5.3

Protože od verze 1.9.0 je Zend Framework otestován na stabilním php 5.3, tak jsem si php 5.3 zkompiloval (trochu to drhlo když jsem pouštěl make test) a blog už jede na PHP 5.3. Pokud by jste si tedy někdo čistě náhodou stáhli aktuální skripty aplikace, tak už tam používám některé konstrukce z 5.3, jako zkrácený ternární operátor a closure, tu jsem použil jako callback pro funkci array_filter() v action helperu.

public function getArticleMonthStat()
{
    $monthArchive = $this->getArticleMonthArchive();
 
    return array_filter($monthArchive->getMonthStats(),
        function(Blog_Model_ArticleMonthArchive $monthStat) use ($monthArchive) {
           return ($monthStat->getMonth() != $monthArchive->getMonth()
               || $monthStat->getYear() != $monthArchive->getYear());
        }
    );
}

Komentáře (0)

Komentáře jsou uzavřeny.