# Action Helfer

## Einführung

Aktion Helfer erlauben Entwicklern Runtime und/oder On-Demand Funktionalität in jeden Aktion Controller zu inizieren der Zend_Controller_Action erweitert. Aktion Controller versuchen den Notwendigkeit zu minimieren, den abstrakten Aktion Controller zu erweitern um damit normale Aktion Controller Funktionen inizieren.

Es gibt eine Menge an Wegen um Aktion Helfer zu verwenden. Aktion Helfer verwenden ein Broker System, ähnlich den Typen von Brokern in Zend_View_Helper, und denen von Zend_Controller_Plugin. Aktion Helfer Zend_View_Helper) können bei Bedarf geladen und aufgerufen werden, oder Sie können wärend der Anfragezeit (Bootstrap) instanziert werden oder wären der Erstellungszeit des Aktion Controllers (init()). Um Sie näher zu verstehen, betrachten wir Ihre Verwendung in der folgenden Sektion.

## Helfer Initialisierung

Ein Helfer kann auf vielen verschiedenen Wegen initialisiert werden, basierend auf den eigenen Bedürfnissen und den Funktionalitäten dieses Helfers.

Ein Helfer Broker wir das der `$_helper` Teilnehmer von Zend_Controller_Action gespeichert; der Broker kann verwendet werden um Helfer zu empfangen oder aufzurufen. Einige Methoden das zu tun sind:

- Explizit getHelper() verwenden. Ihm einfach einen Namen übergeben und ein Helfer Objekt wird zurückgegeben:

      $flashMessenger = $this->_helper->getHelper('FlashMessenger');
      $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');

- Verwenden der __get() Funktionalität des Helfer Brokers und Empfangen des Helfers wie wenn er eine Teilnehmer Eigenschaft des Brokers wäre:

      $flashMessenger = $this->_helper->FlashMessenger;
      $flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');

- Letztendlich implmentieren die meisten Aktion Helfer die direct() Methode welche eine spezielle, Standardmethode im Helfer aufruft. In Beispiel des FlashMessenger's, wird addMessage() aufgerufen:

      $this->_helper->FlashMessenger('Wir haben in der letzten Anfrage etwas getan');

Alle oben angeführten Beispiel sind funktionell gleichwertig.

Man kann Helfer auch explizit instanzieren. Das kann gewollt sein wenn der Helfer ausserhalb eines Aktion Controllers verwendet werden soll, oder wenn ein Helfer an einen Helfer Broker übergeben wird um Ihn durch irgendeine Aktion zu verwenden. Instanziert wird er wie jede andere PHP Klasse.

## Der Helfer Broker

Zend_Controller_Action_HelperBroker behandelt die Details der Registrierung von Helfer Objekten und Helfer Pfaden, sowie dem Empfangen von Helfern bei Befarf.

Um einen Helfer im Browser zu registrieren, kann addHelper() verwendet werden:

    Zend_Controller_Action_HelperBroker::addHelper($helper);

Natürlich ist das Instanzieren und übergeben von Helfern an den Broker etwas Zeit- und Ressourcen intensiv, weswegen twei Methoden existieren um die Dinge etwas zu automatisieren: addPrefix() und addPath().

- addPrefix() nimmt einen Klassenpräfix und verwendet Ihn um einen Pfad zu ermitteln wo Helferklassen definiert wurden. Er nimmt an das der Präfix den Konventionen der Benamung von Klassen im Zend Framework folgt.

      // Helfer mit vorangestelltem My_Action_Helpers in My/Action/Helpers/ hinzufügen
      Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');

- addPath() nimmt ein Verzeichnis als erstes Argument und einen Klassenprefix als zweites Argument (Standardwert ist 'Zend_Controller_Action_Helper'). Das erlaubt es die eigenen Klassenpräfixes mit speziellen Verzeichnissen zu verbinden.

      // Helfer mit vorangestelltem Helper in Plugins/Helpers/ hinzufügen
      Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
                                                   'Helper');

Da diese Methoden statisch sind, können Sie zu jeder Zeit in der Controllerkette aufgerufen werden um Helfer dynamisch hinzuzufügen wenn es notwendig wird.

Intern verwendet der Helfer Broker eine Instanz des PluginLoader's um die Pfade zu verwalten. Man erhlt den PluginLoader indem die statische Methode getPluginLoader() verwendet, oder alternativ, eine eigene PluginLoader Instanz einfügt durch Verwenden von setPluginLoader().

