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

Letmý pohled na php frameworky Zend, CakePHP a Prado

Tento článek vyšel původně na blogu derhaa.com, který jsem však zrušil. Abstrakt Tento článek je předvojem seriálu o Zend Framework (u) – dále je tu velmi stručný rozbor,  jak sem nahlédl pod pokličku dalších dvou frameworků –  CakePHP (CP) a Prado (PD).  Mimochodem se zde stručně dozvíme jak frameworky pracují a soupis funkčností, kterými se od sebe odlišují. Cílem článku je povrchně seznámit čtenáře se třemi PHP frameworky, které se staly předmětem mého zájmu – v čem napsat středně veliký projekt.   Idea Když jsem přemýšlel v čem napíšu svůj první větší počin, tj. aplikace typu HRMS , jehož dalším cílem bude nad shromážděnými daty provádět specifické analýzy/statistiky související se sportovní tématikou. Předpokládal jsem, že to nebude malý projekt, který lze napsat na koleni, ale budu potřebovat sofistikovanější nástroje pro práci s databází ( ORM ),  propracovanější návrh doménového modelu , následné rozdělení aplikace na logické celky – vrstvy ...

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 .

PHP a Zend Framework autoloading

Úvod V příspěvku se zmíním o způsobu a správě „importů“ (tzv. autoloading) php souborů v samotném PHP a poté se dozvíme, jak autoloading php souborů řeší Zend Framework. Autoloading v PHP Správa importů v PHP Jak "importovat" v PHP soubory Jak funguje mechanismus importů v PHP Autoloading v Zend Framework Autoloading v PHP Základem při psaní aplikací v PHP je nutné si uvědomit, jak funguje tzv. autoloading php souborů. V PHP neexistují importy jako je známe např. z Java. Když například potřebujete konstruhovat třídu jejíž definice je v jiném souboru – je nutné si tento soubor za pomocí konstrukce require nebo require_once ( include , include_once ) “naimportovat“ do svého souboru (předpokladem, je že soubory jsou umístěné na include_path ). Dalším řešením je překrýt funkci autoload . Správa importů v PHP Správa “importů” souborů v php mi přijde neštastná. Jedná se do jisté míry o problém, alespoň pro mne – jsem vývojářem v Java , kde tento mechanismus je zajišt...