Zend_Controller-ActionController.xml 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15617 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.action">
  5. <title>Action Kontroller</title>
  6. <sect2 id="zend.controller.action.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. <classname>Zend_Controller_Action</classname> ist eine abstrakte Klasse die verwendet
  10. werden kann um Aktion Kontroller zu implementieren die mit dem Front Kontroller
  11. verwendet werden können um eine WebSeite zu erstellen die auf dem Model-View-Controller
  12. (MVC) Pattern basiert.
  13. </para>
  14. <para>
  15. Um <classname>Zend_Controller_Action</classname> zu verwenden, muß von dieser in der
  16. eigenen aktuellen Aktions Kontroller Klasse ererbt werden (oder von dieser erben um eine
  17. eigene Basisklasse für Aktion Kontroller zu erstellen). Die grundsätzlichste Operation
  18. ist es von Ihr zu erben und Aktions Methoden zu erstellen die den verschiedenen Aktionen
  19. entsprechen die der Kontroller der eigenen Seite handhaben soll. Das Handhaben von
  20. Routen und Dispatchen des <classname>Zend_Controller</classname>'s wird automatisch
  21. jegliche Methode die in der eigenen Klasse auf 'Action' endet, als potentielle
  22. Kontroller Aktion herausfinden.
  23. </para>
  24. <para>
  25. Soll unsere Klasse, zum Beispiel, wie folgt definiert sein:
  26. </para>
  27. <programlisting language="php"><![CDATA[
  28. class FooController extends Zend_Controller_Action
  29. {
  30. public function barAction()
  31. {
  32. // mach irgendwas
  33. }
  34. public function bazAction()
  35. {
  36. // mach irgendwas
  37. }
  38. }
  39. ]]></programlisting>
  40. <para>
  41. Die obige <code>FooController</code> Klasse (Kontroller <code>foo</code>) definiert zwei
  42. Aktionen, <code>bar</code> und <code>baz</code>.
  43. </para>
  44. <para>
  45. Da gibt es viel mehr das damit getan werden kann als das, wie eigene Initialisierungs
  46. Aktionen, Standardaktionen die aufgerufen werden wenn keine Aktion (oder eine ungültige
  47. Aktion) spezifiziert wird, pre- und post Dispatch Hooks, und eine Vielzahl von Helfer
  48. Methoden. Dieses Kapitel arbeitet als eine Übersicht der Aktion Kontroller
  49. Funktionalitäten.
  50. </para>
  51. <note>
  52. <title>Standardverhalten</title>
  53. <para>
  54. Standardmäßig aktiviert der <link linkend="zend.controller.front">Front
  55. Kontroller</link> den Aktion Helfer des <link
  56. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>'s.
  57. Dieser Helfer übernimmt das Einfügen des View Objekts in den Kontroller, sowie das
  58. automatische Darstellen der View. Er kann innerhalb des Aktion Kontrollers mit einer
  59. der folgenden Methoden ausgeschaltet werden:
  60. </para>
  61. <programlisting language="php"><![CDATA[
  62. class FooController extends Zend_Controller_Action
  63. {
  64. public function init()
  65. {
  66. // Lokal nur bei diesem Kontroller; beeinflußt alle Aktionen die mit
  67. // init geladen wurden:
  68. $this->_helper->viewRenderer->setNoRender(true);
  69. // Global:
  70. $this->_helper->removeHelper('viewRenderer');
  71. // Auch global, muß aber in Verbindung mit der Lokalen Version sein um
  72. // für diesen Kontroller zu gelten:
  73. Zend_Controller_Front::getInstance()
  74. ->setParam('noViewRenderer', true);
  75. }
  76. }
  77. ]]></programlisting>
  78. <para>
  79. <code>initView()</code>, <code>getViewScript()</code>, <code>render()</code>, und
  80. <code>renderScript()</code> handeln alle in Vertretung zum <code>ViewRenderer</code>
  81. solange der Helfer nicht im Helfer Broker ist oder das <code>noViewRenderer</code>
  82. Flag nicht gesetzt wurde.
  83. </para>
  84. <para>
  85. Das rendern kann für individuelle Views auch ganz einfach ausgeschaltet werden durch
  86. Setzen des <code>noRender</code> Flags des <code>ViewRenderer</code>'s:
  87. </para>
  88. <programlisting language="php"><![CDATA[
  89. class FooController extends Zend_Controller_Action
  90. {
  91. public function barAction()
  92. {
  93. // Nur für diese Aktion das automatische Rendern ausschalten:
  94. $this->_helper->viewRenderer->setNoRender();
  95. }
  96. }
  97. ]]></programlisting>
  98. <para>
  99. Der primäre Grund um den <code>ViewRenderer</code> auszuschalten ist, wenn einfach
  100. kein View Objekt benötigt wird, oder wenn nicht über ein View Skript gerendert
  101. werden soll (zum Beispiel wenn ein Aktion Kontroller verwendet wird um Web Service
  102. Protokolle wie SOAP, XML-RPC oder REST anzubieten. In den meisten Fällen wird man
  103. den <code>ViewRenderer</code> nie global ausschalten müssen, nur selektiv innerhalb
  104. einzelner Kontroller oder Aktionen.
  105. </para>
  106. </note>
  107. </sect2>
  108. <sect2 id="zend.controller.action.initialization">
  109. <title>Objekt Initialisierung</title>
  110. <para>
  111. Wärend man immer den Konstruktor des Aktion Kontroller's überschreiben kann ist das
  112. nicht notwendig. <classname>Zend_Controller_Action::__construct()</classname> führt
  113. einige wichtige Aufgabe aus, wie das registrieren der Anfrage und Antwort Objekte, sowie
  114. alle eigene einleitenden Argumente die von Front Kontroller übergeben wurden. Wenn der
  115. Konstruktor überschrieben werden muß, muß sichergestellt sein das
  116. <code>parent::__construct($request, $response, $invokeArgs)</code> aufgerufen wird.
  117. </para>
  118. <para>
  119. Der bessere Weg als die Instanzierung zu ändern ist die Verwendung der
  120. <code>init()</code> Methode, welche nach der letzten Aufgabe von
  121. <code>__construct()</code> aufgerufen wird. Zum Beispiel wenn man sich zu einer
  122. Datenbank bei der Instanzierung verbinden will:
  123. </para>
  124. <programlisting language="php"><![CDATA[
  125. class FooController extends Zend_Controller_Action
  126. {
  127. public function init()
  128. {
  129. $this->db = Zend_Db::factory('Pdo_Mysql', array(
  130. 'host' => 'myhost',
  131. 'username' => 'user',
  132. 'password' => 'XXXXXXX',
  133. 'dbname' => 'website'
  134. ));
  135. }
  136. }
  137. ]]></programlisting>
  138. </sect2>
  139. <sect2 id="zend.controller.action.prepostdispatch">
  140. <title>Pre- und Post-Dispatch Hooks</title>
  141. <para>
  142. <classname>Zend_Controller_Action</classname> spezifiziert zwei Methoden die aufgerufen
  143. werden können um eine angefragte Aktion fertigzustellen, <code>preDispatch()</code> und
  144. <code>postDispatch()</code>. Diese können auf viele Wege nützlich sein: zum Beispiel um
  145. Authentifizierungen und ACLs prüfen bevor eine Aktion ausgeführt wird (durch Aufruf von
  146. <code>_forward()</code> in <code>preDispatch()</code> wird die Aktion übersprungen),
  147. oder erzeugte Inhalte in einem seitenweiten Template zu plazieren
  148. (<code>postDispatch()</code>).
  149. </para>
  150. </sect2>
  151. <sect2 id="zend.controller.action.accessors">
  152. <title>Zugriffe</title>
  153. <para>
  154. Eine Anzahl von Objekten und Variablen werden im Objekt registriert, und jede hat
  155. Zugriffsmethoden.
  156. </para>
  157. <itemizedlist>
  158. <listitem><para>
  159. <emphasis>Anfrage Objekt</emphasis>: <code>getRequest()</code> kann verwendet werden
  160. um das Anfrage Objekt zu erhalten das verwendet wurde um die Aktion aufzurufen.
  161. </para></listitem>
  162. <listitem>
  163. <para>
  164. <emphasis>Antwort Objekt</emphasis>: <code>getResponse()</code> kann verwendet
  165. werden um das Antwort Objekt zu erhalten das die letztendliche Antwort erzeugt.
  166. Einige typische Aufrufe können wie folgt aussehen:
  167. </para>
  168. <programlisting language="php"><![CDATA[
  169. $this->getResponse()->setHeader('Content-Type', 'text/xml');
  170. $this->getResponse()->appendBody($content);
  171. ]]></programlisting>
  172. </listitem>
  173. <listitem>
  174. <para>
  175. <emphasis>Aufgerufene Argumente</emphasis>: Der Front Kontroller kann Parameter
  176. in den Router, Dispatcher und Aktion Kontroller einfügen. Um diese zu erhalten
  177. kann <code>getInvokeArg($key)</code> verwendet werden; alternativ kann man die
  178. komplette Liste mit <code>getInvokeArgs()</code> erhalten.
  179. </para>
  180. </listitem>
  181. <listitem>
  182. <para>
  183. <emphasis>Anfrage Parameter</emphasis>: Das Anfrage Objekt liefert die Anfrage
  184. Parameter, wie alle _GET oder _POST Parameter, oder Benutzer Parameter die in
  185. der Information des URL Pfades spezifiziert sind. Um diese zu erhalten kann
  186. <code>_getParam($key)</code> oder <code>_getAllParams()</code> verwendet werden.
  187. Es können auch Anfrage Parameter gesetzt werden indem <code>_setParam()</code>
  188. verwendet wird; das ist nützlich wenn an zusätzliche Aktionen weitergeleitet
  189. werden soll.
  190. </para>
  191. <para>
  192. Um zu Testen ob ein Parameter existiert (nützlich für logische Auswahlen), kann
  193. <code>_hasParam($key)</code> verwendet werden.
  194. </para>
  195. <note>
  196. <para>
  197. <code>_getParam()</code> kann ein optionales zweites Argument nehmen das
  198. einen Standardwert enthält der verwendet wird wenn der Parameter nicht
  199. gesetzt oder leer ist. Wenn er verwendet wird ist es nicht mehr notwendig
  200. <code>_hasParam()</code> vor dem Empfangen eines Wertes aufzurufen:
  201. </para>
  202. <programlisting language="php"><![CDATA[
  203. // Verwende des Standardwert 1 wenn id nicht gesetzt wurde
  204. $id = $this->_getParam('id', 1);
  205. // Statt:
  206. if ($this->_hasParam('id') {
  207. $id = $this->_getParam('id');
  208. } else {
  209. $id = 1;
  210. }
  211. ]]></programlisting>
  212. </note>
  213. </listitem>
  214. </itemizedlist>
  215. </sect2>
  216. <sect2 id="zend.controller.action.viewintegration">
  217. <title>View Integration</title>
  218. <note id="zend.controller.action.viewintegration.viewrenderer">
  219. <title>Standard View Integration über den ViewRenderer</title>
  220. <para>
  221. Der Inhalt dieses Kapitel ist nur gültig wenn man den <link
  222. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  223. explizit deaktiviert hat. Andernfalls kann man dieses kapitel ohne Bedenken
  224. überspringen.
  225. </para>
  226. </note>
  227. <para>
  228. <classname>Zend_Controller_Action</classname> bietet einen rudimentären und flexiblen
  229. Mechanismus für View Integration. Zwei Methoden machen das möglich,
  230. <code>initView()</code> und <code>render()</code>; die erste Methode lädt die
  231. öffentliche Eigenschaft <code>$view</code> träge, und die zweite rendert eine View
  232. basierend auf der aktuell angefragen Aktion, wobei die Verzeichnis Hirarchie verwendet
  233. wird um den Pfad des Skripts zu ermitteln.
  234. </para>
  235. <sect3 id="zend.controller.action.viewintegration.initview">
  236. <title>View Initialisierung</title>
  237. <para>
  238. <code>initView()</code> initialisiert das View Objekt. <code>render()</code> ruft
  239. <code>initView()</code> auf um das View Objekt zu erhalten, aber es kann jederzeit
  240. initialisiert werden; standardmäßig wird die <code>$view</code> Eigenschaft mit
  241. einem <classname>Zend_View</classname> Objekt bekanntgegeben, aber jede Klasse die
  242. <classname>Zend_View_Interface</classname> implementiert kann verwendet werden. Wenn
  243. <code>$view</code> bereits initialisiert wurde, wird diese Eigenschaft einfach
  244. zurückgegeben.
  245. </para>
  246. <para>
  247. Die Standardimplementation macht die folgenden Annahmen über die
  248. Verzeichnisstruktur:
  249. </para>
  250. <programlisting language="php"><![CDATA[
  251. applicationOrModule/
  252. controllers/
  253. IndexController.php
  254. views/
  255. scripts/
  256. index/
  257. index.phtml
  258. helpers/
  259. filters/
  260. ]]></programlisting>
  261. <para>
  262. In anderen Worten, wird angenommen das View Skripte im <code>views/scripts/</code>
  263. Unterverzeichnis sind, und das <code>views</code> Unterverzeichnis weitere
  264. Funktionalitäten enthält (helpers, filters). Wenn der Name und der Pfad des View
  265. Skripts ermittelt wird, wird das <code>views/scripts/</code> Verzeichnis als
  266. Basispfad verwendet, mit einem Verzeichnis das nach dem individuellen Kontroller
  267. benannt ist und eine Hierarchie von View Skripten bietet.
  268. </para>
  269. </sect3>
  270. <sect3 id="zend.controller.action.viewintegration.render">
  271. <title>Rendern von Views</title>
  272. <para>
  273. <code>render()</code> hat die folgende Signatur:
  274. </para>
  275. <programlisting language="php"><![CDATA[
  276. string render(string $action = null,
  277. string $name = null,
  278. bool $noController = false);
  279. ]]></programlisting>
  280. <para>
  281. <code>render()</code> rendert ein View Skript. Wenn keine Argumente übergeben
  282. werden, wird angenommen das das angefragte Skript
  283. <code>[controller]/[action].phtml</code> ist (wobei <code>.phtml</code> der Wert der
  284. <code>$viewSuffix</code> Eigenschaft ist). Wenn ein Wert für <code>$action</code>
  285. angegeben wird, wird das Template im <code>[controller]</code> Unterverzeichnis
  286. gerendert. Um die Verwendung des <code>[controller]</code> Unterverzeichnisses zu
  287. überschreiben kann ein true Wert für <code>$noController</code> übergeben werden.
  288. Zuletzt werden templates in das Antwort Objekt gerendert; wenn zu einem spezifischen
  289. <link linkend="zend.controller.response.namedsegments">benannten Segment</link> im
  290. Antwort Objekt dargestellt werden soll, kann ein Wert an <code>$name</code>
  291. übergeben werden.
  292. </para>
  293. <note><para>
  294. Da Kontroller- und Aktionsnamen Wort Begrenzer Zeichen enthalten können wie z.B.
  295. '_', '.' und '-', normalisiert <code>render()</code> diese zu '-' wenn der
  296. Skript Name eruiert wird. Intern werden die Wort- und Pfadbegrenzer vom
  297. Dispatcher verwendet um die Normalisierung durchzuführen. Deshalb wird eine
  298. Anfrage auf <code>/foo.bar/baz-bat</code> das Skript auf
  299. <code>foo-bar/baz-bat.phtml</code> rendern. Wenn eine Aktionsmethode camelCase
  300. Zeichen enthält, muß beachtet werden das diese in '-' seperierten Wörter
  301. umgewandelt werden wenn der Dateiname des View Skripts eruiert wird.
  302. </para></note>
  303. <para>
  304. Einige Beispiele:
  305. </para>
  306. <programlisting language="php"><![CDATA[
  307. class MyController extends Zend_Controller_Action
  308. {
  309. public function fooAction()
  310. {
  311. // Rendert my/foo.phtml
  312. $this->render();
  313. // Rendert my/bar.phtml
  314. $this->render('bar');
  315. // Rendert baz.phtml
  316. $this->render('baz', null, true);
  317. // Rendert my/login.phtml in das 'form' Segment des Antwort Objektes
  318. $this->render('login', 'form');
  319. // Rendert site.phtml in das 'page' Segmetn des Antwort Objektes;
  320. // verwendet nicht das 'my/' Unterverzeichnis
  321. $this->render('site', 'page', true);
  322. }
  323. public function bazBatAction()
  324. {
  325. // Rendert my/baz-bat.phtml
  326. $this->render();
  327. }
  328. }
  329. ]]></programlisting>
  330. </sect3>
  331. </sect2>
  332. <sect2 id="zend.controller.action.utilmethods">
  333. <title>Nützliche Methoden</title>
  334. <para>
  335. Neben den Zugriffs- und View Integrationsmethoden, hat
  336. <classname>Zend_Controller_Action</classname> verschiedene nützliche Methoden für die
  337. Durchführung üblicher Aufgaben von innerhalb der Aktionsmethoden (oder vom
  338. Pre-/Post-Dispatch).
  339. </para>
  340. <itemizedlist>
  341. <listitem>
  342. <para>
  343. <code>_forward($action, $controller = null, $module = null, array $params =
  344. null)</code>: führt eine weitere Aktion aus. Wenn in <code>preDispatch()</code>
  345. aufgerufen, wird die aktuelle aufgerufene Aktion übersprungen zugunsten der
  346. neuen. Andererseits, wenn die aktuelle Aktion durchgeführt wurde, wird die
  347. Aktion die in _forward() angefragt wird, ausgeführt.
  348. </para>
  349. </listitem>
  350. <listitem>
  351. <para>
  352. <code>_redirect($url, array $options = array())</code>: leitet zu einem anderen
  353. Ort um. Diese Methode nimmt eine URL und ein optionales Set von Optionen.
  354. Standardmäßig führt Sie eine HTTP 302 Umleitung durch.
  355. </para>
  356. <para>
  357. Diese Optionen können ein oder mehrere der folgenden enthalten:
  358. </para>
  359. <itemizedlist>
  360. <listitem>
  361. <para>
  362. <emphasis>exit:</emphasis> ob oder ob nicht sofort ausgestiegen werden
  363. soll. Wenn angefragt, wird jede offene Session sauber beendet und die
  364. Umleitung durchgeführt.
  365. </para>
  366. <para>
  367. Diese Option kann global im Kontroller gesetzt werden indem der
  368. <code>setRedirectExit()</code> Zugriff verwendet wird.
  369. </para>
  370. </listitem>
  371. <listitem>
  372. <para>
  373. <emphasis>prependBase:</emphasis> ob oder ob nicht, die im Anfrage
  374. Objekt registrierte Basis URL, dem angebotenen URL angehängt wird.
  375. </para>
  376. <para>
  377. Diese Option kann gobal im Kontroller gesetzt werden indem der
  378. <code>setRedirectPrependBase()</code> Zugriff verwendet wird.
  379. </para>
  380. </listitem>
  381. <listitem>
  382. <para>
  383. <emphasis>code:</emphasis> welche HTTP Code für die Umleitung verwendet
  384. wird. Standardmäßig wird ein HTTP 302 erstellt; jeder Code zwischen 301
  385. und 306 kann verwendet werden.
  386. </para>
  387. <para>
  388. Diese Option kann global im Kontroller gesetzt werden indem der
  389. <code>setRedirectCode()</code> Zugriff verwendet wird.
  390. </para>
  391. </listitem>
  392. </itemizedlist>
  393. </listitem>
  394. </itemizedlist>
  395. </sect2>
  396. <sect2 id="zend.controller.action.subclassing">
  397. <title>Erweitern des Aktion Kontrollers</title>
  398. <para>
  399. Vom Design her muß <classname>Zend_Controller_Action</classname> erweitert werden um
  400. einen Aktion Kontroller zu erstellen. Als Minimum, muß eine Aktions Methode definiert
  401. werden die der Kontroller aufrufen kann.
  402. </para>
  403. <para>
  404. Neben dem erstellen von nützlichen Funktionalitäten für Web Anwendungen, wird auch die
  405. Notwendigkeit bestehen das vom gleichen Setup oder von den nützlichen Funktionen vieles
  406. in verschiedenen Kontrollern wiederholt wird; wenn dem so ist, löst die Erstellung einer
  407. gemeinsamen Basis Kontroller Klasse die <classname>Zend_Controller_Action</classname>
  408. erweitert zu einer Lösung dieser Redundanz.
  409. </para>
  410. <example id="zend.controller.action.subclassing.example-call">
  411. <title>Behandeln nicht-vorhandener Aktionen</title>
  412. <para>
  413. Wenn eine Anfrage an einen Kontroller durchgeführt wird die eine undefinierte
  414. Aktions Methode enthält, kommt
  415. <classname>Zend_Controller_Action::__call()</classname> zum Einsatz.
  416. <code>__call()</code> ist natürlich PHP's magische Methode für das Überladen von
  417. Methoden.
  418. </para>
  419. <para>
  420. Standardmäßig wirft diese Methode eine
  421. <classname>Zend_Controller_Action_Exception</classname> die anzeigt das die
  422. angefragte Aktion nicht im Kontroller gefunden werden konnte. Wenn die angefragte
  423. Methode mit 'Action' endet, wird angenommen das eine Aktion angefragt wurde die
  424. nicht existiert; solch ein Fehler resultiert in einer Ausnahme mit dem Code 404.
  425. Alle anderen Methoden resultieren in einer Ausnahme mit dem Code 500. Das erlaubt
  426. die einfache Differenzierung zwischen Seiten die nicht gefunden wurden und
  427. Anwendungsfehlern in der Fehlerbehandlung.
  428. </para>
  429. <para>
  430. Diese Funktionalität sollte überschrieben werden wenn eine andere Operation
  431. ausgeführt werden soll. Wenn zum Beispiel eine Fehlermeldung angezeigt werden soll
  432. kann etwas die das folgende geschrieben werden:
  433. </para>
  434. <programlisting language="php"><![CDATA[
  435. class MyController extends Zend_Controller_Action
  436. {
  437. public function __call($method, $args)
  438. {
  439. if ('Action' == substr($method, -6)) {
  440. // Wenn die Aktionsmethode nicht gefunden wurde,
  441. // das error Template darstellen
  442. return $this->render('error');
  443. }
  444. // Alle anderen Methoden werfen eine Ausnahme
  445. throw new Exception('Invalid method "'
  446. . $method
  447. . '" called',
  448. 500);
  449. }
  450. }
  451. ]]></programlisting>
  452. <para>
  453. Eine andere Möglichkeit ist, dass man zu einer standardmäßigen Kontroller Seiten
  454. weiterleiten will:
  455. </para>
  456. <programlisting language="php"><![CDATA[
  457. class MyController extends Zend_Controller_Action
  458. {
  459. public function indexAction()
  460. {
  461. $this->render();
  462. }
  463. public function __call($method, $args)
  464. {
  465. if ('Action' == substr($method, -6)) {
  466. // Wenn die Aktionsmethode nicht gefunden wurde,
  467. // leite zur Index Aktion weiter
  468. return $this->_forward('index');
  469. }
  470. // Alle anderen Methoden werden eine Ausnahme
  471. throw new Exception('Invalid method "'
  472. . $method
  473. . '" called',
  474. 500);
  475. }
  476. }
  477. ]]></programlisting>
  478. </example>
  479. <para>
  480. Neben dem überschreiben von <code>__call()</code>, kann jede der Initialisierungs-,
  481. Utility-, Zugriffs-, View- und Dispatch-Hook Methoden die vorher in diesem Kapitel
  482. beschrieben wurden, überschrieben werden um eigene Kontroller anzupassen. Wenn man, als
  483. Beispiel, die View Objekte in der Registry speichert, kann es gewünscht sein die
  484. <code>initView()</code> Methode mit Code zu Ändern der das folgende zusammensetzt:
  485. </para>
  486. <programlisting language="php"><![CDATA[
  487. abstract class My_Base_Controller extends Zend_Controller_Action
  488. {
  489. public function initView()
  490. {
  491. if (null === $this->view) {
  492. if (Zend_Registry::isRegistered('view')) {
  493. $this->view = Zend_Registry::get('view');
  494. } else {
  495. $this->view = new Zend_View();
  496. $this->view->setBasePath(dirname(__FILE__) . '/../views');
  497. }
  498. }
  499. return $this->view;
  500. }
  501. }
  502. ]]></programlisting>
  503. <para>
  504. Hoffentlich kann man anhand der Informationen in diesem Kapitel ersehen wie flexibel
  505. diese spezielle Komponente ist und wie Sie in eigene Anwendungen oder den
  506. Notwendigkeiten von Seiten damit erfüllt werden kann.
  507. </para>
  508. </sect2>
  509. </sect1>
  510. <!--
  511. vim:se ts=4 sw=4 et:
  512. -->