Um zu ermitteln ob ein Helfer im Helfer Broker existiert, kann hasHelper($name) verwendet werden, wobei `$name` der Kurzname des Helfers ist (ohne das Präfix):

    // Prüft ob der 'redirector' Helfer im Broker registriert ist:
    if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
        echo 'Der Redirector Helfer ist registriert';
    }

Es gibt auch zwei statische Methoden für das bekommen von Helfern vom Helferbroker: getExistingHelper() und getStaticHelper(). getExistingHelper() empfängt einen Helfer nur dann wenn er davor durch den Helferbroker ausgerufen wirde oder explizit in Ihm registriert wurde; wenn nicht wird eine Ausnahme geworfen. getStaticHelper() macht das selbe wie getExistingHelper(), wird aber versuchen den Helfer zu initiieren wenn dieser davor noch nicht im Helferstack registriert wurde. getStaticHelper() ist eine gute Wahl für das empfangen von Helfern welche man konfigurieren will.

Beide Methoden nehmen ein einzelnes Argument, `$name`, welches der Kurzname des Helfers (ohne den Präfix) ist.

    // Prüfe ob der 'redirector' Helfer im Broker registriert ist und holt Ihn:
    if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
        $redirector =
            Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
    }

    // Oder, Ihn einfach empfangen, ohne darüber nachzudenken ob er bereits
    // registriert wurde oder nicht:
    $redirector =
        Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    }

Schlußendlich, um einen registrierten Helfer vom Broker zu entfernen, kann removeHelper($name) verwendet werden, wobei `$name` der Kurzname des Helfers ist (ohne den Prefix):

    // Wenn vorhanden, entferne den 'redirector' Helfer vom Broker:
    if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
        Zend_Controller_Action_HelperBroker::removeHelper('redirector')
    }

## Eingebaute Aktions Helfer

Zend Framework enthält standardmäßig verschiedene Action Helfer: AutoComplete für automatisierte Antworten für AJAX Autovervollständigung; ContextSwitch und AjaxContext für alternative Antwort Formate eigener Aktionen; einen FlashMessenger für die Behandlung von Kurznachrichten; Json für das verschlüsseln und senden von JSON Antworten; einen Redirector, um verschiedene Implementationen, für das Umleiten zu internen und externen Seiten, für die Anwendung bereitzustellen und einen ViewRenderer um den Prozess des Setzens eines View Objekts im Controller und dem Rendern von Views zu automatisieren.

## Schreiben eigener Helfer

Aktions Helfer erweitern Zend_Controller_Action_Helper_Abstract, eine abstrakte Klasse die das Basisinterface bietet und vom Helfer Broker funktionell benötigt wird. Diese inkludiert die folgenden Methoden:

- setActionController() wird verwendet um den aktuellen Aktion Controller zu setzen.

- init(), wird vom Helfer Broker wärend der Instanzierung ausgeführt und kann verwendet werden um den Status zurückzusetzen wenn mehrere Controller den gleichen Helfer in einer verketteten Aktion verwenden.

- preDispatch(), wird vor der ausführenden Aktion gestartet.

- postDispatch() wird ausgeführt nachdem eine Aktion fertig ist -- selbst wenn ein preDispatch() Plugin die Aktion abgebrochen hat. Normalerweise nützlich für das Saubermachen.

- getRequest() empfängt das aktuelle Anfrage Objekt.

- getResponse() empfängt das aktuelle Antwort Objekt.

- getName() empfängt den Helfernamen. Sie empfängt die Portion des Klassennamens der dem letzten Unterstrich-Zeichen folgt, oder andererseits den kompletten Klassennamen. Als Beispiel, wenn die Klasse Zend_Controller_Action_Helper_Redirector heißt, wird Redirector zurückgegeben; eine Klasse die FooMessage heißt wird einfach sich selbst zurückgeben.

Optional kann eine direct() Methode in der eigenen Helfer Klasse inkludiert werden. Wenn Sie definiert ist, erlaubt Sie den Helfer als eine Methode des Helfer Brokers zu verwenden, um eine einfache rein-raus Verwendung des Helfers zu ermöglichen. Als Beispiel definiert der Umleiter direct() als einen Alias von goto() und erlaubt damit die Verwendung des Helfers wie folgt:

    // Umleiten zu /blog/view/item/id/42
    $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));

Intern schaut die __call() Methode des Helfer Brokers nach einem Helfer der redirector heißt, prüft anschließend ob der Helfer eine definierte direct() Methode besitzt und ruft diese mit den angegebenen Argumenten auf.

Wenn eine eigene Helfer Klasse erstellt wurde, kann man zu Ihr wie im obigen Kapitel beschrieben, Zugang erhalten.