Zend framework - kompletace

Jak jsem minule slíbil, blížíme se do finále. Vlastně by se dalo říct, že je to takové malé finále, protože těch témat, která se dají k Zend frameworku napsat je zatím spousta a prozatím se tímto tématem mnoho lidí nezabývá.

Model View Presenter

Posledním krokem ke kompletaci naší aplikace, která aplikuje návrhový vzor Model View Presenter je vytvoření modelu. Jelikož je toto pouze úvod, model bude skutečně jednoduchý, tak abych mohl demonstrovat jeho použití. V reálné aplikaci by se dalo předpokládat, že s modelem bude zároveň vytvořena servisní nebo-li business vrstva aplikace, která se bude starat o poskytování dat pro jednotlivé akce.

Náše třídy modelu pro aplikaci budou umístěny v adresáři models, který jsme si vytvořili hned na počátku při vytváření adresářové struktury aplikace. Každá třída by měla mít svůj vlastní soubor a též pojmenování třídy a souboru by mělo být shodné. Jelikož jsme uvedli adresář models jako include_path, můžeme používat oblíbenou statickou metodu Zend_Loader::loadClass pro načtení třídy k jejímu použití.

Já jsem vytvořil pouze jednoduchou třídu s dvěmy vlastnostmi, kterou nadále použiji a naplním v Controlleru a hodnoty z této třídy - Modelu - zobrazím ve View.

class TextStore { public $name; public $description;}

 Kompletace - dáváme vše dohromady

Nyní již máme všechny potřebné třídy vytvořeny a je postačující vše poskládat jak skládanku a jít si hrát. Do vytvořeného výchozího controlleru nazvaného IndexController tedy doplníme následující kód:

function init() { $this->initView(); Zend_Loader::loadClass('TextStore');}

public function indexAction() { $this->view->title = "jirava.net - index" $store = new TextStore(); $store->name = "Zend framework a Smarty template" $store->description = "úvodník do MVC frameworku pro PHP vývojáře" $this->view->store = $store; $this->render();}

Ve funkci init(), která je volána při inicializaci controlleru, doplníme volání pro inicializace proměnné view. Voláním přepsané funkce initView() tak vytvoříme instanci Smarty engine, tak jak jsem jej popsal v minulém příspěvku o view Smarty. Zároveň v inicializační metodě požádáme o nahrání potřebných tříd, které budeme používat v daném controlleru.

Poté nám již zbývá implementovat výchozí akci indexAction(). Zde naplníme proměnné pro View, které použijeme ve vytvořeném template. Abychom měli ukázku toho, jak se dá použít náš model, vytvoříme si instanci třídy TextStore, naplníme ji a přiřadíme do proměnné. Implementace naší třídy pro Smarty zařídí, že dojde k vyvolání metody assign a přiřazení názvu proměnné a její hodnoty pro použití v template. Nakonec zbývá už jen požádat o vyrenderování výsledku vyvoláním metody render().

Doplnění k View

V příspěvku o složce View a využití Smarty jako šablonovacím systému jsem opoměl na několik věci, které se mi už nechtěly doplňovat do publikovaného příspěvku a tak si na ně udělám místo nyní.

Kam umisťovat šablony

Šablony pro naše jednotlivé akce se umísťují do adresáře views aplikace. Hierarchie a pojmenování je shodná podle názvu controllerů, případně modulů. S jediným rozdílem, že i pro výchozí controller Index je nutné vytvořit podsložku se stejným názvem. Dále platí pravidlo, že pokud použijeme pouze metodu render(), bude použit stejný název šablony (souboru) jako je název právě prováděné akce. Samozřejmě je možné předanými parametry metodě render toto chování upravit a požádat o vyrenderování jiné šablony.

Pro Smarty je zároveň nutné vytvořit adresář pro zkompilovanou šablonu a v případě, že chceme používat cache, tak také pro ni. Já jsem tyto adresáře umístil taktéž do adresáře views, ale toto chování se může změnit v konstruktoru třídy JiravaNet_View_Smarty.

Zdrojové soubory

Jak jsem slíbil tak také činím, k dispozici dávám zdrojové soubory této úvodní aplikace, která má za úkol seznámit PHPčkaře se Zend frameworkem. Aplikace obsahuje kompletní kód, tak jak byl v minulých příspěvcích popsán. Zároveň je ponecháno několik neokomentovaných implementací, které se pokusím vysvětlit zase někdy příště a zbývá také spousta věcí, které čekají na vysvětlení a implementaci.

Malé upozornění: Ve třídě Zend_Db_Statement_Db2 jsem doplňoval scházející uzavírací závorku u metody fetchObject. Povzdechnutí: není nad možnost kompilace, i když jsem předpokládal, že pro Zend by to neměl být takový problém.

