Přeskočit na hlavní obsah

Nevytvářejte společného předka pro Zend_Controller_Action používejte Zend_Controller_Plugin

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 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 1
Nyní 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 zavolat Zend_Tool pro vytvoření pro ItemController žádnou akci, neboť po zavolání
Kod.3
zf create action save Item 1
Dojde 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řídy Zend_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

Populární příspěvky z tohoto blogu

XAMPP - problémy s Apache (ServerRoot must be a valid directory, make_sock: could not bind to address)

O instalaci a příspěvek  o spuštění Apache  a MySQL serveru jsem již psal na svém blogu. Při nedávné instalaci, kterou jsem pojal jako kata cvičení, abych nevyšel z formy jsem narazil na problémy, které jsem již řešil a považuji je, za standard a mnohým ušetří to "pátrání". Výčet nemusí být konečný (pakliže se budu dopouštět takových chyb) : ServerRoot must be a valid directory Hlášení - httpd.exe: Syntax error on line xx /path/to/your/apache/conf : ServerRoot must be a valid directory ( %XAMPP_HOME%/apache/logs/error.log ) Popis - máte nekonzistentí namapování adresářové struktury pro server Apache. Ověřte si, co je zapsáno v direktivě ServerRoot v konfiguračním souboru ( %XAMPP_HOME%/apache/cont/httpd.conf)  měla by tam být buď absolutní v lepším případě relativní cesta k adresáři %XAMPP_HOME%/apache . Řešení - nejjednoduší je zapsat absolutní cestu k adresáři Apache serveru. Někdy je pouze znovu-namapovat adresářovou strukturu za pomocí konsole - s...

Zend_Tool - Cannot redeclare class Zend_Loader

V mém případě, když jsem zadal následující příkaz: zf create module admin V konsoli se objevila následujicí hláška Cannot redeclare class Zend_Loader in path/to/library/Zend/Loader on line 31 Řešení je jednochuché - Nakopírujte soubory zf.bat a zf.php z adresáře %ZEND_FRAMEWORK_DIR%/bin do adresáře %PHP_HOME% . V případě, že chcete vědět více – mkrněte na oficiální dokumentaci Zend_Tool .

How to override (hack) location directories eg. Model in Zend Framework projects

Content At beginning Use Case Standart directory layout Specific directory layout Solvetion Summary At beginning This approach is bad but it is trivial and works. First I thought about a way how to inject/override by my implementation but if I stood before "I need only change location where objects will be generated..." Use Case For example - your project's 'models' directory has different structure and you must remove each generated model's php file to your specific directory. Standart directory layout If you use command "zf create model ItemModel" . ItemModel file will be generated by default in directory 'models' . ----models |--DbTable |--ItemModel.php Specific directory layout We want to generate model class in subdirectory 'Domain' . That's all. ----models |--DbTable |--Domain |--ItemModel.php Solvetion We must find directory '%ZF_HOME%\library\Zend\Tool\Project\Context\Zf\' . T...