Zend_Controller-FrontController.xml 25 KB

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