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

Zend framework - jak vytvořit modul

Úvod V příspěvku se zmíním o způsobu, jak vytvořit modul v Zend Frameworku. Dále si povíme o jeho registraci v projektu a namapování zdrojů, které bude daný modul používat. Architektura projektu Jak vytvořit modul Namapování adresářové struktury modulu Shrnutí Závěr Případné problémy Zdroje Jednu poznámku hned na začátku, seznam proměnných, které budu používat v textu: %APACHE_HOME% - adresář, v kterém máte nainstalován httpd server %APP_HOME% znamená %APACHE_HOME%/htdocs/zendapp/application , jedná se o lokaci aplikace, na které budu vysvětlovat tento návod Architektura projektu Adresářová struktura ZF projektu hraje klíčovou roli. Základní stavební jednotkou projektu je modul . Základní struktura aplikace, kterou získáváte stažením Zend Frameworku je považována za defaultní modul. Nicméně při implementaci větších projektů se setkáte s tím, že projekt je potřeba rozdělit na několik logických celků (administrace, blog, fotogalerie atd.). ZF nabízí architektům mod...

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...