Portál AbcLinuxu, 31. května 2024 07:36

Zend framework II

31.3.2008 09:03 | Přečteno: 2778× | poslední úprava: 31.3.2008 10:03

Zend framework - kontrolery

Minule jsem mimo jiné napsal něco v tom smyslu, že příchozí požadavky jsou obsluhovány front controllerem, který se zjednodušeně řečeno stará o zavolání příslušného kontroleru. Než se budu zabývat něčím dalším, bylo by asi dobré si aspoň trochu vyjasnit, co přesně se při zpracování požadavku děje.

Celý proces je dobře znázorněn na následujícím obrázku (převzatý z manuálu Zendu):

Je zde v podstatě znázorněno, jak je v Zendu implementován (třída Zend_Controller_Front) návrhový vzor Front Controller. Příchozí požadavek je obvykle reprezentován třídou Zend_Controller_Request_Http (obecně třídou Zend_Controller_Request_Abstract, třída Http je její potomek), která kromě parametrů obsahuje informace o jménu kontrolertu a akce, která má tento požadavek zpracovávat (a některé další informace). Zend_Controller_Front je singleton, což znamená, že vždy existuje jen jedna jeho instance. Tato třída také, mimo jiné, registruje pluginy, které umožňují jednoduše rozšiřovat její možnosti bez nutnosti vytváření jejích potomků. Pro obsloužení požadavku se na instanci této třídy obvykle volá metoda dispatch(), která se skládá ze tří částí:

Jako první je tedy zavolán router, jehož úkolem je zjistit, jaký kontroler a akce mají požadavek obsloužit. Minule jsem psal, že toto určení probíhá na základě URI podle klíče aplikace/modul/kontroler/akce. Tento proces ale může být složitější, můžeme např. sami definovat pravidla (pomocí Zend_Controller_Router_Rewrite), na jaký konroler se má daná URI mapovat a pod. (o tomto podrobněji někdy jindy). Proces routování může pro každý požadavek proběhnout jen jednou.

Následuje dispatching, což je proces, při němž je z požadavku zjištěn název kontroleru a akce, vytvoří se instance kontroleru (který musí být potomkem třídy Zend_Controller_Action) a na ní se zavolá příslušná metoda. Tento proces, na rozdíl od routingu, může pro daný požadavek proběhnutou vícekrát. Probíhá ve smyčce tak dlouho, dokud není na požadavku nastaven atribut isDispatched na hodnotu true (po vstupu do smyčky je tento atribut automaticky nastaven na true, takže pokud nechceme požadavek předávat dalšímu kontroleru, nemusíme se o nic starat). Naopak další cyklus smyčky nastane např. když v nějaké akci kontroleru zavoláme metodu _forward(). Jak je vidět z obrázku, dispatchingu samotnému předchází ještě predispatching a před vyhodnocením, zda bude smyčka pokračovat dalším cyklem se volá postdispatching. Tyto metody se ale nevolají na front controlleru, ale action controlleru (potomek Zend_Controller_Action) nebo na pluginech. Stručně řečeno, pluginy kontroleru jsou potomky třídy Zend_Controller_Plugin_Abstract. Jak bylo řečeno v úvodu, můžeme je zaregistrovat u front controlleru a tak rozšiřovat jeho možnosti (implementováním metod preDispatch() a postDispatch() a dalších).

Vše si ukážeme na krátkém příkládku. Vytvoříme kontroler, který bude obsluhovat přístup k nějaké části aplikace, která bude přístupná jen pro přihlášené uživatele. V kontroleru implementujeme metodu preDispatch(), která před tím než bude na kontroleru vykonána nějaká akce zkontroluje, zda je uživatel přihlášený (o tom, jaké Zend poskytuje možnosti pro autorizaci a autentizaci taky snad někdy jindy:-). Pokud uživatel nebude přihlášený, přesměrujeme jej na přihlašovací stránku:

<?php
class RestrictedController extends Zend_Controller_Action
{  
  public function preDispatch($request){
    $auth = Zend_Auth::getInstance();
    if(!$auth->hasIdentity()){
      $this->_redirect('auth/login');
    }
  }
  /*
  public function indexAction(){
    //something
  }
  */
}
Měli bychom ještě implementovat alespoň index akci, ale jelikož zatím uživatel nemá žádný způsob jak se přihlásit, tak je to v tuto chvíli zbytečné, přes predispatching se stejně nedostaneme. Potřebujeme ale vytvořil AuthController. Nejběžnější způsob autentizace je vyplnění formuláře s loginem a heslem. O formulářích ale taky někdy jindy, takže zatím akci login taky dělat nebudeme. Pokud framework na kontroleru nenajde požadovanou akci, pak na kontroleru zavolá metodu __call(). Implementujeme tedy aspoň tuto metodu, která zobrazí nějakou stránku, že požadovaná stránka ještě není hotová (místo toho bychom mohli použít třeba Zend_Controller_Plugin_ErrorHandler, ale to bychom musel ještě vyrobit ErrorController a zbytečně by se nám příklad komplikoval:-):
<?php
class AuthController extends Zend_Controller_Action
{
  public function __call($method, $args)
  {
    $this->view->errorMsg = 'Sorry, login page not done yet!';
    return $this->render('error');
  }
  /*
  public function loginAction(){
    //handle login
  }
  */
}

Na závěr ještě doplním, že když byla řeč o kontolerech v Zendu, tak bych určitě měl zmínit, že existuje něco jako action helper, ale o tom taky až někdy jindy (snad:-)        

Hodnocení: 88 %

        špatnédobré        

Obrázky

Zend framework II, obrázek 1

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

srigi avatar 31.3.2008 19:47 srigi | skóre: 10 | blog: sricont
Rozbalit Rozbalit vše Re: Zend framework II
Odpovědět | Sbalit | Link | Blokovat | Admin
Osobne mi pride ta schema zo Zend maualu trocha neprehladna. Mam radsej tuto. BTW ak by niekto hladal komplet tutorial, tak som jeden napisal.
Be kind to newbies.
1.4.2008 08:29 dementni.lojzik | skóre: 19 | blog: ze zivota na vsi
Rozbalit Rozbalit vše Re: Zend framework II
Tady ale slo o front controller, ne o kompletni cyklus request from browser->response to browser. Chovani fronto controlleru na tom tebu uvadenem schmenatu neni zrovna moc podrobne ukazano. Jinak ten tvuj tutorial vypada na prvni pohled dobre, rad si jej prectu, dik.
5.10.2018 09:09 Thanos
Rozbalit Rozbalit vše Re: Zend framework II
Odpovědět | Sbalit | Link | Blokovat | Admin
Have to seen the online all update for windows service of desktop device so save the information how to use remote desktop windows 10 and start the process to full way of remote device set to all thanks.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.