| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.action">
- <title>Action Controller</title>
- <sect2 id="zend.controller.action.introduction">
- <title>Einführung</title>
- <para>
- <classname>Zend_Controller_Action</classname> ist eine abstrakte Klasse die verwendet
- werden kann um Aktion Controller zu implementieren die mit dem Front Controller
- verwendet werden können um eine WebSeite zu erstellen die auf dem Model-View-Controller
- (<acronym>MVC</acronym>) Pattern basiert.
- </para>
- <para>
- Um <classname>Zend_Controller_Action</classname> zu verwenden, muß von dieser in der
- eigenen aktuellen Aktions Controller Klasse ererbt werden (oder von dieser erben um eine
- eigene Basisklasse für Aktion Controller zu erstellen). Die grundsätzlichste Operation
- ist es von Ihr zu erben und Aktions Methoden zu erstellen die den verschiedenen Aktionen
- entsprechen die der Controller der eigenen Seite handhaben soll. Das Handhaben von
- Routen und Dispatchen des <classname>Zend_Controller</classname>'s wird automatisch
- jegliche Methode die in der eigenen Klasse auf 'Action' endet, als potentielle
- Controller Aktion herausfinden.
- </para>
- <para>
- Soll unsere Klasse, zum Beispiel, wie folgt definiert sein:
- </para>
- <programlisting language="php"><![CDATA[
- class FooController extends Zend_Controller_Action
- {
- public function barAction()
- {
- // mach irgendwas
- }
- public function bazAction()
- {
- // mach irgendwas
- }
- }
- ]]></programlisting>
- <para>
- Die obige <emphasis>FooController</emphasis> Klasse (Controller
- <emphasis>foo</emphasis>)´definiert zwei Aktionen, <emphasis>bar</emphasis> und
- <emphasis>baz</emphasis>.
- </para>
- <para>
- Da gibt es viel mehr das damit getan werden kann als das, wie eigene Initialisierungs
- Aktionen, Standardaktionen die aufgerufen werden wenn keine Aktion (oder eine ungültige
- Aktion) spezifiziert wird, pre- und post Dispatch Hooks, und eine Vielzahl von Helfer
- Methoden. Dieses Kapitel arbeitet als eine Übersicht der Aktion Controller
- Funktionalitäten.
- </para>
- <note>
- <title>Standardverhalten</title>
- <para>
- Standardmäßig aktiviert der <link linkend="zend.controller.front">Front
- Controller</link> den Aktion Helfer des <link
- linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>'s.
- Dieser Helfer übernimmt das Einfügen des View Objekts in den Controller, sowie das
- automatische Darstellen der View. Er kann innerhalb des Aktion Controllers mit einer
- der folgenden Methoden ausgeschaltet werden:
- </para>
- <programlisting language="php"><![CDATA[
- class FooController extends Zend_Controller_Action
- {
- public function init()
- {
- // Lokal nur bei diesem Controller; beeinflußt alle Aktionen die mit
- // init geladen wurden:
- $this->_helper->viewRenderer->setNoRender(true);
- // Global:
- $this->_helper->removeHelper('viewRenderer');
- // Auch global, muß aber in Verbindung mit der Lokalen Version sein um
- // für diesen Controller zu gelten:
- Zend_Controller_Front::getInstance()
- ->setParam('noViewRenderer', true);
- }
- }
- ]]></programlisting>
- <para>
- <methodname>initView()</methodname>, <methodname>getViewScript()</methodname>,
- <methodname>render()</methodname>, und <methodname>renderScript()</methodname>
- handeln alle in Vertretung zum <emphasis>ViewRenderer</emphasis> solange der Helfer
- nicht im Helfer Broker ist oder das <emphasis>noViewRenderer</emphasis> Flag nicht
- gesetzt wurde.
- </para>
- <para>
- Das rendern kann für individuelle Views auch ganz einfach ausgeschaltet werden durch
- Setzen des <emphasis>noRender</emphasis> Flags des
- <emphasis>ViewRenderer</emphasis>'s:
- </para>
- <programlisting language="php"><![CDATA[
- class FooController extends Zend_Controller_Action
- {
- public function barAction()
- {
- // Nur für diese Aktion das automatische Rendern ausschalten:
- $this->_helper->viewRenderer->setNoRender();
- }
- }
- ]]></programlisting>
- <para>
- Der primäre Grund um den <emphasis>ViewRenderer</emphasis> auszuschalten ist, wenn
- einfach kein View Objekt benötigt wird, oder wenn nicht über ein View Skript
- gerendert werden soll (zum Beispiel wenn ein Aktion Controller verwendet wird um
- Web Service Protokolle wie <acronym>SOAP</acronym>, <acronym>XML-RPC</acronym> oder
- <acronym>REST</acronym> anzubieten. In den meisten Fällen wird man den
- <emphasis>ViewRenderer</emphasis> nie global ausschalten müssen, nur selektiv
- innerhalb einzelner Controller oder Aktionen.
- </para>
- </note>
- </sect2>
- <sect2 id="zend.controller.action.initialization">
- <title>Objekt Initialisierung</title>
- <para>
- Wärend man immer den Konstruktor des Aktion Controller's überschreiben kann ist das
- nicht notwendig. <methodname>Zend_Controller_Action::__construct()</methodname> führt
- einige wichtige Aufgabe aus, wie das registrieren der Anfrage und Antwort Objekte, sowie
- alle eigene einleitenden Argumente die von Front Controller übergeben wurden. Wenn der
- Konstruktor überschrieben werden muß, muß sichergestellt sein das
- <methodname>parent::__construct($request, $response, $invokeArgs)</methodname>
- aufgerufen wird.
- </para>
- <para>
- Der bessere Weg als die Instanzierung zu ändern ist die Verwendung der
- <methodname>init()</methodname> Methode, welche nach der letzten Aufgabe von
- <methodname>__construct()</methodname> aufgerufen wird. Zum Beispiel wenn man sich zu
- einer Datenbank bei der Instanzierung verbinden will:
- </para>
- <programlisting language="php"><![CDATA[
- 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'
- ));
- }
- }
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.controller.action.prepostdispatch">
- <title>Pre- und Post-Dispatch Hooks</title>
- <para>
- <classname>Zend_Controller_Action</classname> spezifiziert zwei Methoden die aufgerufen
- werden können um eine angefragte Aktion fertigzustellen,
- <methodname>preDispatch()</methodname> und <methodname>postDispatch()</methodname>.
- Diese können auf viele Wege nützlich sein: zum Beispiel um Authentifizierungen und
- <acronym>ACL</acronym>'s prüfen bevor eine Aktion ausgeführt wird (durch Aufruf von
- <methodname>_forward()</methodname> in <methodname>preDispatch()</methodname> wird die
- Aktion übersprungen), oder erzeugte Inhalte in einem seitenweiten Template zu plazieren
- (<methodname>postDispatch()</methodname>).
- </para>
- <note>
- <title>Verwendung von of init() vs. preDispatch()</title>
- <para>
- In der <link linkend="zend.controller.action.initialization">vorigen Sektion</link>
- haben wir die <methodname>init()</methodname> Methode eingeführt, und in dieser
- Sektion die <methodname>preDispatch()</methodname> Methode. Was ist der Unterschied
- zwischen Ihnen, und welche Aktionen kann man in jeder von Ihnen durchführen?
- </para>
- <para>
- Die <methodname>init()</methodname> Methode ist primär dafür gedacht den Constructor
- zu erweitern. Typischerweise sollte der Constructor einfach den Status des Objekts
- setzen und keine weitere Logik ausführen. Das kann die Initialisierung von
- Ressourcen enthalten die im Kontroller verwendet werden (wie Modelle, Konfigurations
- Objekte, usw.), oder die Zuordnung von Werten die vom Front Controller, der
- Bootstrap oder einer Registry empfangenen wurden.
- </para>
- <para>
- Die <methodname>preDispatch()</methodname> Methode kann auch verwendet werden um den
- Status des Objekts oder der Umgebung (z.B. View, Action Helfer, usw.) zu setzen,
- aber sein primärer Zweck besteht darin Annahme darüber zu treffen, ob eine
- angefragte Aktion ausgeführt werden sollte oder nicht. Wenn nicht, dann sollte
- <methodname>_forward()</methodname> auf eine andere Aktion ausgeführt, oder eine
- Exception geworfen werden.
- </para>
- <para>
- Beachte: <methodname>_forward()</methodname> arbeitet aktuell nicht korrekt wenn es
- von <methodname>init()</methodname> ausgeführt wird, das die Formalisierung der
- Annahmen beider Methoden ist.
- </para>
- </note>
- </sect2>
- <sect2 id="zend.controller.action.accessors">
- <title>Zugriffe</title>
- <para>
- Eine Anzahl von Objekten und Variablen werden im Objekt registriert, und jede hat
- Zugriffsmethoden.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>Anfrage Objekt</emphasis>: <methodname>getRequest()</methodname> kann
- verwendet werden um das Anfrage Objekt zu erhalten das verwendet wurde um die
- Aktion aufzurufen.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Antwort Objekt</emphasis>: <methodname>getResponse()</methodname>
- kann verwendet werden um das Antwort Objekt zu erhalten das die letztendliche
- Antwort erzeugt. Einige typische Aufrufe können wie folgt aussehen:
- </para>
- <programlisting language="php"><![CDATA[
- $this->getResponse()->setHeader('Content-Type', 'text/xml');
- $this->getResponse()->appendBody($content);
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <emphasis>Aufgerufene Argumente</emphasis>: Der Front Controller kann Parameter
- in den Router, Dispatcher und Aktion Controller einfügen. Um diese zu erhalten
- kann <methodname>getInvokeArg($key)</methodname> verwendet werden; alternativ
- kann man die komplette Liste mit <methodname>getInvokeArgs()</methodname>
- erhalten.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Anfrage Parameter</emphasis>: Das Anfrage Objekt liefert die Anfrage
- Parameter, wie alle <constant>_GET</constant> oder <constant>_POST</constant>
- Parameter, oder Benutzer Parameter die in der Information des
- <acronym>URL</acronym> Pfades spezifiziert sind. Um diese zu erhalten kann
- <methodname>_getParam($key)</methodname> oder
- <methodname>_getAllParams()</methodname> verwendet werden. Es können auch
- Anfrage Parameter gesetzt werden indem <methodname>_setParam()</methodname>
- verwendet wird; das ist nützlich wenn an zusätzliche Aktionen weitergeleitet
- werden soll.
- </para>
- <para>
- Um zu Testen ob ein Parameter existiert (nützlich für logische Auswahlen), kann
- <methodname>_hasParam($key)</methodname> verwendet werden.
- </para>
- <note>
- <para>
- <methodname>_getParam()</methodname> kann ein optionales zweites Argument
- nehmen das einen Standardwert enthält der verwendet wird wenn der Parameter
- nicht gesetzt oder leer ist. Wenn er verwendet wird ist es nicht mehr
- notwendig <methodname>_hasParam()</methodname> vor dem Empfangen eines
- Wertes aufzurufen:
- </para>
- <programlisting language="php"><![CDATA[
- // Verwende des Standardwert 1 wenn id nicht gesetzt wurde
- $id = $this->_getParam('id', 1);
- // Statt:
- if ($this->_hasParam('id') {
- $id = $this->_getParam('id');
- } else {
- $id = 1;
- }
- ]]></programlisting>
- </note>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.controller.action.viewintegration">
- <title>View Integration</title>
- <note id="zend.controller.action.viewintegration.viewrenderer">
- <title>Standard View Integration über den ViewRenderer</title>
- <para>
- Der Inhalt dieses Kapitel ist nur gültig wenn man den <link
- linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
- explizit deaktiviert hat. Andernfalls kann man dieses kapitel ohne Bedenken
- überspringen.
- </para>
- </note>
- <para>
- <classname>Zend_Controller_Action</classname> bietet einen rudimentären und flexiblen
- Mechanismus für View Integration. Zwei Methoden machen das möglich,
- <methodname>initView()</methodname> und <methodname>render()</methodname>; die erste
- Methode lädt die öffentliche Eigenschaft <varname>$view</varname> träge, und die zweite
- rendert eine View basierend auf der aktuell angefragen Aktion, wobei die Verzeichnis
- Hirarchie verwendet wird um den Pfad des Skripts zu ermitteln.
- </para>
- <sect3 id="zend.controller.action.viewintegration.initview">
- <title>View Initialisierung</title>
- <para>
- <methodname>initView()</methodname> initialisiert das View Objekt.
- <methodname>render()</methodname> ruft <methodname>initView()</methodname> auf um
- das View Objekt zu erhalten, aber es kann jederzeit initialisiert werden;
- standardmäßig wird die <varname>$view</varname> Eigenschaft mit einem
- <classname>Zend_View</classname> Objekt bekanntgegeben, aber jede Klasse die
- <classname>Zend_View_Interface</classname> implementiert kann verwendet werden.
- Wenn <varname>$view</varname> bereits initialisiert wurde, wird diese Eigenschaft
- einfach zurückgegeben.
- </para>
- <para>
- Die Standardimplementation macht die folgenden Annahmen über die
- Verzeichnisstruktur:
- </para>
- <programlisting language="php"><![CDATA[
- applicationOrModule/
- controllers/
- IndexController.php
- views/
- scripts/
- index/
- index.phtml
- helpers/
- filters/
- ]]></programlisting>
- <para>
- In anderen Worten, wird angenommen das View Skripte im
- <filename>/views/scripts/</filename> Unterverzeichnis sind, und das
- <filename>/views/</filename> Unterverzeichnis weitere Funktionalitäten enthält
- (helpers, filters). Wenn der Name und der Pfad des View Skripts ermittelt wird,
- wird das <filename>/views/scripts/</filename> Verzeichnis als Basispfad verwendet,
- mit einem Verzeichnis das nach dem individuellen Controller benannt ist und eine
- Hierarchie von View Skripten bietet.
- </para>
- </sect3>
- <sect3 id="zend.controller.action.viewintegration.render">
- <title>Rendern von Views</title>
- <para>
- <methodname>render()</methodname> hat die folgende Signatur:
- </para>
- <programlisting language="php"><![CDATA[
- string render(string $action = null,
- string $name = null,
- bool $noController = false);
- ]]></programlisting>
- <para>
- <methodname>render()</methodname> rendert ein View Skript. Wenn keine Argumente
- übergeben werden, wird angenommen dass das angefragte Skript
- <filename>[controller]/[action].phtml</filename> ist (wobei
- <filename>.phtml</filename> der Wert der <varname>$viewSuffix</varname> Eigenschaft
- ist). Wenn ein Wert für <varname>$action</varname> angegeben wird, wird das
- Template im <filename>/[controller]/</filename> Unterverzeichnis gerendert. Um die
- Verwendung des <filename>/[controller]/</filename> Unterverzeichnisses zu
- überschreiben kann ein <constant>TRUE</constant> Wert für
- <varname>$noController</varname> übergeben werden. Zuletzt werden
- templates in das Antwort Objekt gerendert; wenn zu einem spezifischen
- <link linkend="zend.controller.response.namedsegments">benannten Segment</link> im
- Antwort Objekt dargestellt werden soll, kann ein Wert an <varname>$name</varname>
- übergeben werden.
- </para>
- <note>
- <para>
- Da Controller- und Aktionsnamen Wort Begrenzer Zeichen enthalten können wie
- z.B. '_', '.' und '-', normalisiert <methodname>render()</methodname> diese
- zu '-' wenn der Skript Name eruiert wird. Intern werden die Wort- und
- Pfadbegrenzer vom Dispatcher verwendet um die Normalisierung durchzuführen.
- Deshalb wird eine Anfrage auf <filename>/foo.bar/baz-bat</filename> das Skript
- auf <filename>foo-bar/baz-bat.phtml</filename> rendern. Wenn eine
- Aktionsmethode camelCase Zeichen enthält, muß beachtet werden das diese in '-'
- seperierten Wörter umgewandelt werden wenn der Dateiname des View Skripts
- eruiert wird.
- </para>
- </note>
- <para>
- Einige Beispiele:
- </para>
- <programlisting language="php"><![CDATA[
- class MyController extends Zend_Controller_Action
- {
- public function fooAction()
- {
- // Rendert my/foo.phtml
- $this->render();
- // Rendert my/bar.phtml
- $this->render('bar');
- // Rendert baz.phtml
- $this->render('baz', null, true);
- // Rendert my/login.phtml in das 'form' Segment des Antwort Objektes
- $this->render('login', 'form');
- // Rendert site.phtml in das 'page' Segmetn des Antwort Objektes;
- // verwendet nicht das 'my/' Unterverzeichnis
- $this->render('site', 'page', true);
- }
- public function bazBatAction()
- {
- // Rendert my/baz-bat.phtml
- $this->render();
- }
- }
- ]]></programlisting>
- </sect3>
- </sect2>
- <sect2 id="zend.controller.action.utilmethods">
- <title>Nützliche Methoden</title>
- <para>
- Neben den Zugriffs- und View Integrationsmethoden, hat
- <classname>Zend_Controller_Action</classname> verschiedene nützliche Methoden für die
- Durchführung üblicher Aufgaben von innerhalb der Aktionsmethoden (oder vom
- Pre- und Post-Dispatch).
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>_forward($action, $controller = null, $module = null, array $params
- = null)</methodname>: führt eine weitere Aktion aus. Wenn in
- <methodname>preDispatch()</methodname> aufgerufen, wird die aktuelle
- aufgerufene Aktion übersprungen zugunsten der neuen. Andererseits, wenn die
- aktuelle Aktion durchgeführt wurde, wird die Aktion die in
- <methodname>_forward()</methodname> angefragt wird, ausgeführt.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>_redirect($url, array $options = array())</methodname>: leitet zu
- einem anderen Ort um. Diese Methode nimmt eine <acronym>URL</acronym> und ein
- optionales Set von Optionen. Standardmäßig führt Sie eine
- <acronym>HTTP</acronym> 302 Umleitung durch.
- </para>
- <para>
- Diese Optionen können ein oder mehrere der folgenden enthalten:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>exit:</emphasis> ob oder ob nicht sofort ausgestiegen werden
- soll. Wenn angefragt, wird jede offene Session sauber beendet und die
- Umleitung durchgeführt.
- </para>
- <para>
- Diese Option kann global im Controller gesetzt werden indem der
- <methodname>setRedirectExit()</methodname> Zugriff verwendet wird.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>prependBase:</emphasis> ob oder ob nicht, die im Anfrage
- Objekt registrierte Basis <acronym>URL</acronym>, dem angebotenen
- <acronym>URL</acronym> angehängt wird.
- </para>
- <para>
- Diese Option kann gobal im Controller gesetzt werden indem der
- <methodname>setRedirectPrependBase()</methodname> Zugriff verwendet
- wird.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>code:</emphasis> welche <acronym>HTTP</acronym> Code für die
- Umleitung verwendet wird. Standardmäßig wird ein
- <acronym>HTTP</acronym> 302 erstellt; jeder Code zwischen 301 und 306
- kann verwendet werden.
- </para>
- <para>
- Diese Option kann global im Controller gesetzt werden indem der
- <methodname>setRedirectCode()</methodname> Zugriff verwendet wird.
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.controller.action.subclassing">
- <title>Erweitern des Aktion Controllers</title>
- <para>
- Vom Design her muß <classname>Zend_Controller_Action</classname> erweitert werden um
- einen Aktion Controller zu erstellen. Als Minimum, muß eine Aktions Methode definiert
- werden die der Controller aufrufen kann.
- </para>
- <para>
- Neben dem erstellen von nützlichen Funktionalitäten für Web Anwendungen, wird auch die
- Notwendigkeit bestehen das vom gleichen Setup oder von den nützlichen Funktionen vieles
- in verschiedenen Controllern wiederholt wird; wenn dem so ist, löst die Erstellung einer
- gemeinsamen Basis Controller Klasse die <classname>Zend_Controller_Action</classname>
- erweitert zu einer Lösung dieser Redundanz.
- </para>
- <example id="zend.controller.action.subclassing.example-call">
- <title>Behandeln nicht-vorhandener Aktionen</title>
- <para>
- Wenn eine Anfrage an einen Controller durchgeführt wird die eine undefinierte
- Aktions Methode enthält, kommt
- <methodname>Zend_Controller_Action::__call()</methodname> zum Einsatz.
- <methodname>__call()</methodname> ist natürlich <acronym>PHP</acronym>'s magische
- Methode für das Überladen von Methoden.
- </para>
- <para>
- Standardmäßig wirft diese Methode eine
- <classname>Zend_Controller_Action_Exception</classname> die anzeigt das die
- angefragte Aktion nicht im Controller gefunden werden konnte. Wenn die angefragte
- Methode mit 'Action' endet, wird angenommen das eine Aktion angefragt wurde die
- nicht existiert; solch ein Fehler resultiert in einer Ausnahme mit dem Code 404.
- Alle anderen Methoden resultieren in einer Ausnahme mit dem Code 500. Das erlaubt
- die einfache Differenzierung zwischen Seiten die nicht gefunden wurden und
- Anwendungsfehlern in der Fehlerbehandlung.
- </para>
- <para>
- Diese Funktionalität sollte überschrieben werden wenn eine andere Operation
- ausgeführt werden soll. Wenn zum Beispiel eine Fehlermeldung angezeigt werden soll
- kann etwas die das folgende geschrieben werden:
- </para>
- <programlisting language="php"><![CDATA[
- class MyController extends Zend_Controller_Action
- {
- public function __call($method, $args)
- {
- if ('Action' == substr($method, -6)) {
- // Wenn die Aktionsmethode nicht gefunden wurde,
- // das error Template darstellen
- return $this->render('error');
- }
- // Alle anderen Methoden werfen eine Ausnahme
- throw new Exception('Invalid method "'
- . $method
- . '" called',
- 500);
- }
- }
- ]]></programlisting>
- <para>
- Eine andere Möglichkeit ist, dass man zu einer standardmäßigen Controller Seiten
- weiterleiten will:
- </para>
- <programlisting language="php"><![CDATA[
- class MyController extends Zend_Controller_Action
- {
- public function indexAction()
- {
- $this->render();
- }
- public function __call($method, $args)
- {
- if ('Action' == substr($method, -6)) {
- // Wenn die Aktionsmethode nicht gefunden wurde,
- // leite zur Index Aktion weiter
- return $this->_forward('index');
- }
- // Alle anderen Methoden werden eine Ausnahme
- throw new Exception('Invalid method "'
- . $method
- . '" called',
- 500);
- }
- }
- ]]></programlisting>
- </example>
- <para>
- Neben dem überschreiben von <methodname>__call()</methodname>, kann jede der
- Initialisierungs-, Utility-, Zugriffs-, View- und Dispatch-Hook Methoden die vorher in
- diesem Kapitel beschrieben wurden, überschrieben werden um eigene Controller
- anzupassen. Wenn man, als Beispiel, die View Objekte in der Registry speichert, kann es
- gewünscht sein die <methodname>initView()</methodname> Methode mit Code zu Ändern der
- das folgende zusammensetzt:
- </para>
- <programlisting language="php"><![CDATA[
- abstract class My_Base_Controller extends Zend_Controller_Action
- {
- public function initView()
- {
- if (null === $this->view) {
- if (Zend_Registry::isRegistered('view')) {
- $this->view = Zend_Registry::get('view');
- } else {
- $this->view = new Zend_View();
- $this->view->setBasePath(dirname(__FILE__) . '/../views');
- }
- }
- return $this->view;
- }
- }
- ]]></programlisting>
- <para>
- Hoffentlich kann man anhand der Informationen in diesem Kapitel ersehen wie flexibel
- diese spezielle Komponente ist und wie Sie in eigene Anwendungen oder den
- Notwendigkeiten von Seiten damit erfüllt werden kann.
- </para>
- </sect2>
- </sect1>
|