migration-15.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="migration.15">
  5. <title>Zend Framework 1.5</title>
  6. <para>
  7. Wenn man von einem älteren Release auf Zend Framework 1.5 oder höher hochrüstet sollte
  8. man die folgenden Migrations Hinweise beachten.
  9. </para>
  10. <sect2 id="migration.15.zend.controller">
  11. <title>Zend_Controller</title>
  12. <para>
  13. Obwohl die meisten grundsätzlichen Funktionalitäten die gleichen bleiben und alle
  14. dokumentierten Funktionalitäten die gleichen bleiben gibt es doch ein spezielles
  15. <emphasis>undokumentiertes</emphasis> "Feature" das geändert wurde.
  16. </para>
  17. <para>
  18. Wenn <acronym>URL</acronym>s geschrieben werden besteht der dokumentierte Weg darin die
  19. Aktionsnamen camelCased mit einem Trennzeichen zu schreiben; diese sind normalerweise
  20. '.' oder '-', können aber im Dispatcher konfiguriert werden. Der Dispatcher ändert den
  21. Aktionsnamen intern auf Kleinschreibung und verwendet diese Trennzeichen um die
  22. Aktionsmethode wieder zu bauen indem er sie camelCase schreibt. Trotzdem, weil
  23. <acronym>PHP</acronym> Funktionen nicht unabhängig von der Schreibweise sind,
  24. <emphasis>könnte</emphasis> man <acronym>URL</acronym>s mit camelCase schreiben und der
  25. Dispatcher würde diese auf den gleichen Platz auflösen. Zum Beispiel, 'camel-cased'
  26. würde durch den Dispatcher zu 'camelCasedAction' werden; trotzdem, durch den Fall der
  27. unabhängigen Schreibweise in <acronym>PHP</acronym>, würden beide die selbe Methode
  28. ausführen.
  29. </para>
  30. <para>
  31. Das führt zu Problemen mit dem ViewRenderer wenn View Skripte aufgelöst werden. Der
  32. kanonische, dokumentierte Weg besteht darin das alle Trennzeichen zu Bindestrichen
  33. umgewandelt und die Wörter kleingeschrieben werden. Das erzeugt eine semantische
  34. Bindung zwischen Aktionen und View Skripten, und die Normalisierung stellt sicher
  35. das die Skripte gefunden werden. Trotzdem, wenn die Aktion 'camelCased' aufgerufen und
  36. aufgelöst wird, ist das Trennzeichen nicht mehr vorhanden, und der ViewRenderer
  37. versucht einen anderen Ort aufzulösen -- <filename>camelcased.phtml</filename> statt
  38. <filename>camel-cased.phtml</filename>.
  39. </para>
  40. <para>
  41. Einige Entwickler hängen an diesem "Feature", welches nie angedacht war. Verschiedene
  42. Änderungen im 1.5.0 Baum, führen dazu das der ViewRenderer diese Pfade nicht länger
  43. auflöst; die semantische Bindung wird nun erzwungen. Ale erstes, erzwingt der
  44. Dispatcher nun die Groß-/Kleinschreibung in Aktionsnamen. Das bedeutet dass das
  45. hinleiten zu eigenen Aktionen über die URL durch Verwendung von camelCase nicht länger
  46. auf die gleiche Methode aufgelöst wird wie mit Trennzeichen (z.B. 'camel-casing').
  47. Das führt dazu das der ViewRenderer jetzt nur mehr zeichen-getrennte Aktionen
  48. honoriert wenn er View Skripte auflöst.
  49. </para>
  50. <para>
  51. Wenn man findet das man auf dieses "Feature" nicht verzichten kann gibt es mehrere
  52. Optionen:
  53. </para>
  54. <itemizedlist>
  55. <listitem>
  56. <para>
  57. Beste Option: Die View Skripte umbenennen. Vorteile: zukünftige Kompatibilität.
  58. Nachteile: Wenn man viele View Skripte hat die auf dem vorigen aufbauen führt
  59. das, unerwarteter Weise, zu vielen Umbenennungen die durchgeführt werden müssen.
  60. </para>
  61. </listitem>
  62. <listitem>
  63. <para>
  64. Zweitbeste Option: Der ViewRenderer delegiert nun die Auflösung von View
  65. Skripten zu <classname>Zend_Filter_Inflector</classname>; man kann die Regeln
  66. des Inflectors ändern damit er nicht länger die Wörter der Aktion mit einem
  67. Bindestrich trennt:
  68. </para>
  69. <programlisting language="php"><![CDATA[
  70. $viewRenderer =
  71. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  72. $inflector = $viewRenderer->getInflector();
  73. $inflector->setFilterRule(':action', array(
  74. new Zend_Filter_PregReplace(
  75. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  76. ''
  77. ),
  78. 'StringToLower'
  79. ));
  80. ]]></programlisting>
  81. <para>
  82. Der obige Code ändert den Inflector so, das er Wörter nicht länger mit einem
  83. Bindestrich trennt; Es kann auch gewünscht sein den 'StringToLower' Filter zu
  84. entfernen man die aktuellen View Skripte camelCased benannt haben
  85. <emphasis>will</emphasis>.
  86. </para>
  87. <para>
  88. Wenn die Umbenennung der View Skripte zu aufwendig oder Zeitintensiv ist, dann
  89. ist das die beste Option wenn man die Zeit hierfür findet.
  90. </para>
  91. </listitem>
  92. <listitem>
  93. <para>
  94. Die am wenigsten zu empfehlende Option: Man kann den Dispatcher dazu zwingen
  95. camelCase Aktionsnamen mit einem neuen Front Controller Flag
  96. <property>useCaseSensitiveActions</property> zu bearbeiten:
  97. </para>
  98. <programlisting language="php"><![CDATA[
  99. $front->setParam('useCaseSensitiveActions', true);
  100. ]]></programlisting>
  101. <para>
  102. Das erlaubt es camelCase in der URL zu verwenden uns es trotzdem auf die
  103. gleiche Aktion aufzulösen wie wenn Trennzeichen verwendet worden wären. Das
  104. bedeutet dass das Originale Problem trotzdem durchschlägt; es kann notwendig
  105. sein die zweite Option von oben zusätzlich zu verwenden um sicherzustellen
  106. das die Dinge in allen Variationen funktionieren.
  107. </para>
  108. <para>
  109. Man sollte auch beachten das die Verwendung dieses Flags eine Notiz auslöst,
  110. das dessen Verwendung nicht mehr durchgeführt werden sollte.
  111. </para>
  112. </listitem>
  113. </itemizedlist>
  114. </sect2>
  115. </sect1>