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.phpVýš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 4Bohuž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