Zend_Controller-Migration.xml 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.migration">
  5. <title>Migration von vorhergehenden Versionen</title>
  6. <para>
  7. Die API der MVC Komponenten hat sich mit der Zeit verändert. Wer Zend Framework bereits
  8. in einer früheren Version verwendet hat, folgt dem Leitfaden unten, damit dieSkripte die
  9. neue Archtitekur verwenden.
  10. </para>
  11. <sect2 id="zend.controller.migration.fromonesixtooneseven">
  12. <title>Migration von 1.6.x zu 1.7.0 oder neuer</title>
  13. <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
  14. <title>Änderungen im Dispatcher Interface</title>
  15. <para>
  16. Benutzer haben uns darauf aufmerksam gemacht das
  17. <classname>Zend_Controller_Action_Helper_ViewRenderer</classname> Methoden auf der
  18. abstrakten Dispatcher Klasse verwendet hat die nicht im Dispatcher Interface waren.
  19. Die folgenden Methoden wurden hinzugefügt um sicherzustellen das eigene Dispatcher
  20. weiterhin mit den ausgelieferten Implementierungen funktionieren:
  21. </para>
  22. <itemizedlist>
  23. <listitem><para>
  24. <code>formatModuleName()</code>: sollte verwendet werden um einen rohen
  25. Controllernamen zu nehmen, wie den einen der in einem Anfrageobjekt gepackt ist,
  26. und Ihn in einen richtigen Klassennamen zu reformatieren den eine Klasse, die
  27. <classname>Zend_Controller_Action</classname> erweitert, verwenden würde
  28. </para></listitem>
  29. </itemizedlist>
  30. </sect3>
  31. </sect2>
  32. <sect2 id="zend.controller.migration.fromoneohtoonesix">
  33. <title>Migration von 1.5.x zu 1.6.0 oder neuer</title>
  34. <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
  35. <title>Änderungen im Dispatcher Interface</title>
  36. <para>
  37. Benutzer haben uns darauf aufmerksam gemacht das sowohl
  38. <classname>Zend_Controller_Front</classname> als auch
  39. <classname>Zend_Controller_Router_Route_Module</classname> Methoden des Dispatchers
  40. verwenden die nicht im Dispatcher Interface waren. Wir haben jetzt die folgenden
  41. drei Methoden hinzugefügt um sicherzustellen das eigene Dispatcher weiterhin mit der
  42. ausgelieferten Implementation arbeiten:
  43. </para>
  44. <itemizedlist>
  45. <listitem><para>
  46. <code>getDefaultModule()</code>: Sollte den Namen des Standardmoduls
  47. zurückgeben.
  48. </para></listitem>
  49. <listitem><para>
  50. <code>getDefaultControllerName()</code>: Sollte den Namen des
  51. Standardcontrollers zurückgeben.
  52. </para></listitem>
  53. <listitem><para>
  54. <code>getDefaultAction()</code>: Sollte den Namen der Standardaktion
  55. zurückgeben.
  56. </para></listitem>
  57. </itemizedlist>
  58. </sect3>
  59. </sect2>
  60. <sect2 id="zend.controller.migration.fromoneohtoonefive">
  61. <title>Migration von 1.0.x zu 1.5.0 oder neuer</title>
  62. <para>
  63. Obwohl die meisten grundsätzlichen Funktionalitäten die gleichen bleiben und alle
  64. dokumentierten Funktionalitäten die gleichen bleiben gibt es doch ein spezielles
  65. <emphasis>undokumentiertes</emphasis> "Feature" das geändert wurde.
  66. </para>
  67. <para>
  68. Wenn URLs geschrieben werden besteht der dokumentierte Weg darin die Aktionsnamen
  69. camelCased mit einem Trennzeichen zu schreiben; diese sind normalerweise '.' oder '-',
  70. können aber im Dispatcher konfiguriert werden. Der Dispatcher ändert den Aktionsnamen
  71. intern auf Kleinschreibung und verwendet diese Trennzeichen um die Aktionsmethode
  72. wieder zu bauen indem er sie camelCase schreibt. Trotzdem, weil PHP Funktionen nicht
  73. unabhängig von der Schreibweise sind, <emphasis>könnte</emphasis> man URLs mit
  74. camelCase schreiben und der Dispatcher würde diese auf den gleichen Platz auflösen.
  75. Zum Beispiel, 'camel-cased' würde durch den Dispatcher zu 'camelCasedAction' werden;
  76. trotzdem, durch den Fall der unabhängigen Schreibweise in PHP, würden beide die selbe
  77. Methode ausführen.
  78. </para>
  79. <para>
  80. Das führt zu Problemen mit dem ViewRenderer wenn View Skripte aufgelöst werden. Der
  81. kanonische, dokumentierte Weg besteht darin das alle Trennzeichen zu Bindestrichen
  82. umgewandelt und die Wörter kleingeschrieben werden. Das erzeugt eine semantische
  83. Bindung zwischen Aktionen und View Skripten, und die Normalisierung stellt sicher
  84. das die Skripte gefunden werden. Trotzdem, wenn die Aktion 'camelCased' aufgerufen und
  85. aufgelöst wird, ist das Trennzeichen nicht mehr vorhanden, und der ViewRenderer
  86. versucht einen anderen Ort aufzulösen -- 'camelcased.phtml' statt 'camel-cased.phtml'.
  87. </para>
  88. <para>
  89. Einige Entwickler hängen an diesem "Feature", welches nie angedacht war. Verschiedene
  90. Änderungen im 1.5.0 Baum, führen dazu das der ViewRenderer diese Pfade nicht länger
  91. auflöst; die semantische Bindung wird nun erzwungen. Ale erstes, erzwingt der
  92. Dispatcher nun die Groß-/Kleinschreibung in Aktionsnamen. Das bedeutet das das
  93. hinleiten zu eigenen Aktionen über die URL durch Verwendung von camelCase nicht länger
  94. auf die gleiche Methode aufgelöst wird wie mit Trennzeichen (z.B. 'camel-casing').
  95. Das führt dazu das der ViewRenderer jetzt nur mehr zeichen-getrennte Aktionen
  96. honoriert wenn er View Skripte auflöst.
  97. </para>
  98. <para>´
  99. Wenn man findet das man auf dieses "Feature" nicht verzichten kann gibt es mehrere
  100. Optionen:
  101. </para>
  102. <itemizedlist>
  103. <listitem><para>
  104. Beste Option: Die View Skripte umbenennen. Vorteile: zukünftige Kompatibilität.
  105. Nachteile: Wenn man viele View Skripte hat die auf dem vorigen aufbauen führt
  106. das, unerwarteter Weise, zu vielen Umbenennungen die durchgeführt werden müssen.
  107. </para></listitem>
  108. <listitem>
  109. <para>
  110. Zweitbeste Option: Der ViewRenderer delegiert nun die Auflösung von View
  111. Skripten zu <classname>Zend_Filter_Inflector</classname>; man kann die Regeln
  112. des Inflectors ändern damit er nicht länger die Wörter der Aktion mit einem
  113. Bindestrich trennt:
  114. </para>
  115. <programlisting role="php"><![CDATA[
  116. $viewRenderer =
  117. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  118. $inflector = $viewRenderer->getInflector();
  119. $inflector->setFilterRule(':action', array(
  120. new Zend_Filter_PregReplace(
  121. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  122. ''
  123. ),
  124. 'StringToLower'
  125. ));
  126. ]]>
  127. </programlisting>
  128. <para>
  129. Der obige Code ändert den Inflector so, das er Wörter nicht länger mit einem
  130. Bindestrich trennt; Es kann auch gewünscht sein den 'StringToLower' Filter zu
  131. entfernen man die aktuellen View Skripte camelCased benannt haben
  132. <emphasis>will</emphasis>.
  133. </para>
  134. <para>
  135. Wenn die Umbenennung der View Skripte zu aufwendig oder Zeitintensiv ist, dann
  136. ist das die beste Option wenn man die Zeit hierfür findet.
  137. </para>
  138. </listitem>
  139. <listitem>
  140. <para>
  141. Die am wenigsten zu empfehlende Option: Man kann den Dispatcher dazu zwingen
  142. camelCase Aktionsnamen mit einem neuen Front Kontroller Flag
  143. 'useCaseSensitiveActions' zu bearbeiten:
  144. </para>
  145. <programlisting role="php"><![CDATA[
  146. $front->setParam('useCaseSensitiveActions', true);
  147. ]]></programlisting>
  148. <para>
  149. Das erlaubt es camelCase in der URL zu verwenden uns es trotzdem auf die
  150. gleiche Aktion aufzulösen wie wenn Trennzeichen verwendet worden wären. Das
  151. bedeutet das das Originale Problem trotzdem durchschlägt; es kann notwendig
  152. sein die zweite Option von oben zusätzlich zu verwenden um sicherzustellen
  153. das die Dinge in allen Variationen funktionieren.
  154. </para>
  155. <para>
  156. Man sollte auch beachten das die Verwendung dieses Flags eine Notiz auslöst,
  157. das dessen Verwendung nicht mehr durchgeführt werden sollte.
  158. </para>
  159. </listitem>
  160. </itemizedlist>
  161. </sect2>
  162. <sect2 id="zend.controller.migration.fromzeroninethree">
  163. <title>Migration von 0.9.3 nach 1.0.0RC1 oder neuer</title>
  164. <para>
  165. Die prinzipiellen Änderungen die durch 1.0.0RC1 angeboten werden sind die Einführung und
  166. standardmäßige Aktivierung des
  167. <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  168. Plugins und den
  169. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  170. Aktionhelfer. Bitte lies die Dokumentation jedes einzelnen gründlich um zu sehen wie sie
  171. arbeiten und welchen Effekt Sie auf die eigene Anwendung haben können.
  172. </para>
  173. <para>
  174. Der <code>ErrorHandler</code> Plugin läuft wärend der <code>postDispatch()</code>
  175. Prüfung auf Ausnahmen, und leitet zu einem spezifizierten Fehlerhandler Kontroller
  176. weiter. Solch ein Kontroller sollte in der eigenen Anwendung inkludiert werden. Er kann
  177. deaktiviert werden durch das setzen des Frontkontroller Parameters
  178. <code>noErrorHandler</code>:
  179. </para>
  180. <programlisting role="php"><![CDATA[
  181. $front->setParam('noErrorHandler', true);
  182. ]]></programlisting>
  183. <para>
  184. Der <code>ViewRenderer</code> Aktionhelfer automatisiert die Injizierung der View in den
  185. Aktionkontroller genauso wie das autorendern von Viewskripten basierend auf die aktuelle
  186. Aktion. Das primäre Problem dem man begegnen kann ist, wenn man Aktionen hat die keine
  187. View Skripte rendern und weder vorwärts- noch weiterleiten, da der
  188. <code>ViewRenderer</code> versucht ein View Skript zu Rendern basierend auf dem
  189. Aktionnamen.
  190. </para>
  191. <para>
  192. Es gibt verschiedene Strategien die man anwenden kann um den eigenen Code upzudaten. In
  193. kurzer Form, kann man global den <code>ViewRenderer</code> im eigenen Frontkontroller
  194. Bootstrap vor dem Abarbeiten ausschalten:
  195. </para>
  196. <programlisting role="php"><![CDATA[
  197. // Annahme das $front eine Instanz von Zend_Controller_Front ist
  198. $front->setParam('noViewRenderer', true);
  199. ]]></programlisting>
  200. <para>
  201. Trotzdem ist es keine gute Langzeitstrategie, da es auch bedeutet das man mehr Code
  202. schreiben muß.
  203. </para>
  204. <para>
  205. Wenn man bereit ist damit zu beginnen die <code>ViewRenderer</code> Funktionalität zu
  206. verwenden, gibt es verschiedene Dinge die man im eigenen Kontrollercode beachten muß.
  207. Zuerst muß auf die Aktionmethoden (die Methoden die mit 'Action' enden) geachtet werden,
  208. und ausgesucht werden was eine jede machen soll. Wenn nichts vom folgenden passiert, muß
  209. man Änderungen durchführen:
  210. </para>
  211. <itemizedlist>
  212. <listitem><para>Aufruf von <code>$this-&gt;render()</code></para></listitem>
  213. <listitem><para>Aufruf von <code>$this-&gt;_forward()</code></para></listitem>
  214. <listitem><para>Aufruf von <code>$this-&gt;_redirect()</code></para></listitem>
  215. <listitem><para>Aufruf des <code>Redirector</code> Aktionhelfers</para></listitem>
  216. </itemizedlist>
  217. <para>
  218. Die einfachste Änderung ist das ausschalten des Auto-Rendering für diese Methode:
  219. </para>
  220. <programlisting role="php"><![CDATA[
  221. $this->_helper->viewRenderer->setNoRender();
  222. ]]></programlisting>
  223. <para>
  224. Wenn man herausfindet das keine der eigenen Aktionmethoden rendern, weiterleiten oder
  225. umleiten, wird man voraussichtlich die oben angeführte Zeile in die eigene
  226. <code>preDispatch()</code> oder <code>init()</code> Methode einfügen wollen:
  227. </para>
  228. <programlisting role="php"><![CDATA[
  229. public function preDispatch()
  230. {
  231. // Ausschalten des autorendern vom View Skript
  232. $this->_helper->viewRenderer->setNoRender()
  233. // .. andere Dinge tun...
  234. }
  235. ]]></programlisting>
  236. <para>
  237. Wenn <code>render()</code> aufgerufen wird, und man
  238. <link linkend="zend.controller.modular">die konventionelle Modulare Verzeichnis
  239. Struktur</link> verwendet, wird man den Code ändern wollen um Autorendern zu
  240. Verwenden:
  241. </para>
  242. <itemizedlist>
  243. <listitem>
  244. <para>
  245. Wenn man mehrere View Skripte in einer einzelnen Aktion rendert muß nichts
  246. geändert werden.
  247. </para>
  248. </listitem>
  249. <listitem>
  250. <para>
  251. Wenn man einfach <code>render()</code> ohne Argumente aufruft, können diese
  252. Zeilen entfernt
  253. werden.
  254. </para>
  255. </listitem>
  256. <listitem>
  257. <para>
  258. Wenn man <code>render()</code> mit Argumenten aufruft, und danach nicht
  259. irgendeine Bearbeitung durchführt oder mehrere View sktipe rendert, können diese
  260. Aufrufe zu <code>$this-&gt;_helper-&gt;viewRenderer()</code> geändert werden.
  261. </para>
  262. </listitem>
  263. </itemizedlist>
  264. <para>
  265. Wenn die konventionelle modulare Verzeichnisstruktur nicht verwendet wird, gibt es eine
  266. Vielzahl von Methoden für das Setzen des View Basispfades und der Skript
  267. Pfadspezifikationen so das man den <code>ViewRenderer</code> verwenden kann. Bitte lies
  268. die <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer
  269. Dokumentation</link> für Informationen über diese Methoden.
  270. </para>
  271. <para>
  272. Wenn ein View Objekt von der Registry verwendet, oder das eigene View Objekt verändert,
  273. oder eine andere View Implementation verwendet wird wird man den
  274. <code>ViewRenderer</code> in diesem Objekt injiziieren wollen. Das kann ganz einfach
  275. jederzeit durchgeführt werden.
  276. </para>
  277. <itemizedlist>
  278. <listitem>
  279. <para>
  280. Vor dem verarbeiten einer Frontkontroller Instanz:
  281. </para>
  282. <programlisting role="php"><![CDATA[
  283. // Annahme das $view bereits definiert wurde
  284. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  285. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  286. ]]></programlisting>
  287. </listitem>
  288. <listitem>
  289. <para>
  290. Jederzeit wärend des Bootstrap Prozesses:
  291. </para>
  292. <programlisting role="php"><![CDATA[
  293. $viewRenderer =
  294. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  295. $viewRenderer->setView($view);
  296. ]]></programlisting>
  297. </listitem>
  298. </itemizedlist>
  299. <para>
  300. Es gibt viele Wege den <code>ViewRenderer</code> zu modifizieren inklusive dem Setzen
  301. eines anderen View Skripts zum Rendern, dem Spezifizieren von Veränderungen für alle
  302. veränderbaren Elemente eines View Skript Pfades (inklusive der Endung), dem Auswählen
  303. eines Antwort-benannten Segments zur Anpassung und mehr. Wenn die konventionelle
  304. modulare Verzeichnisstruktur nicht verwendet wird, kann noch immer eine andere Pfad
  305. Spezifikation mit dem <code>ViewRenderer</code> zugeordnet werden.
  306. </para>
  307. <para>
  308. Wir empfehlen die Adaptierung des eigenen Codes um den <code>ErrorHandler</code> und
  309. <code>ViewRenderer</code> zu verwenden da diese neue Kernfunktionalitäten sind.
  310. </para>
  311. </sect2>
  312. <sect2 id="zend.controller.migration.fromzeroninetwo">
  313. <title>Migration von 0.9.2 nach 0.9.3 oder neuer</title>
  314. <para>
  315. 0.9.3 bietet <link linkend="zend.controller.actionhelpers">Aktionhelfer</link> neu an.
  316. Als Teil dieser Änderung wurden die folgenden Methoden entfernt da Sie nun im <link
  317. linkend="zend.controller.actionhelpers.redirector">Weiterleitungs
  318. Aktionhelfer</link> inkludiert sind:
  319. </para>
  320. <itemizedlist>
  321. <listitem>
  322. <para>
  323. <code>setRedirectCode()</code>; wurde umbenannt in
  324. <classname>Zend_Controller_Action_Helper_Redirector::setCode()</classname>.
  325. </para>
  326. </listitem>
  327. <listitem>
  328. <para>
  329. <code>setRedirectPrependBase()</code>; wurde umbenannt in
  330. <classname>Zend_Controller_Action_Helper_Redirector::setPrependBase()</classname>.
  331. </para>
  332. </listitem>
  333. <listitem>
  334. <para>
  335. <code>setRedirectExit()</code>; wurde umbenannt in
  336. <classname>Zend_Controller_Action_Helper_Redirector::setExit()</classname>.
  337. </para>
  338. </listitem>
  339. </itemizedlist>
  340. <para>
  341. Lese die <link linkend="zend.controller.actionhelpers">Aktionhelfer Dokumentation</link>
  342. für nähere Informationen über das empfangen und manipulieren von Helfer Objekten und die
  343. <link linkend="zend.controller.actionhelpers.redirector">Weiterleitungshelfer
  344. Dokumentation</link> für weitere Information über das setzen von
  345. Weiterleitungsoptionen (sowie alternative Methoden des weiterleitens).
  346. </para>
  347. </sect2>
  348. <sect2 id="zend.controller.migration.fromzerosix">
  349. <title>Migration von 0.6.0 nach 0.8.0 oder neuer</title>
  350. <para>
  351. Durch bisherige Änderungen bleibt die wesentliche Verwendung der MVC Komponenten gleich:
  352. </para>
  353. <programlisting role="php"><![CDATA[
  354. require_once 'Zend/Controller/Front.php';
  355. Zend_Controller_Front::run('/path/to/controllers');
  356. ]]></programlisting>
  357. <para>
  358. Dennoch wurde die Verzeichnisstruktur gründliche überarbeitet, verschiedene Komponenten
  359. wurden entfernt und mehrere andere umbenannt und hinzugefügt. Die Änderungen beinhalten:
  360. </para>
  361. <itemizedlist>
  362. <listitem>
  363. <para>
  364. <classname>Zend_Controller_Router</classname> wurde entfernt für den Rewrite
  365. Router entfernt.
  366. </para>
  367. </listitem>
  368. <listitem>
  369. <para>
  370. <classname>Zend_Controller_RewriteRouter</classname> wurde in
  371. <classname>Zend_Controller_Router_Rewrite</classname> umbenannt und zum Standard
  372. Router befördert, der mit dem Framework ausgeliefert wird;
  373. <classname>Zend_Controller_Front</classname> wird ihn als Standard verwenden,
  374. wenn kein anderer Router übergeben wird.
  375. </para>
  376. </listitem>
  377. <listitem>
  378. <para>
  379. Eine neue Route Klasse für die Verwendung mit dem Rewrite Router wurde
  380. eingeführt: <classname>Zend_Controller_Router_Route_Module</classname>; sie
  381. deckt die Standardrouten ab, die vom MVC verwendet werden und bietet die
  382. Unterstützung für <link linkend="zend.controller.modular">Controller
  383. Module</link>.
  384. </para>
  385. </listitem>
  386. <listitem>
  387. <para>
  388. <classname>Zend_Controller_Router_StaticRoute</classname> wurde umbenannt in
  389. <classname>Zend_Controller_Router_Route_Static</classname>.
  390. </para>
  391. </listitem>
  392. <listitem>
  393. <para>
  394. <classname>Zend_Controller_Dispatcher</classname> wurde umbenannt in
  395. <classname>Zend_Controller_Dispatcher_Standard</classname>.
  396. </para>
  397. </listitem>
  398. <listitem>
  399. <para>
  400. <classname>Zend_Controller_Action::_forward()</classname>'s Argumente wurden
  401. geändert. Die Signatur ist nun:
  402. </para>
  403. <programlisting role="php"><![CDATA[
  404. final protected function _forward($action,
  405. $controller = null,
  406. $module = null,
  407. array $params = null);
  408. ]]></programlisting>
  409. <para>
  410. <code>$action</code> wird immer benötigt; wenn kein Controller angegeben wird,
  411. wird eine Action im aktuellen Controller angenommen. <code>$module</code> wird
  412. immer ignoriert, es sei denn <code>$controller</code> wird angegeben.
  413. Schließlich werden alle übergebenen Parameter <code>$params</code> an das
  414. Request Objekt angehängt. Wenn man keinen Controller oder kein Modul angeben,
  415. aber dennoch Parameter übergeben möchte, gibt man einfach null für diese Werte
  416. an.
  417. </para>
  418. </listitem>
  419. </itemizedlist>
  420. </sect2>
  421. <sect2 id="zend.controller.migration.fromzerotwo">
  422. <title>Migration von 0.2.0 oder früher nach 0.6.0</title>
  423. <para>
  424. Die grundlegende Verwendung der MVC Komponenten hat sich nicht verändert; man kann immer
  425. noch das folgende machen:
  426. </para>
  427. <programlisting role="php"><![CDATA[
  428. require_once 'Zend/Controller/Front.php';
  429. Zend_Controller_Front::run('/path/to/controllers');
  430. ]]></programlisting>
  431. <programlisting role="php"><![CDATA[
  432. /* -- Erstelle einen Router -- */
  433. $router = new Zend_Controller_RewriteRouter();
  434. $router->addRoute('user',
  435. 'user/:username',
  436. array('controller' => 'user', 'action' => 'info')
  437. );
  438. /* -- Setze ihn im Controller -- */
  439. $ctrl = Zend_Controller_Front::getInstance();
  440. $ctrl->setRouter($router);
  441. /* -- Setze da Controller Verzeichnis und starte die Verarbeitung -- */
  442. $ctrl->setControllerDirectory('/path/to/controllers');
  443. $ctrl->dispatch();
  444. ]]></programlisting>
  445. <para>
  446. Wir empfehlen die Verwendung des Response Objektes, um Inhalte und Header zu sammeln.
  447. Dies erlaubt den flexibleren Wechsel von Ausgabeformaten (z.B. JSON oder XML statt
  448. XHTML) in deiner Applikation. Standardmäßig verarbeitet <code>dispatch()</code> die
  449. Antwort, sendet Header und gibt die Inhalte aus. Man kann den Front Controller auch
  450. auffordern, die Antwort durch <code>returnResponse()</code> zurückzugeben und die
  451. Antwort dann auf eigene Weise ausgeben. Eine zukünftige Version des Front Controllers
  452. könnte die Verwendung des Response Objektes durch Output Buffering erzwingen.
  453. </para>
  454. <para>
  455. Es gibt viele weitere zusätzliche Funktionalitäten, welche die vorherige API erweitern.
  456. Diese sind in der Dokumentation aufgeführt.
  457. </para>
  458. <para>
  459. Die meisten Änderungen, die man beachten muss, betreffen das Erweitern der diversen
  460. Komponenten. Die wichtigsten davon sind:
  461. </para>
  462. <itemizedlist>
  463. <listitem>
  464. <para>
  465. <classname>Zend_Controller_Front::dispatch()</classname> fängt standardmäßig die
  466. Ausnahmen im Response Objekt ab und gibt sie nicht aus, um sicherzugehen, dass
  467. keine sensitiven Systeminformationen ausgegeben werden. Man kann dies auf
  468. mehrere Arten überschreiben:
  469. </para>
  470. <itemizedlist>
  471. <listitem>
  472. <para>
  473. Setzen von <code>throwExceptions()</code> im Front Controller:
  474. </para>
  475. <programlisting role="php"><![CDATA[
  476. $front->throwExceptions(true);
  477. ]]></programlisting>
  478. </listitem>
  479. <listitem>
  480. <para>
  481. Setzen von <code>renderExceptions()</code> im Response objekt:
  482. </para>
  483. <programlisting role="php"><![CDATA[
  484. $response->renderExceptions(true);
  485. $front->setResponse($response);
  486. $front->dispatch();
  487. // oder:
  488. $front->returnResponse(true);
  489. $response = $front->dispatch();
  490. $response->renderExceptions(true);
  491. echo $response;
  492. ]]></programlisting>
  493. </listitem>
  494. </itemizedlist>
  495. </listitem>
  496. <listitem><para>
  497. <classname>Zend_Controller_Dispatcher_Interface::dispatch()</classname>
  498. akzeptiert und gibt nun ein <xref linkend="zend.controller.request" />
  499. Objekt anstelle eines Dispatcher Token zurück.
  500. </para></listitem>
  501. <listitem><para>
  502. <classname>Zend_Controller_Router_Interface::route()</classname>
  503. akzeptiert und gibt nun ein <xref linkend="zend.controller.request" />
  504. Objekt anstelle eines Dispatcher Token zurück.
  505. </para></listitem>
  506. <listitem>
  507. <para><classname>Zend_Controller_Action</classname> Änderungen beinhalten:</para>
  508. <itemizedlist>
  509. <listitem><para>
  510. Der Konstruktur akzeptiert nun genau drei Argumente,
  511. <classname>Zend_Controller_Request_Abstract $request</classname>,
  512. <classname>Zend_Controller_Response_Abstract $response</classname>, und
  513. <code>array $params (optional)</code>.
  514. <classname>Zend_Controller_Action::__construct()</classname> verwendet
  515. diese, um die Request, Response und invokeArgs Eigenschaften für das Objekt
  516. zu setzen, und beim Überschreiben des Konstrukturs sollte man dies ebenfalls
  517. tun. Besser ist es, die <code>init()</code> Methode zu verwenden, um jedwede
  518. Instanzkonfiguration durchzuführen, weil diese Methode als letzte Methode
  519. des Konstrukturs aufgerufen wird.
  520. </para></listitem>
  521. <listitem><para>
  522. <code>run()</code> ist nicht länger als final definiert, wird aber auch
  523. nicht länger vom Front Controller verwendet; sein einziger Zweck ist, dass
  524. die Klasse auch als Page Controller verwendet werden kann. Sie nimmt nun
  525. zwei optionale Argument an, ein
  526. <classname>Zend_Controller_Request_Abstract $request</classname>
  527. und ein <classname>Zend_Controller_Response_Abstract $response</classname>.
  528. </para></listitem>
  529. <listitem><para>
  530. <code>indexAction()</code> muss nicht mehr länger definiert werden, aber
  531. wird als Standardaktion empfohlen. Dies erlaubt dem RewriteRouter und den
  532. Action Controllern andere Standardaktionsmethoden zu definieren.
  533. </para></listitem>
  534. <listitem><para>
  535. <code>__call()</code> sollte überschrieben werden, um jede undefinierte
  536. Aktion automatisch verarbeiten zu können.
  537. </para></listitem>
  538. <listitem><para>
  539. <code>_redirect()</code> nimmt nun ein optionales zweites Argument entgegen,
  540. den HTTP Code, der mit dem Redirect zurückgegeben werden soll, und ein
  541. optionales drittes Argument <code>$prependBase</code>, das angibt, dass die
  542. im Request Objekt registrierte Basis URL der übergebenen URL voran gestellt
  543. werden soll.
  544. </para></listitem>
  545. <listitem>
  546. <para>
  547. Die <code>_action</code> Eigenschaft wird nicht mehr gesetzt. Diese
  548. Eigenschaft war ein
  549. <classname>Zend_Controller_Dispatcher_Token</classname>, der in der
  550. aktuellen Inkarnation nicht mehr länger existiert. Der einzige Zweck des
  551. Tokens war, Informationen über angeforderte Controller, Aktion und URL
  552. Parameter bereit zu stellen. Diese Infrmationen ist nun im Request
  553. Objekt verfügbar und kann wie folgt abgerufen werden:
  554. </para>
  555. <programlisting role="php"><![CDATA[
  556. // Hole den angeforderten Controllernamen
  557. // Der Zugriff erfolgte bisher über: $this->_action->getControllerName().
  558. // Das Beispiel unten verwendet getRequest(), obwohl man auch direkt auf die
  559. // $_request Eigenschaft zugreifen kann; die Verwendung von getRequest() wird
  560. // empfohlen, da eine Elternklasse den Zugriff auf das Request Objekt
  561. // überschreiben könnte
  562. $controller = $this->getRequest()->getControllerName();
  563. // Hole den angeforderten Aktionsnamen
  564. // Der Zugriff erfolgte bisher über: $this->_action->getActionName().
  565. $action = $this->getRequest()->getActionName();
  566. // Hole die Anfrageparameter
  567. // Dies hat sich nicht verändert; die _getParams() und _getParam()
  568. // Methoden leiten nun einfach auf das Request Objekt weiter.
  569. $params = $this->_getParams();
  570. // fordere den 'foo' Parameter an und verwende
  571. // 'default', wenn kein Standardwert gefunden werden kann
  572. $foo = $this->_getParam('foo', 'default');
  573. ]]></programlisting>
  574. </listitem>
  575. <listitem>
  576. <para>
  577. <code>noRouteAction()</code> wurde entfernt. Der geeignete Weg, um
  578. nicht vorhandene Aktionsmethoden abzufangen, wenn man sie an eine
  579. Standardaktion weiter leiten möchte, sollte die Verwendung von
  580. <code>__call()</code> sein:
  581. </para>
  582. <programlisting role="php"><![CDATA[
  583. public function __call($method, $args)
  584. {
  585. // Wenn eine nicht vorhandene 'Action' Methode angefordert wurde,
  586. // leite auf die Standard Aktionsmethode um:
  587. if ('Action' == substr($method, -6)) {
  588. return $this->defaultAction();
  589. }
  590. throw new Zend_Controller_Exception('Invalid method called');
  591. }
  592. ]]></programlisting>
  593. </listitem>
  594. </itemizedlist>
  595. </listitem>
  596. <listitem><para>
  597. <classname>Zend_Controller_RewriteRouter::setRewriteBase()</classname> wurde
  598. entfernt. Stattdessen soll
  599. <classname>Zend_Controller_Front::setBaseUrl()</classname> verwendet werden (oder
  600. <classname>Zend_Controller_Request_Http::setBaseUrl()</classname>, wenn die Request
  601. Klasse verwendet wird).
  602. </para></listitem>
  603. <listitem><para>
  604. <classname>Zend_Controller_Plugin_Interface</classname> wurde durch
  605. by <classname>Zend_Controller_Plugin_Abstract</classname> ersetzt. Alle Methoden
  606. nehmen nun ein <xref linkend="zend.controller.request" /> Objekt statt eines
  607. Dispatcher Tokens entgegen bzw. geben es zurück.
  608. </para></listitem>
  609. </itemizedlist>
  610. </sect2>
  611. </sect1>
  612. <!--
  613. vim:se ts=4 sw=4 et:
  614. -->