Zend_Controller-FrontController.xml 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 16664 -->
  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 <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 Pfad-Paaren.
  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 Verzeichnis-Paaren 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 Frontcontrollers ist das man <link
  131. linkend="zend.controller.modular">eine modulare Verzeichnisstruktur definieren
  132. kann</link> für die Erstellung von alleinstehenden Komponenten; diese werden
  133. "Module" (modules) 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> Unterzeichnis 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 Frontcontrollers
  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 das das spezielle Modulverzeichnis
  151. 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 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 Standard-Versionen 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 Standard-Versionen 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 Anfrage-Objekt 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 Anfrage-Objekt 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>(set|get)DefaultControllerName()</methodname> erlaubt es, dem
  240. Front-Controller einen anderen Namen für den Standard-Action-Controller
  241. mitzugeben (ansonsten wird 'index' benutzt), bzw. den aktuellen Wert
  242. herauszufinden. Diese Funktionen leiten die Anfragen an den <link
  243. linkend="zend.controller.dispatcher">Dispatcher</link> weiter.
  244. </para>
  245. </listitem>
  246. <listitem>
  247. <para>
  248. <methodname>(set|get)DefaultAction()</methodname> erlaubt analog, den
  249. Standard-Aktionsnamen zu setzen - ohne Einstellung wird 'index' verwendet - und
  250. den aktuellen Wert auszulesen. Auch diese beiden leiten an den <link
  251. linkend="zend.controller.dispatcher">Dispatcher</link> weiter.
  252. </para>
  253. </listitem>
  254. <listitem>
  255. <para>
  256. Mit <methodname>(set|get)Request()</methodname> kann
  257. <link linkend="zend.controller.request">die Request</link> Klasse oder das
  258. Objekt, das während des Dispatch-Prozesses verwendet wird und um das aktuelle
  259. Objekt zu erhalten. Wenn das Requestobjekt gesetzt wird, kann ein
  260. Request-Klassenname übergeben werden, und in diesem Fall wird die Methode die
  261. Klassendatei laden und Sie initialisieren.
  262. </para>
  263. </listitem>
  264. <listitem>
  265. <para>
  266. Mit <methodname>(set|get)Router()</methodname> kann auf die gleiche Art der
  267. Klassenname bzw. das Objekt übergeben bzw. zurückgegeben werden, das beim
  268. dispatchen als <link linkend="zend.controller.router">Router</link> verwendet
  269. wird.
  270. </para>
  271. <para>
  272. Wenn nach dem Router-Objekt gefragt wird, wird erst überprüft, ob eines
  273. existiert. Wenn nicht, wird der Standard-Router (der Rewrite-Router) instanziert
  274. und zurückgegeben.
  275. </para>
  276. </listitem>
  277. <listitem>
  278. <para>
  279. <methodname>(set|get)BaseUrl()</methodname> erlaubt es, die <link
  280. linkend="zend.controller.request.http.baseurl">Basis-URL</link> zu setzen,
  281. die beim Routen der Anfrage außen vor gelassen wird, sowie den aktuellen
  282. Wert dieser Einstellung zu erhalten. Diese URL wird dem Request-Objekt erst
  283. direkt vor dem Routing bekannt gemacht.
  284. </para>
  285. </listitem>
  286. <listitem>
  287. <para>
  288. <methodname>(set|get)Dispatcher()</methodname> kann die <link
  289. linkend="zend.controller.dispatcher">Dispatcher</link>-Klasse/das
  290. Dispatcher-Objekt setzen, das den Dispatch-Prozess übernimmt. Wie oben, so kann
  291. auch hier ein Klassenname oder ein Objekt übergeben werden; die get-Methode gibt
  292. in jedem Fall ein Objekt zurück.
  293. </para>
  294. <para>
  295. Wenn das Dispatcher Objekt empfangen wird, wird erst überprüft, ob bereits ein
  296. Dispatcher existiert, wenn nicht, wird der Standard-Dispatcher instanziert und
  297. zurückgegeben.
  298. </para>
  299. </listitem>
  300. <listitem>
  301. <para>
  302. Über <methodname>(set|get)Response()</methodname> kann das <link
  303. linkend="zend.controller.response">Antwort-Objekt</link> gesetzt bzw. erhalten
  304. werden. Auch hier kann wieder ein Klassenname oder ein Objekt übergeben werden.
  305. </para>
  306. </listitem>
  307. <listitem>
  308. <para>
  309. Mit <methodname>registerPlugin(Zend_Controller_Plugin_Abstract $plugin,
  310. $stackIndex = null)</methodname> können
  311. <link linkend="zend.controller.plugins">Front-Controller-Plugins</link>
  312. registriert werden. Über den optionalen <varname>$stackIndex</varname> kann
  313. kontrolliert werden, in welcher Reihenfolge die Plugins ausgeführt werden.
  314. </para>
  315. </listitem>
  316. <listitem>
  317. <para>
  318. <methodname>unregisterPlugin($plugin)</methodname> kann registrierte <link
  319. linkend="zend.controller.plugins">Plugin-Objekte</link> entfernen.
  320. <varname>$plugin</varname> kann entweder ein Plugin-Objekt oder eine
  321. Zeichenkette sein, die die Klasse des zu entfernenden Plugins angibt.
  322. </para>
  323. </listitem>
  324. <listitem>
  325. <para>
  326. Mit <methodname>throwExceptions($flag)</methodname> wird festgelegt, ob
  327. Exceptions (Ausnahmen), die während des Dispatch-Prozesses von Plugins,
  328. Controllern, Hilfsklassen etc. geworfen werden. Als Standardeinstellung werden
  329. Exceptions gefangen und im <link
  330. linkend="zend.controller.response">Antwort-Objekt</link> gespeichert. Das
  331. Einschalten von <methodname>throwExceptions()</methodname> überschreibt dieses
  332. Verhalten.
  333. </para>
  334. <para>
  335. Mehr Informationen gibt es hier: <link
  336. linkend="zend.controller.exceptions">MVC Exceptions</link>.
  337. </para>
  338. </listitem>
  339. <listitem>
  340. <para>
  341. <methodname>returnResponse($flag)</methodname> stellt ein, ob die Antwort nach
  342. <methodname>dispatch()</methodname> vom Front-Controller zurückgegeben werden
  343. soll (<constant>TRUE</constant>) oder ob er sie automatisch ausgibt
  344. (<constant>FALSE</constant>). In der Standardeinstellung wird die Antwort
  345. automatisch ausgegeben (durch Aufruf von
  346. <methodname>Zend_Controller_Response_Abstract::sendResponse()</methodname>);
  347. das Einschalten von <methodname>returnResponse()</methodname> ändert das.
  348. </para>
  349. <para>
  350. Gründe, die Antwort zurückzugeben, wären zum Beispiel der Wunsch, nach Fehlern
  351. zu suchen, bevor die Antwort ausgegeben wird, das Logging verschiedener Aspekte
  352. der Antwort (bspw. HTTP-Header), etc.
  353. </para>
  354. </listitem>
  355. </itemizedlist>
  356. </sect2>
  357. <sect2 id="zend.controller.front.methods.params">
  358. <title>Front Controller-Parameter</title>
  359. <para>
  360. In der Einführung haben wir erwähnt, dass der Front-Controller auch als eine Registry
  361. für die verschiedenen Controller-Komponenten fungiert. Das macht er über eine Gruppe von
  362. "param"-Methoden, de es erlauben, beliebige Daten -- Objekte und Variablen -- im
  363. Front-Controller zu registrieren, die dann zu jeder Zeit im Dispatch-Prozess abgerufen
  364. werden können. Diese Werte werden weitergegeben an den Router, den Dispatcher, und an
  365. die Aktions-Controller. Diese Methodengruppe besteht aus:
  366. </para>
  367. <itemizedlist>
  368. <listitem>
  369. <para>
  370. <methodname>setParam($name, $value)</methodname> setzt einen einzelnen
  371. Parameter mit dem Namen <varname>$name</varname> und dem Wert
  372. <varname>$value</varname>.
  373. </para>
  374. </listitem>
  375. <listitem>
  376. <para>
  377. <methodname>setParams(array $params)</methodname> setzt mehrere Parameter auf
  378. einmal mit Hilfe eines assoziativen Arrays.
  379. </para>
  380. </listitem>
  381. <listitem>
  382. <para>
  383. <methodname>getParam($name)</methodname> gibt den Parameter
  384. <varname>$name</varname> zurück.
  385. </para>
  386. </listitem>
  387. <listitem>
  388. <para>
  389. <methodname>getParams()</methodname> gibt eine komplette Liste mit allen
  390. gesetzten Parametern zurück.
  391. </para>
  392. </listitem>
  393. <listitem>
  394. <para>
  395. <methodname>clearParams()</methodname> kann einen Parameter löschen (wenn eine
  396. Zeichenkette mit einem gültigen Namen übergeben wird), mehrere benannte
  397. Parameter (wenn ein Array mit mehreren Parameter-Namen übergeben wird) oder
  398. alle (wenn nichts übergeben wird).
  399. </para>
  400. </listitem>
  401. </itemizedlist>
  402. <para>
  403. Es gibt mehrere vordefinierte Parameter (die ebenfalls gesetzt werden können), die
  404. speziellen Einfluss auf den Dispatch-Prozess haben:
  405. </para>
  406. <itemizedlist>
  407. <listitem>
  408. <para>
  409. <emphasis>useDefaultControllerAlways</emphasis> wird benutzt, um dem <link
  410. linkend="zend.controller.dispatcher">Dispatcher</link> zu sagen, dass er,
  411. wenn er einen Fehler beim Dispatchen feststellt - also ein Modul / einen
  412. Controller / eine Aktionsmethode nicht findet, automatisch den
  413. Startseiten-Controller im Modul default benutzen soll. Standardmäßig
  414. ausgeschaltet.
  415. </para>
  416. <para>
  417. Siehe das Kapitel <link linkend="zend.controller.exceptions.internal">MVC
  418. Exceptions denen man begegnen kann</link> für detailliertere Informationen
  419. über die Benutzung dieser Einstellung.
  420. </para>
  421. </listitem>
  422. <listitem>
  423. <para>
  424. <emphasis>disableOutputBuffering</emphasis> sagt dem <link
  425. linkend="zend.controller.dispatcher">Dispatcher</link>, dass er keinen
  426. Ausgabepuffer benutzen soll, um die Ausgabe, die von den Action-Controllern
  427. generiert wird, abzufangen. Standardmäßig werden sämtliche Ausgaben abgefangen
  428. und im Antwort-Objekt gespeichert.
  429. </para>
  430. </listitem>
  431. <listitem>
  432. <para>
  433. Wenn <emphasis>noViewRenderer</emphasis> auf true steht, wird der <link
  434. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  435. abgeschaltet.
  436. </para>
  437. </listitem>
  438. <listitem>
  439. <para>
  440. <emphasis>noErrorHandler</emphasis> auf true schaltet das <link
  441. linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler-Plugin</link>
  442. ab.
  443. </para>
  444. </listitem>
  445. </itemizedlist>
  446. </sect2>
  447. <sect2 id="zend.controller.front.subclassing">
  448. <title>Erweitern des Front-Controllers</title>
  449. <para>
  450. Um den Front-Controller zu erweitern, muss als Minimalanforderung auf jeden Fall
  451. die Methode <methodname>getInstance()</methodname> überschrieben werden:
  452. </para>
  453. <programlisting language="php"><![CDATA[
  454. class My_Controller_Front extends Zend_Controller_Front
  455. {
  456. public static function getInstance()
  457. {
  458. if (null === self::$_instance) {
  459. self::$_instance = new self();
  460. }
  461. return self::$_instance;
  462. }
  463. }
  464. ]]></programlisting>
  465. <para>
  466. Das Überschreiben der <methodname>getInstance()</methodname>-Methode sorgt dafür, dass
  467. folgende Aufrufe von <methodname>Zend_Controller_Front::getInstance()</methodname> eine
  468. Instanz der neuen Subklasse zurückgeben anstatt einer
  469. <classname>Zend_Controller_Front</classname>-Instanz -- das ist speziell für einige der
  470. alternativen Router und View-Helfer nützlich.
  471. </para>
  472. <para>
  473. Typischerweise muss der Front-Controller nicht erweitert werden, es sei denn, es ist
  474. gewünscht, neue Funktionalität (wie zum Beispiel einen Plugin-Autoloader oder einen Weg,
  475. Action-Helper-Pfade anzugeben) hinzuzufügen. Einige Gelegenheiten, bei denen das
  476. Standard-Verhalten geändert werden könnte, wären zum Beispiel die Art, wie Controller
  477. geladen oder deren Pfade gespeichert werden, oder welcher Standard-Router und/oder
  478. Dispatcher benutzt werden.
  479. </para>
  480. </sect2>
  481. </sect1>
  482. <!--
  483. vim:se ts=4 sw=4 et:
  484. -->