Zend_Controller-FrontController.xml 25 KB

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