8 Comments

  • Jakub Podhorský said



    <p>Zdravím,</p>
    <p>nechtěl by ses tady trochu ještě rozepsat o tom jak správně používat(vytvořit) business logiku(třeba v Zend Frameworku). Tutorialy na to skoro nejsou a tak jak já to mám řešený teď mi to přijde až moc složitý a z hlediska návrhu i špatný</p>

  • said


    <p>2 error414: Žiji v tom domění, že PHP je interpretovaný jazyk, takže předpokládám, že kód interpretuje a nikoliv kompiluje. Samozřejmě budu rád, když mi to vyvrátíš.</p>
    <p>Jen mi potom není jasné, pokud by se kód kompiloval, jak je možné, že nebyla odhalena ta chybějící závorka? </p>
    <p>Díky</p>

  • error414 said



    <p>PHP se take kompiluje do bite kodu a take se kontroluje syntax. Ale kontroluje se syntax jen u tech souboru co program v aktualnim behu nacita. Takze je mozne soubor s tridouZend_Db_Statement_Db2 se pri tve  kontrole nenacital.</p>
    <p>V praxi to znamena slozitejsi testovani.</p>
    <p>BTW: pokud ma poznamka znela ironicky tak se omlouvam. Nebyla ironicka.</p>

  • Ronnie said



    <p>1. Zend Framework od nové verze už doporučuje vytváření hiearchie pomocí modulů (v manuálu je to chybně popsáno)</p>
    <p>2. Místo mnoho volání Zend_Loader::loadClass() bych se si vytvořil autoloady pomocí SPL knihovny (viz interval). </p>
    <p>3. Ad kompilace. PHP projde soubor dvakrát. Poprvé zjišťuje syntaktické chyby a odstraní věci, které tam nemají, co dělat (if (false) ...). Pak to projde ještě jednou a skript vykoná.</p>
    <p>4. Nedodržujete štábní kulturu (v úterý o tom bude článek na Intervalu), kterou Zend Framework doporučuje. V manuálu k coding standards jsou bohužel chyby.</p>
    <p>5. Je fajn, že je u nás další weblog o Zend Frameworku. Od prosince 2006 jeho podpora v ČR výrazně vzrostla. Těším se na další články.</p>

  • said


    <p>Ahoj,</p>
    <p>  neberu to ironicky, jsem rád, když se něco nového přiučím.</p>
    <p>  Co se týká kompilace. Je pravda, že jsem se možná ne úplně přesně vyjádřil a měl jsem raději uvést sestavení (build). Byť build provádí to, že kompiluje a linkuje jednotlivé části programu dohromady.</p>
    <p>  Budu rád za další postřehy.</p>
    <p>Díky</p>

  • said


    <p>Ahoj,</p>
    <p>  díky za postřehy Ronnie.</p>
    <p>ad 1. Můžeš to nějak blíže osvětlit? (viz. dále)</p>
    <p>ad 2. V době psaní příspěvků (neděle a úterý večer) jsem neměl možnost tvůj článek na intervalu přečíst a nikde jinde jsem se k tomu nedopracoval. Teď už jsem o dost chytřejší.</p>
    <p>ad 3. ok</p>
    <p>ad 4. Jestli se mohu zeptat, tyto "zákulisní" informace je možné čerpat kde? Když si to tak přeberu se situací tak před pěti lety, kdy na MSDN nebyl z pohledu některých vývojářů dobrý pohled, tak tato situace je teď u Zend frameworku.(?) ;-)</p>
    <p>ad 5. nechci to tu proměnit v další (druhý, třetí?) blog o Zend frameworku. Jen mi to přišlo jako vhodná alternativa a takové malé odskočení si od toho, čím se teď zabývám v  asp.net/.net. To však nevylučuje, že bych se o další postřehy se Zend frameworkem nepodělil.</p>
    <p>  Čas strávený s tímto frameworkem by se dal spočítat na prstech jednoho člověka, takže jsem rád za jakékoli postřehy. Na druhou stranu to může být fajn postup pro stejně začínající vývojáře.</p>
    <p>  Díky</p>

  • Ronnie said



    <p>1. <a rel="nofollow" target="_new" href="http://akrabat.com/2007/02/03/modules/">http://akrabat.com/2007/02/03/modules/</a></p>
    <p>Nedávno o tom psal někdo velmi dobrý článek, nemůžu ho zrovna najít. Pokud se mi to podaří, tak sem hodím odkaz.</p>
    <p>4. Existuje mnoho možností. Buď se přihlásit k odběru fw-general diskuse přes emaily. Nebo si nechávat posílat pravidelné informační emaily (jednou za den), kde jsou shrnuty nové informace. Nebo číst blogy vývojářů ap.</p>

Add a Comment