Zend framework - controllers

Dalším příspěvkem pokračuje můj krátký úvod do Zend frameworku, jakožto jednoho z mnoha MVC frameworků pro PHP.

Získáním instance třídy front controlleru a požádáním o zpracování požadavku, voláním metody dispatch() naše práce nekončí a je třeba ještě několik kroků. Tím navazujícím krokem je vytvoření konkrétního controlleru zodpovědného za zpracování akcí vyvolaných uživatelem.

Formát url

Nejdříve je třeba si říci, jakým způsobem je vlastně rozhodováno, který konkrétní controller bude vybrán ke zpracování požadavku. Tento výběr je založen na formátu url. Jelikož se pohybujeme v prostředí internetu, kde je jedním z rozhodujících faktorů úspěšnost našich stránek ve vyhledávačích a hlavně také návštěvnost takových stránek, snažíme se návštěvníkům všemožně pomoci. A právě model formátu url, je jedním ze zmiňovaných plus od různých SEO a SEM odborníků (ač tomu příliš nevěřím) a Zend framework jde právě tímto směrem. Tedy směrem hezkých url, která se dobře pamatují.

Jak už jsem se zmínil v předchozím příspěvku a jistě pozornější z vás si to pamatují, pro zobrazení požadované stránky je důležitý vyběr správného konkrétního controlleru a akce, požadované od uživatele. Právě podle těchto dvou parametrů se také při výběru rozhoduje získaný front controller.

Hezký formát url pro Zend framework tedy vypadá následovně:

http://www.example.com/controller/action/

Controller je poté odvozen od názvu třídy s přesně danými pravidly a akce je metoda náležející této třídě, taktéž s definovanými pravidly. (Zjednodušeně řečeno.)

Pravidla pro controller jsou stanovena takto:

Prvním, nevím jestli říci pravidlem, je nutnost podědit vytvářenou třídu controlleru od abstraktní třídy  Zend_Controller_Action. A pokračujeme v pravidlech, název controlleru je názvem třídy doplněného o slovo Controller s tím, že tento název musí začínat velkým písmenem, tedy {ControllernameController}. Zároveň je definice této třídy zapsána ve stejně pojmenovaném souboru s koncovkou php a umístěna v adresářové struktuře, tedy ./application/controllers.

Pro akce (action) je těch pravidel přeci jen o něco méně. Akce je definována jako public metoda dané trídy controlleru, pojmenována jako název akce doplněná o slovo Action. Název akce může, ale nemusí, začínat malým písmenem.

Jistě se teď někteří začnou ptát a co v případě, že chci navigovat přímo na root mojí aplikace, jde to vůbec? Nebo co se stane, když návštěvník začne zkoušet a odmaže celý název akce. I na tyto otázky má Zend framework odpověď a já vlastně také.

IndexController a indexAction

Přesně tak, tou správnou odpovědí je controller, který je nazván jako IndexController. Tento controller by měl být tím prvním co začnete tvořit, jakmile máte nastaven Zend framework a vytvořen soubor index.php.

Zároveň pokud v jakémkoli controlleru, tedy i IndexController, nadefinujete akci s názvem indexAction bude tato zpracována jako výchozí akce. Tato akce je tedy zpracována i pokud není uvedena ve formátu url předaném návštěvníkem/samotnou aplikací - návštěvník zadá pouze název domény s naší aplikací.

Konečně nějaký výstup

Určitě už se nemůžete dočkat a říkáte si, tohle všechno je pěkné, ale kdy konečně dostanu nějaký viditelný výsledek mého snažení. Pokud tedy poruším myšlenku vzoru MVC a odhlédnu jak od Modelu tak také View, můžeme si napsat první Controller, který zobrazí text na stránce.

class IndexController extends Zend_Controller_Action {public function indexAction() {echo "Konečně nějaký výstup z výchozího controlleru a výchozí akce.";}}

 Tímto máme zajištěno, že při vyvolání naší úvodní stránky (root aplikace) se nám v prohlížeči zobrazí uvedený text.

O tom, jak do zpracování zapojit také View a Model si povíme zase příště - však už to znáte.

2 Comments

  • ondra said

    Dobrý den, postupoval jsem přesně podle návodu a při zavolání http://localhost/myweb/ mi vyjede chyba

    Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\dev\www\zend\library\Zend\Controller\Dispatcher\Standard.php:249 Stack trace: #0 C:\dev\www\zend\library\Zend\Controller\Front.php(914): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\dev\www\zend\index.php(12): Zend_Controller_Front->dispatch() #2 {main} thrown in C:\dev\www\zend\library\Zend\Controller\Dispatcher\Standard.php on line 249

    controller jse muložil do application/controllers/IndexController.php

    Můžete mi prosím odpovědět na email?

Add a Comment