1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.controller.actionhelpers" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Action Helfer</title>
<sect2 id="zend.controller.actionhelper.introduction">
<title>Einführung</title>
<para>
Aktion Helfer erlauben Entwicklern Runtime und/oder On-Demand Funktionalität in jeden
Aktion Controller zu inizieren der <classname>Zend_Controller_Action</classname>
erweitert. Aktion Controller versuchen den Notwendigkeit zu minimieren, den abstrakten
Aktion Controller zu erweitern um damit normale Aktion Controller Funktionen inizieren.
</para>
<para>
Es gibt eine Menge an Wegen um Aktion Helfer zu verwenden. Aktion Helfer verwenden ein
Broker System, ähnlich den Typen von Brokern in <link
linkend="zend.view.helpers">Zend_View_Helper</link>, und denen von <link
linkend="zend.controller.plugins">Zend_Controller_Plugin</link>. Aktion Helfer
<classname>Zend_View_Helper</classname>) 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 (<methodname>init()</methodname>). Um
Sie näher zu verstehen, betrachten wir Ihre Verwendung in der folgenden Sektion.
</para>
</sect2>
<sect2 id="zend.controller.actionhelper.initialization">
<title>Helfer Initialisierung</title>
<para>
Ein Helfer kann auf vielen verschiedenen Wegen initialisiert werden, basierend auf den
eigenen Bedürfnissen und den Funktionalitäten dieses Helfers.
</para>
<para>
Ein Helfer Broker wir das der <varname>$_helper</varname> Teilnehmer von
<classname>Zend_Controller_Action</classname> gespeichert; der Broker kann verwendet
werden um Helfer zu empfangen oder aufzurufen. Einige Methoden das zu tun sind:
</para>
<itemizedlist>
<listitem>
<para>
Explizit <methodname>getHelper()</methodname> verwenden. Ihm einfach einen
Namen übergeben und ein Helfer Objekt wird zurückgegeben:
</para>
<programlisting language="php"><![CDATA[
$flashMessenger = $this->_helper->getHelper('FlashMessenger');
$flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
]]></programlisting>
</listitem>
<listitem>
<para>
Verwenden der <methodname>__get()</methodname> Funktionalität des Helfer
Brokers und Empfangen des Helfers wie wenn er eine Teilnehmer Eigenschaft des
Brokers wäre:
</para>
<programlisting language="php"><![CDATA[
$flashMessenger = $this->_helper->FlashMessenger;
$flashMessenger->addMessage('Wir haben in der letzten Anfrage etwas getan');
]]></programlisting>
</listitem>
<listitem>
<para>
Letztendlich implmentieren die meisten Aktion Helfer die
<methodname>direct()</methodname> Methode welche eine spezielle,
Standardmethode im Helfer aufruft. In Beispiel des
<emphasis>FlashMessenger</emphasis>'s, wird
<methodname>addMessage()</methodname> aufgerufen:
</para>
<programlisting language="php"><![CDATA[
$this->_helper->FlashMessenger('Wir haben in der letzten Anfrage etwas getan');
]]></programlisting>
</listitem>
</itemizedlist>
<note>
<para>Alle oben angeführten Beispiel sind funktionell gleichwertig.</para>
</note>
<para>
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 <acronym>PHP</acronym> Klasse.
</para>
</sect2>
<sect2 id="zend.controller.actionhelper.broker">
<title>Der Helfer Broker</title>
<para>
<classname>Zend_Controller_Action_HelperBroker</classname> behandelt die Details der
Registrierung von Helfer Objekten und Helfer Pfaden, sowie dem Empfangen von Helfern bei
Befarf.
</para>
<para>
Um einen Helfer im Browser zu registrieren, kann <methodname>addHelper()</methodname>
verwendet werden:
</para>
<programlisting language="php"><![CDATA[
Zend_Controller_Action_HelperBroker::addHelper($helper);
]]></programlisting>
<para>
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: <methodname>addPrefix()</methodname> und
<methodname>addPath()</methodname>.
</para>
<itemizedlist>
<listitem>
<para>
<methodname>addPrefix()</methodname> 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.
</para>
<programlisting language="php"><![CDATA[
// Helfer mit vorangestelltem My_Action_Helpers in My/Action/Helpers/ hinzufügen
Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
]]></programlisting>
</listitem>
<listitem>
<para>
<methodname>addPath()</methodname> nimmt ein Verzeichnis als erstes Argument
und einen Klassenprefix als zweites Argument (Standardwert ist
'<classname>Zend_Controller_Action_Helper</classname>'). Das erlaubt es die
eigenen Klassenpräfixes mit speziellen Verzeichnissen zu verbinden.
</para>
<programlisting language="php"><![CDATA[
// Helfer mit vorangestelltem Helper in Plugins/Helpers/ hinzufügen
Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
'Helper');
]]></programlisting>
</listitem>
</itemizedlist>
<para>
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.
</para>
<para>
Intern verwendet der Helfer Broker <link linkend="zend.loader.pluginloader">eine
Instanz des PluginLoader's</link> um die Pfade zu verwalten. Man erhlt den PluginLoader
indem die statische Methode <methodname>getPluginLoader()</methodname> verwendet, oder
alternativ, eine eigene PluginLoader Instanz einfügt durch Verwenden von
<methodname>setPluginLoader()</methodname>.
</para>
<para>
Um zu ermitteln ob ein Helfer im Helfer Broker existiert, kann
<methodname>hasHelper($name)</methodname> verwendet werden, wobei
<varname>$name</varname> der Kurzname des Helfers ist (ohne das Präfix):
</para>
<programlisting language="php"><![CDATA[
// Prüft ob der 'redirector' Helfer im Broker registriert ist:
if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
echo 'Der Redirector Helfer ist registriert';
}
]]></programlisting>
<para>
Es gibt auch zwei statische Methoden für das bekommen von Helfern vom Helferbroker:
<methodname>getExistingHelper()</methodname> und
<methodname>getStaticHelper()</methodname>.
<methodname>getExistingHelper()</methodname> 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. <methodname>getStaticHelper()</methodname>
macht das selbe wie <methodname>getExistingHelper()</methodname>, wird aber versuchen
den Helfer zu initiieren wenn dieser davor noch nicht im Helferstack registriert wurde.
<methodname>getStaticHelper()</methodname> ist eine gute Wahl für das empfangen von
Helfern welche man konfigurieren will.
</para>
<para>
Beide Methoden nehmen ein einzelnes Argument, <varname>$name</varname>, welches der
Kurzname des Helfers (ohne den Präfix) ist.
</para>
<programlisting language="php"><![CDATA[
// 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');
}
]]></programlisting>
<para>
Schlußendlich, um einen registrierten Helfer vom Broker zu entfernen, kann
<methodname>removeHelper($name)</methodname> verwendet werden, wobei
<varname>$name</varname> der Kurzname des Helfers ist (ohne den Prefix):
</para>
<programlisting language="php"><![CDATA[
// Wenn vorhanden, entferne den 'redirector' Helfer vom Broker:
if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
Zend_Controller_Action_HelperBroker::removeHelper('redirector')
}
]]></programlisting>
</sect2>
<sect2 id="zend.controller.actionhelper.stockhelpers">
<title>Eingebaute Aktions Helfer</title>
<para>
Zend Framework enthält standardmäßig verschiedene Action Helfer:
<emphasis>AutoComplete</emphasis> für automatisierte Antworten für
<acronym>AJAX</acronym> Autovervollständigung; <emphasis>ContextSwitch</emphasis> und
<emphasis>AjaxContext</emphasis> für alternative Antwort Formate eigener Aktionen;
einen <emphasis>FlashMessenger</emphasis> für die Behandlung von Kurznachrichten;
<emphasis>Json</emphasis> für das verschlüsseln und senden von <acronym>JSON</acronym>
Antworten; einen <emphasis>Redirector</emphasis>, um verschiedene Implementationen, für
das Umleiten zu internen und externen Seiten, für die Anwendung bereitzustellen und
einen <emphasis>ViewRenderer</emphasis> um den Prozess des Setzens eines View Objekts
im Controller und dem Rendern von Views zu automatisieren.
</para>
<xi:include href="Zend_Controller-ActionHelpers-ActionStack.xml" />
<xi:include href="Zend_Controller-ActionHelpers-AutoComplete.xml" />
<xi:include href="Zend_Controller-ActionHelpers-ContextSwitch.xml" />
<xi:include href="Zend_Controller-ActionHelpers-FlashMessenger.xml" />
<xi:include href="Zend_Controller-ActionHelpers-Json.xml" />
<xi:include href="Zend_Controller-ActionHelpers-Redirector.xml" />
<xi:include href="Zend_Controller-ActionHelpers-ViewRenderer.xml" />
</sect2>
<sect2 id="zend.controller.actionhelper.writingyourown">
<title>Schreiben eigener Helfer</title>
<para>
Aktions Helfer erweitern <classname>Zend_Controller_Action_Helper_Abstract</classname>,
eine abstrakte Klasse die das Basisinterface bietet und vom Helfer Broker funktionell
benötigt wird. Diese inkludiert die folgenden Methoden:
</para>
<itemizedlist>
<listitem>
<para>
<methodname>setActionController()</methodname> wird verwendet um den aktuellen
Aktion Controller zu setzen.
</para>
</listitem>
<listitem>
<para>
<methodname>init()</methodname>, 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.
</para>
</listitem>
<listitem>
<para>
<methodname>preDispatch()</methodname>, wird vor der ausführenden Aktion
gestartet.
</para>
</listitem>
<listitem>
<para>
<methodname>postDispatch()</methodname> wird ausgeführt nachdem eine Aktion
fertig ist -- selbst wenn ein <methodname>preDispatch()</methodname> Plugin die
Aktion abgebrochen hat. Normalerweise nützlich für das Saubermachen.
</para>
</listitem>
<listitem>
<para>
<methodname>getRequest()</methodname> empfängt das aktuelle Anfrage Objekt.
</para>
</listitem>
<listitem>
<para>
<methodname>getResponse()</methodname> empfängt das aktuelle Antwort Objekt.
</para>
</listitem>
<listitem>
<para>
<methodname>getName()</methodname> 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
<classname>Zend_Controller_Action_Helper_Redirector</classname> heißt, wird
<emphasis>Redirector</emphasis> zurückgegeben; eine Klasse die
<emphasis>FooMessage</emphasis> heißt wird einfach sich selbst zurückgeben.
</para>
</listitem>
</itemizedlist>
<para>
Optional kann eine <methodname>direct()</methodname> 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 <link
linkend="zend.controller.actionhelpers.redirector">Umleiter</link>
<methodname>direct()</methodname> als einen Alias von <methodname>goto()</methodname>
und erlaubt damit die Verwendung des Helfers wie folgt:
</para>
<programlisting language="php"><![CDATA[
// Umleiten zu /blog/view/item/id/42
$this->_helper->redirector('item', 'view', 'blog', array('id' => 42));
]]></programlisting>
<para>
Intern schaut die <methodname>__call()</methodname> Methode des Helfer Brokers nach
einem Helfer der <emphasis>redirector</emphasis> heißt, prüft anschließend ob der
Helfer eine definierte <methodname>direct()</methodname> Methode besitzt und ruft diese
mit den angegebenen Argumenten auf.
</para>
<para>
Wenn eine eigene Helfer Klasse erstellt wurde, kann man zu Ihr wie im obigen Kapitel
beschrieben, Zugang erhalten.
</para>
</sect2>
</sect1>
|