Zend_Controller-ActionController.xml 24 KB

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