Zend_Controller-FrontController.xml 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 17175 -->
  4. <sect1 id="zend.controller.front">
  5. <title>Der Front Controller</title>
  6. <sect2 id="zend.controller.front.overview">
  7. <title>Übersicht</title>
  8. <para>
  9. <classname>Zend_Controller_Front</classname> implementiert ein <ulink
  10. url="http://www.martinfowler.com/eaaCatalog/frontController.html">Front
  11. Controller-Entwurfsmuster</ulink>, das in <ulink
  12. url="http://de.wikipedia.org/wiki/Model_View_Controller">Model-View-Controller
  13. (MVC)</ulink>-Anwendungen verwendet wird. Seine Aufgabe ist, die Abfrage-Umgebung
  14. zu initialisieren, die eingehende Abfrage zu routen und dann die Anfrage an alle
  15. angefragten Aktionen weiterzuleiten (das alles zusammen wird auch dispatchen
  16. genannt); er fasst alle Antworten zusammen und gibt sie zurück, wenn der Prozess
  17. beendet ist.
  18. </para>
  19. <para>
  20. <classname>Zend_Controller_Front</classname> implementiert auch das <ulink
  21. url="http://de.wikipedia.org/wiki/Einzelst%C3%BCck_%28Entwurfsmuster%29">Singleton-Entwurfsmuster
  22. </ulink>, das heißt nur eine einzige Instanz dieser Klasse darf zu jedem Zeitpunkt
  23. existieren. Das ermöglicht es auch, dass der Front-Controller als Registry fungiert, in
  24. der alle anderen Objekte des Prozesses Daten persistent speichern können.
  25. </para>
  26. <para>
  27. <classname>Zend_Controller_Front</classname> registriert einen <link
  28. linkend="zend.controller.plugins">Plugin-Broker</link> in der Registry, die er
  29. selber ist, was es erlaubt, verschiedene Events, die er auslöst, von den Plugins
  30. überwachen zu lassen. In den meisten Fällen gibt das dem Entwickler die Möglichkeit,
  31. einen maßgeschneiderten Dispatch-Prozess zu entwerfen, ohne den Front-Controller
  32. erweitern zu müssen um Funktionalität hinzuzufügen.
  33. </para>
  34. <para>
  35. Als ein absolutes Minimum, um zu funktionieren, braucht der Front-Controller den Pfad
  36. zu einem oder mehreren Verzeichnissen, die
  37. <link linkend="zend.controller.action">Action-Controller</link> enthalten. Verschiedene
  38. Methoden können auch noch aufgerufen werden, um die Front-Controller-Umgebung und die
  39. seiner Hilfsklassen anzupassen.
  40. </para>
  41. <note>
  42. <title>Standardverhalten</title>
  43. <para>
  44. Standardmäßig lädt der Front-Controller sowohl das <link
  45. linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>-Plugin
  46. als auch das <link
  47. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>-Action-Helper-Plugin.
  48. Diese sind dafür geschrieben, Fehlerbehandlung bzw. das Rendern von Views in den
  49. Controllern zu vereinfachen.
  50. </para>
  51. <para>
  52. Um den <emphasis>ErrorHandler</emphasis> abzuschalten, kann der folgende Code an
  53. jeder Stelle vor dem Aufruf der <methodname>dispatch()</methodname>-Methode des
  54. Front-Controllers ausgeführt werden:
  55. </para>
  56. <programlisting language="php"><![CDATA[
  57. // Error-Handler-Plugin abschalten:
  58. $front->setParam('noErrorHandler', true);
  59. ]]></programlisting>
  60. <para>
  61. Um den <emphasis>ViewRenderer</emphasis> abzuschalten muss wiederum der folgende
  62. Code vor dem <methodname>dispatch()</methodname> ausgeführt werden:
  63. </para>
  64. <programlisting language="php"><![CDATA[
  65. // Den ViewRenderer Action-Helper deaktivieren:
  66. $front->setParam('noViewRenderer', true);
  67. ]]></programlisting>
  68. </note>
  69. </sect2>
  70. <sect2 id="zend.controller.front.methods.primary">
  71. <title>Grundlegende Methoden</title>
  72. <para>
  73. Der Front-Controller hat etliche Zugriffsmethoden, die benutzt werden können, um seine
  74. Umgebung zu konfigurieren. Jedoch gibt es drei grundlegende Methoden, die entscheidend
  75. für die Funktionalität des Front-Controllers sind:
  76. </para>
  77. <sect3 id="zend.controller.front.methods.primary.getinstance">
  78. <title>getInstance()</title>
  79. <para>
  80. <methodname>getInstance()</methodname> wird benutzt, um eine Front-Controller
  81. Instanz zu erhalten. Da der Front-Controller das Singleton-Entwurfsmuster
  82. implementiert, ist das auch die einzige Möglichkeit, ein Front-Controller-Objekt zu
  83. erhalten.
  84. </para>
  85. <programlisting language="php"><![CDATA[
  86. $front = Zend_Controller_Front::getInstance();
  87. ]]></programlisting>
  88. </sect3>
  89. <sect3 id="zend.controller.front.methods.primary.setcontrollerdirectory">
  90. <title>setControllerDirectory() und addControllerDirectory()</title>
  91. <para>
  92. <methodname>setControllerDirectory()</methodname> wird benutzt, um <link
  93. linkend="zend.controller.dispatcher">dem Dispatcher</link>
  94. zu sagen, wo er nach <link
  95. linkend="zend.controller.action">Action-Controller</link>-Klassendateien suchen
  96. soll. Sie akzeptiert sowohl einen einzelnen Pfad als auch ein Array aus
  97. Modul und Pfadpaaren.
  98. </para>
  99. <para>
  100. Ein Paar Beispiele:
  101. </para>
  102. <programlisting language="php"><![CDATA[
  103. // Standard-Controller-Verzeichnis setzen:
  104. $front->setControllerDirectory('../application/controllers');
  105. // Einige Modul-Ordner auf einmal setzen:
  106. $front->setControllerDirectory(array(
  107. 'default' => '../application/controllers',
  108. 'blog' => '../modules/blog/controllers',
  109. 'news' => '../modules/news/controllers',
  110. ));
  111. // Den Ordner für das Modul 'foo' hinzufügen:
  112. $front->addControllerDirectory('../modules/foo/controllers', 'foo');
  113. ]]></programlisting>
  114. <note>
  115. <para>
  116. Wenn <methodname>addControllerDirectory()</methodname> ohne einen Modulnamen
  117. verwendet wird, setzt sie den Ordner für das Modul <emphasis>default</emphasis>
  118. -- und überschreibt einen Pfad, der vorher gesetzt wurde.
  119. </para>
  120. </note>
  121. <para>
  122. Die aktuellen Einstellungen für den/die Controller-Ordner können mit
  123. <methodname>getControllerDirectory()</methodname> abgerufen werden; das gibt ein
  124. Array mit Modul- und Verzeichnispaaren zurück.
  125. </para>
  126. </sect3>
  127. <sect3 id="zend.controller.front.methods.primary.addmoduledirectory">
  128. <title>addModuleDirectory() und getModuleDirectory()</title>
  129. <para>
  130. Ein Aspekt des Front-Controllers ist, dass man für die Erstellung von
  131. alleinstehenden Komponenten <link linkend="zend.controller.modular">eine modulare
  132. Verzeichnisstruktur definieren kann</link>; diese werden "Module" (modules)
  133. genannt.
  134. </para>
  135. <para>
  136. Jedes Modul sollte in seinem eigenen Verzeichnis sein und die Verzeichnisstruktur
  137. des Standardmoduls spiegeln -- z.B., sollte es mindestens ein
  138. <filename>/controllers/</filename> Unterverzeichnis haben und typischerweise ein
  139. <filename>/views/</filename> Unterverzeichnis und andere Anwendungsverzeichnisse.
  140. </para>
  141. <para>
  142. <methodname>addModuleDirectory()</methodname> erlaubt es, den Namen des
  143. Verzeichnisses zu übergeben, der ein oder mehrere Modulverzeichnisse enthält. Er
  144. scannt dieses dann und fügt es den Controllerverzeichnissen des Front-Controllers
  145. hinzu.
  146. </para>
  147. <para>
  148. Später, wenn man den Pfad zu einem speziellen Modul oder dem aktuellen Modul
  149. eruieren will, kann <methodname>getModuleDirectory()</methodname> aufgerufen werden
  150. und optional ein Modulname übergeben werden, für welches das spezielle
  151. Modulverzeichnis geholt werden soll.
  152. </para>
  153. </sect3>
  154. <sect3 id="zend.controller.front.methods.primary.dispatch">
  155. <title>dispatch()</title>
  156. <para>
  157. <methodname>dispatch(Zend_Controller_Request_Abstract $request = null,
  158. Zend_Controller_Response_Abstract $response = null)</methodname>
  159. erledigt die Schwerstarbeit des Front-Controllers. Sie nimmt als Parameter optional
  160. ein <link linkend="zend.controller.request">Anfrage-Object</link> und/oder ein <link
  161. linkend="zend.controller.response">Antwort-Objekt</link> entgegen,
  162. was es dem Entwickler erlaubt, wahlweise eigene Objekte für diese beiden Aufgaben zu
  163. bestimmen.
  164. </para>
  165. <para>
  166. Wenn kein Anfrage- oder Antwort-Objekt angegeben werden, wird
  167. <methodname>dispatch()</methodname> nach vorher registrierten Objekten suchen und
  168. diese benutzen oder Standardversionen für seinen Prozess instanzieren (in beiden
  169. Fällen wird der <acronym>HTTP</acronym>-Dialekt als Standard benutzt).
  170. </para>
  171. <para>
  172. Auf ähnliche Art sucht <methodname>dispatch()</methodname> nach registrierten <link
  173. linkend="zend.controller.router">Router</link>- und <link
  174. linkend="zend.controller.dispatcher">Dispatcher</link>-Objekten und instanziert
  175. die Standardversionen wenn keine gefunden werden.
  176. </para>
  177. <para>
  178. Der Dispatch-Prozess hat drei verschiedene Schritte:
  179. </para>
  180. <itemizedlist>
  181. <listitem><para>Routing</para></listitem>
  182. <listitem><para>Dispatching</para></listitem>
  183. <listitem><para>Antwort</para></listitem>
  184. </itemizedlist>
  185. <para>
  186. Das Routing geschieht genau einmal, indem die Werte aus dem Anfrageobjekt benutzt,
  187. die zum Zeitpunkt des Aufrufes von <methodname>dispatch()</methodname> vorhanden
  188. waren. Das Dispatchen geschieht in einer Schleife; eine Anfrage kann entweder
  189. melden, dass es mehrere Aktionen gibt, die ausgeführt werden sollen, oder der
  190. Controller oder ein Plugin können das Anfrageobjekt zurücksetzen, um zu erzwingen,
  191. dass noch zusätzliche Aktionen ausgeführt werden sollen. Wenn alles erledigt ist,
  192. gibt der Front-Controller eine Antwort zurück.
  193. </para>
  194. </sect3>
  195. <sect3 id="zend.controller.front.methods.primary.run">
  196. <title>run()</title>
  197. <para>
  198. <methodname>Zend_Controller_Front::run($path)</methodname> ist eine statische
  199. Methode, die einfach einen Pfad zu einem Verzeichnis, das Action-Controller
  200. enthält, als Parameter akzeptiert. Sie holt sich eine Front-Controller-Instanz (mit
  201. <link
  202. linkend="zend.controller.front.methods.primary.getinstance">getInstance()</link>),
  203. registriert den angegebenen Pfad mit <link
  204. linkend="zend.controller.front.methods.primary.setcontrollerdirectory">setControllerDirectory()</link>,
  205. und <link
  206. linkend="zend.controller.front.methods.primary.dispatch">dispatcht</link>
  207. schlussendlich.
  208. </para>
  209. <para>
  210. Im Grunde ist <methodname>run()</methodname> eine Komfort-Methode, die für
  211. Seitenkonstellationen benutzt werden kann, die keine Anpassung der
  212. Front-Controller-Umgebung benötigen.
  213. </para>
  214. <programlisting language="php"><![CDATA[
  215. // Front-Controller instanzieren, Controller-Verzeichnis setzen
  216. // und dispatchen in einem einfachen Schritt:
  217. Zend_Controller_Front::run('../application/controllers');
  218. ]]></programlisting>
  219. </sect3>
  220. </sect2>
  221. <sect2 id="zend.controller.front.methods.environment">
  222. <title>Methoden für Umgebungszugriff</title>
  223. <para>
  224. Zusätzlich zu den oben aufgelisteten Methoden gibt es eine Menge Zugriffsmethoden, die
  225. benutzt werden können, um die Front-Controller-Umgebung zu beeinflussen -- und damit die
  226. Umgebung der Klassen, an die der Front-Controller seine Arbeit weiterleitet.
  227. </para>
  228. <itemizedlist>
  229. <listitem>
  230. <para>
  231. <methodname>resetInstance()</methodname> wird benutzt, um alle aktuellen
  232. Einstellungen zu löschen. Ihr hauptsächlicher Nutzen sind Testfälle, aber sie
  233. kann auch für Fälle benutzt werden, in denen mehrere
  234. Front-Controller-Ausführungen aneinander gehängt werden sollen.
  235. </para>
  236. </listitem>
  237. <listitem>
  238. <para>
  239. <methodname>setDefaultControllerName()</methodname> und
  240. <methodname>getDefaultControllerName()</methodname> erlauben es, dem
  241. Front-Controller einen anderen Namen für den Standard-Action-Controller
  242. mitzugeben (ansonsten wird 'index' benutzt), bzw. den aktuellen Wert
  243. herauszufinden. Diese Funktionen leiten die Anfragen an den <link
  244. linkend="zend.controller.dispatcher">Dispatcher</link> weiter.
  245. </para>
  246. </listitem>
  247. <listitem>
  248. <para>
  249. <methodname>setDefaultAction()</methodname> und
  250. <methodname>getDefaultAction()</methodname> erlauben analog, den
  251. Standard-Aktionsnamen zu setzen - ohne Einstellung wird 'index' verwendet - und
  252. den aktuellen Wert auszulesen. Auch diese beiden leiten an den <link
  253. linkend="zend.controller.dispatcher">Dispatcher</link> weiter.
  254. </para>
  255. </listitem>
  256. <listitem>
  257. <para>
  258. Mit <methodname>setRequest()</methodname> und
  259. <methodname>setRequest()</methodname> kann
  260. <link linkend="zend.controller.request">die Request</link> Klasse oder das
  261. Objekt, das während des Dispatch-Prozesses verwendet wird und um das aktuelle
  262. Objekt zu erhalten. Wenn das Requestobjekt gesetzt wird, kann ein
  263. Request-Klassenname übergeben werden, und in diesem Fall wird die Methode die
  264. Klassendatei laden und sie initialisieren.
  265. </para>
  266. </listitem>
  267. <listitem>
  268. <para>
  269. Mit <methodname>setRouter()</methodname> sowie
  270. <methodname>setRouter()</methodname> kann auf die gleiche Art der
  271. Klassenname bzw. das Objekt übergeben bzw. zurückgegeben werden, das beim
  272. dispatchen als <link linkend="zend.controller.router">Router</link> verwendet
  273. wird.
  274. </para>
  275. <para>
  276. Wenn nach dem Router-Objekt gefragt wird, wird erst überprüft, ob eines
  277. existiert. Wenn nicht, wird der Standard-Router (der Rewrite-Router) instanziert
  278. und zurückgegeben.
  279. </para>
  280. </listitem>
  281. <listitem>
  282. <para>
  283. <methodname>setBaseUrl()</methodname> und
  284. <methodname>getBaseUrl()</methodname> erlauben es, die <link
  285. linkend="zend.controller.request.http.baseurl">Basis
  286. <acronym>URL</acronym></link> zu setzen, die beim Routen der Anfrage außen vor
  287. gelassen wird, sowie den aktuellen Wert dieser Einstellung zu erhalten. Diese
  288. URL wird dem Request-Objekt erst direkt vor dem Routing bekannt gemacht.
  289. </para>
  290. </listitem>
  291. <listitem>
  292. <para>
  293. <methodname>setDispatcher()</methodname> und
  294. <methodname>getDispatcher()</methodname> kann die <link
  295. linkend="zend.controller.dispatcher">Dispatcher</link>-Klasse oder das
  296. Dispatcher-Objekt setzen, das den Dispatch-Prozess übernimmt. Wie oben, so kann
  297. auch hier ein Klassenname oder ein Objekt übergeben werden; die get-Methode gibt
  298. in jedem Fall ein Objekt zurück.
  299. </para>
  300. <para>
  301. Wenn das Dispatcher Objekt empfangen wird, wird erst überprüft, ob bereits ein
  302. Dispatcher existiert, wenn nicht, wird der Standard-Dispatcher instanziert und
  303. zurückgegeben.
  304. </para>
  305. </listitem>
  306. <listitem>
  307. <para>
  308. Über <methodname>setResponse()</methodname> und
  309. <methodname>getResponse()</methodname> kann das <link
  310. linkend="zend.controller.response">Antwort-Objekt</link> gesetzt bzw. erhalten
  311. werden. Auch hier kann wieder ein Klassenname oder ein Objekt übergeben werden.
  312. </para>
  313. </listitem>
  314. <listitem>
  315. <para>
  316. Mit <methodname>registerPlugin(Zend_Controller_Plugin_Abstract $plugin,
  317. $stackIndex = null)</methodname> können
  318. <link linkend="zend.controller.plugins">Front-Controller-Plugins</link>
  319. registriert werden. Über den optionalen <varname>$stackIndex</varname> kann
  320. kontrolliert werden, in welcher Reihenfolge die Plugins ausgeführt werden.
  321. </para>
  322. </listitem>
  323. <listitem>
  324. <para>
  325. <methodname>unregisterPlugin($plugin)</methodname> kann registrierte <link
  326. linkend="zend.controller.plugins">Plugin-Objekte</link> entfernen.
  327. <varname>$plugin</varname> kann entweder ein Plugin-Objekt oder eine
  328. Zeichenkette sein, welche die Klasse des zu entfernenden Plugins angibt.
  329. </para>
  330. </listitem>
  331. <listitem>
  332. <para>
  333. Mit <methodname>throwExceptions($flag)</methodname> wird festgelegt, ob
  334. Exceptions (Ausnahmen), die während des Dispatch-Prozesses von Plugins,
  335. Controllern, Hilfsklassen etc. geworfen werden. Als Standardeinstellung werden
  336. Exceptions gefangen und im <link
  337. linkend="zend.controller.response">Antwort-Objekt</link> gespeichert. Das
  338. Einschalten von <methodname>throwExceptions()</methodname> überschreibt dieses
  339. Verhalten.
  340. </para>
  341. <para>
  342. Mehr Informationen gibt es hier: <link
  343. linkend="zend.controller.exceptions">MVC Exceptions</link>.
  344. </para>
  345. </listitem>
  346. <listitem>
  347. <para>
  348. <methodname>returnResponse($flag)</methodname> stellt ein, ob die Antwort nach
  349. <methodname>dispatch()</methodname> vom Front-Controller zurückgegeben werden
  350. soll (<constant>TRUE</constant>) oder ob er sie automatisch ausgibt
  351. (<constant>FALSE</constant>). In der Standardeinstellung wird die Antwort
  352. automatisch ausgegeben (durch Aufruf von
  353. <methodname>Zend_Controller_Response_Abstract::sendResponse()</methodname>);
  354. das Einschalten von <methodname>returnResponse()</methodname> ändert das.
  355. </para>
  356. <para>
  357. Gründe, die Antwort zurückzugeben, wären zum Beispiel der Wunsch, nach Fehlern
  358. zu suchen, bevor die Antwort ausgegeben wird, das Logging verschiedener Aspekte
  359. der Antwort (bspw. HTTP-Header), etc.
  360. </para>
  361. </listitem>
  362. </itemizedlist>
  363. </sect2>
  364. <sect2 id="zend.controller.front.methods.params">
  365. <title>Front-Controller-Parameter</title>
  366. <para>
  367. In der Einführung haben wir erwähnt, dass der Front-Controller auch als eine Registry
  368. für die verschiedenen Controller-Komponenten fungiert. Das macht er über eine Gruppe von
  369. "param"-Methoden, de es erlauben, beliebige Daten -- Objekte und Variablen -- im
  370. Front-Controller zu registrieren, die dann zu jeder Zeit im Dispatch-Prozess abgerufen
  371. werden können. Diese Werte werden weitergegeben an den Router, den Dispatcher und an
  372. die Aktions-Controller. Diese Methodengruppe besteht aus:
  373. </para>
  374. <itemizedlist>
  375. <listitem>
  376. <para>
  377. <methodname>setParam($name, $value)</methodname> setzt einen einzelnen
  378. Parameter mit dem Namen <varname>$name</varname> und dem Wert
  379. <varname>$value</varname>.
  380. </para>
  381. </listitem>
  382. <listitem>
  383. <para>
  384. <methodname>setParams(array $params)</methodname> setzt mehrere Parameter auf
  385. einmal mit Hilfe eines assoziativen Arrays.
  386. </para>
  387. </listitem>
  388. <listitem>
  389. <para>
  390. <methodname>getParam($name)</methodname> gibt den Parameter
  391. <varname>$name</varname> zurück.
  392. </para>
  393. </listitem>
  394. <listitem>
  395. <para>
  396. <methodname>getParams()</methodname> gibt eine komplette Liste mit allen
  397. gesetzten Parametern zurück.
  398. </para>
  399. </listitem>
  400. <listitem>
  401. <para>
  402. <methodname>clearParams()</methodname> kann einen Parameter löschen (wenn eine
  403. Zeichenkette mit einem gültigen Namen übergeben wird), mehrere benannte
  404. Parameter (wenn ein Array mit mehreren Parameter-Namen übergeben wird) oder
  405. alle (wenn nichts übergeben wird).
  406. </para>
  407. </listitem>
  408. </itemizedlist>
  409. <para>
  410. Es gibt mehrere vordefinierte Parameter, die ebenfalls gesetzt werden können und die
  411. speziellen Einfluss auf den Dispatch-Prozess haben:
  412. </para>
  413. <itemizedlist>
  414. <listitem>
  415. <para>
  416. <emphasis>useDefaultControllerAlways</emphasis> wird benutzt, um dem <link
  417. linkend="zend.controller.dispatcher">Dispatcher</link> zu sagen, dass er,
  418. wenn er einen Fehler beim Dispatchen feststellt - also ein Modul / einen
  419. Controller / eine Aktionsmethode nicht findet, automatisch den
  420. Startseiten-Controller im Modul default benutzen soll. Standardmäßig
  421. ausgeschaltet.
  422. </para>
  423. <para>
  424. Siehe das Kapitel <link linkend="zend.controller.exceptions.internal">MVC
  425. Exceptions denen man begegnen kann</link> für detailliertere Informationen
  426. über die Benutzung dieser Einstellung.
  427. </para>
  428. </listitem>
  429. <listitem>
  430. <para>
  431. <emphasis>disableOutputBuffering</emphasis> sagt dem <link
  432. linkend="zend.controller.dispatcher">Dispatcher</link>, dass er keinen
  433. Ausgabepuffer benutzen soll, um die Ausgabe, die von den Action-Controllern
  434. generiert wird, abzufangen. Standardmäßig werden sämtliche Ausgaben abgefangen
  435. und im Antwort-Objekt gespeichert.
  436. </para>
  437. </listitem>
  438. <listitem>
  439. <para>
  440. Wenn <emphasis>noViewRenderer</emphasis> auf <constant>TRUE</constant> steht,
  441. wird der <link
  442. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  443. abgeschaltet.
  444. </para>
  445. </listitem>
  446. <listitem>
  447. <para>
  448. <emphasis>noErrorHandler</emphasis> auf <constant>TRUE</constant> schaltet das
  449. <link
  450. linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler-Plugin</link>
  451. ab.
  452. </para>
  453. </listitem>
  454. </itemizedlist>
  455. </sect2>
  456. <sect2 id="zend.controller.front.subclassing">
  457. <title>Erweitern des Front-Controllers</title>
  458. <para>
  459. Um den Front-Controller zu erweitern, muss als Minimalanforderung auf jeden Fall
  460. die Methode <methodname>getInstance()</methodname> überschrieben werden:
  461. </para>
  462. <programlisting language="php"><![CDATA[
  463. class My_Controller_Front extends Zend_Controller_Front
  464. {
  465. public static function getInstance()
  466. {
  467. if (null === self::$_instance) {
  468. self::$_instance = new self();
  469. }
  470. return self::$_instance;
  471. }
  472. }
  473. ]]></programlisting>
  474. <para>
  475. Das Überschreiben der <methodname>getInstance()</methodname>-Methode sorgt dafür, dass
  476. folgende Aufrufe von <methodname>Zend_Controller_Front::getInstance()</methodname> eine
  477. Instanz der neuen Subklasse zurückgeben anstatt einer
  478. <classname>Zend_Controller_Front</classname>-Instanz -- das ist speziell für einige der
  479. alternativen Router und View-Helfer nützlich.
  480. </para>
  481. <para>
  482. Typischerweise muss der Front-Controller nicht erweitert werden, es sei denn, es ist
  483. gewünscht, neue Funktionalität (wie zum Beispiel einen Plugin-Autoloader oder einen Weg,
  484. Action-Helper-Pfade anzugeben) hinzuzufügen. Einige Gelegenheiten, bei denen das
  485. Standardverhalten geändert werden könnte, wären zum Beispiel die Art, wie Controller
  486. geladen oder deren Pfade gespeichert werden, oder welcher Standard-Router und/oder
  487. Dispatcher benutzt werden.
  488. </para>
  489. </sect2>
  490. </sect1>
  491. <!--
  492. vim:se ts=4 sw=4 et:
  493. -->