Je žádoucí mít jednu implementaci opakující se funkcionality na jednom místě a tu reusovat. Narazil jsem však při vytváření společného předka pro
Kod.1
Kod.2
Kod.3
Kod.4
Obr.1
Jak zobrazuje obr.1 - zjednodušeně se tímto pluginem připojíte do request cyklu a můžete v daných krocích ovlivňovat chování ve všech controller z jednoho místa. Jedná se o "request scope", takže po celou dobu než je požadavek vyřízet je tento kód k dispozici.
O životním cyklu controller je to na další článek nicméně v tuto chvíli doporučuji nastudovat officiální dokumentaci a mrkněte i na tento obrázek - životní cyklus requestu/response, který zobrazuje cyklus pluginu v přehledném sequence diagramu.
Zend_Controller_Action na jeden problém. Když vytvořím předka pro své controllery, pak nelze použít Zend_Tool pro generování akcí.Nastavení prostředí
V projektu mám tuto hiearchii:|--library
|--MyLibrary
|--Controller
|--Action
|--Action.php
Výše uvedenou knihovnu mám pak zaregistrovanou v Bootstrap.php souboru, potažmo namespace, aby ji Zend_Autoloader našel.
Kod.1
public function _initLibraryNamespace(){
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('MyLibrary_');
}
Nyní vytvořím pomocí Zend_Tool controller v defaultním modulu. Na problém se však narazil i u controlleru, který byl v modulu.
zf create controller Item 1Nyní změním předka na svou implementaci controlleru.
Kod.2
/**
* @author derhaa
*/
class Default_ItemController extends MyLibrary_Controller_Action
{
/* ... */
}
Popis problému
V tuto chvílí však nelze zavolatZend_Tool pro vytvoření pro ItemController žádnou akci, neboť po zavolání
Kod.3
zf create action save Item 1Dojde k následující chybě:
Kod.4
....
Creating an action named save inside controller at C:\Program Files (x86)\Zend\Apache2\htdocs\eightday/application/controllers/IndexController.php
Fatal error: Class 'MyLibrary_Controller_Action' not found in C:\Program Files (x86)\Zend\Apache2\htdocs\eightday\application\controllers\ItemController.php on line 4
Bohužel v dokumentaci jsem nic nenašel, že bych se výše uvedeného chování, definování společného předka pro své controllery měl vyvarovat.
Řešení
Jak z toho ven? Odpověď je velmi jednoduchá - vytvořte si plugin pro své controllery. Jedna se o potomky třídyZend_Controller_Plugin_Abstract. Tento přístup je jednoznačně nejlepší, jak rozšířit chování svých controlleru "by Zend way". Obr.1
Jak zobrazuje obr.1 - zjednodušeně se tímto pluginem připojíte do request cyklu a můžete v daných krocích ovlivňovat chování ve všech controller z jednoho místa. Jedná se o "request scope", takže po celou dobu než je požadavek vyřízet je tento kód k dispozici.
O životním cyklu controller je to na další článek nicméně v tuto chvíli doporučuji nastudovat officiální dokumentaci a mrkněte i na tento obrázek - životní cyklus requestu/response, který zobrazuje cyklus pluginu v přehledném sequence diagramu.
Zdroje
- Zend_Controller_Action - implementace Controller z MVC, mapuje request na váme definované akce
- Zend_Tool - nástroj, jak si zjednodušit život pří vývoji aplikace v Zend frameworku
- Zend_Controller_Plugin_Abstract - elegantní způsob,jak rozšířit chování pro své controller objekty během requestu


Komentáře