Zend_Controller-ActionController.xml 24 KB

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