Zend_Controller-FrontController.xml 25 KB

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