7.5. Action Controllers

7.5.1. Uvod

Zend_Controller_Action je abstraktná trieda ktorá sa používa na vytvorenie skupiny akcii, ktoré sa používajú pri WWW sídle vytvorenom na základe vzoru Model-View-Controller (MVC).

Pre použitie Zend_Controller_Action je potrebne vytvoriť odvodenú triedu (alebo odvodenú triedu ktorá bude základom pre ostatné skupiny akcii). Najčastejšie sa vytvára odvodená trieda ktorej metódy zodpovedajú akciám ktoré je potrebné vytvoriť na svojom WWW sídle. Trieda Zend_Controller automaticky používa ako akcie všetky metódy, ktoré končia na 'Action'.

Ako príklad, uvedieme nasledujúcu odvodenú triedu:

class FooController extends Zend_Controller_Action
{
    public function barAction()
    {
        // do something
    }

    public function bazAction()
    {
        // do something
    }
}

Uvedená odvodená trieda FooController (skupina akcii 'Foo') definuje dve akcie: 'bar' a 'baz'.

Nasledujúca časť približuje možnosti, ktoré môžu byt realizované zmenou metód v odvodenej triede, ako napríklad vlastnú inicializačnú postupnosť, ošetrenie neexistujúcich (zlých) akcii, definovanie operácii ktoré sa majú vykonať pred a po vykonaní akcie a ďalšie iné činnosti.

7.5.2. Inicializácia objektu

Je možne zmeniť konštruktor objektu, ale tento postup nie je odporúčaný. Metóda Zend_Controller_Action::__construct() realizuje niekoľko dôležitých úloh ako napríklad registráciu request, response objektov a tiež ľubovoľné vlastné parametre ktoré boli predané z front controller-a. Ak je potrebné zmeniť konštruktor objektu, je vhodné, zavolať rodičovský konštruktor parent::__construct($request, $response, $invokeArgs)

Vhodnejšie je predefinovať metódu init(), ktorá sa vola ako posledná z konštruktoru __construct(). V tejto metóde sa napríklad môžeme pripojiť k databáze:

class FooController extends Zend_Controller_Action
{
    public function init()
    {
        $this->db = Zend_Db::factory('Pdo_Mysql', array(
            'host'     => 'myhost',
            'username' => 'user',
            'password' => 'XXXXXXX',
            'dbname'   => 'website'
        ));
    }
}

7.5.3. Pre- and Post-Dispatch Hooks

Zend_Controller_Action ponúka dve metódy, preDispatch() a postDispatch(), ktoré môžu byť vyvolané pri vyžiadanej akcii. Je ich možné použiť na rôzne úkony ako napríklad na znovu overenie prístupových práv ešte pred samostatnou akciou (ak sa zavolá _forward() v metóde preDispatch() akcia bude preskočená), alebo uloženie vygenerovaného obsahu (postDispatch()).

7.5.4. Accessors

A number of objects and variables are registered with the object, and each has accessor methods.

  • Request Object: getRequest() may be used to retrieve the request object used to call the action.

  • Response Object: getResponse() may be used to retrieve the response object aggregating the final response. Some typical calls might look like:

    $this->getResponse()->setHeader('Content-Type', 'text/xml');
    $this->getResponse()->appendBody($content);
    
  • Invocation Arguments: the front controller may push parameters into the router, dispatcher, and action controller. To retrieve these, use getInvokeArg($key); alternatively, fetch the entire list using getInvokeArgs().

  • Request parameters: The request object aggregates request parameters, such as any _GET or _POST parameters, or user parameters specified in the URL's path information. To retrieve these, use _getParam($key) or _getAllParams(). You may also set request parameters using _setParam(); this is useful when forwarding to additional actions.

    To test whether or not a parameter exists (useful for logical branching), use _hasParam($key).

7.5.5. Utility Methods

Besides the accessors, Zend_Controller_Action has several utility methods for performing common tasks from within your action methods (or from pre-/post-dispatch).

  • _forward($controller, $action, $params = array()): perform another action. If called in preDispatch(), the currently requested action will be skipped in favor of the new one. Otherwise, after the current action is processed, the action requested in _forward() will be executed.

  • _redirect($url, $code = 302): redirect to another location. This method takes a URL and an optional HTTP status code. The redirect is performed immediately and program execution is halted.

    If a status code is provided, it will be passed to the PHP header() command when the redirect is performed.