Zend_Controller-FrontController.xml 26 KB

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