migration-110.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="migration.110">
  5. <title>Zend Framework 1.10</title>
  6. <para>
  7. Wenn man von einem älteren Release auf Zend Framework 1.10 oder höher hochrüstet sollte
  8. man die folgenden Migrations Hinweise beachten.
  9. </para>
  10. <sect2 id="migration.110.zend.controller.front">
  11. <title>Zend_Controller_Front</title>
  12. <para>
  13. Ein fehlerhaftes Verhalten wurde behoben, welches aufgetreten ist wenn keine Modell
  14. Route und keine Route mit der angegebenen Anfrage übereinstimmt. Vorher hat der Router
  15. das nicht modifizierte Anfrageobjekt zurückgegeben, und der Frontcontroller hat damit
  16. nur den Standardcontroller und die Standardaktion angezeigt. Seit Zend Framework 1.10
  17. wirft der Router korrekterweise, wie im Router Interface beschrieben, eine Exception
  18. wenn keine passende Route vorhanden ist. Das Error Plugin fängt die Exception und leitet
  19. Sie an den Errorcontroller weiter. Man kann mit der Konstante
  20. <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE</constant> auf einen
  21. spezifischen Fehler testen:
  22. </para>
  23. <programlisting language="php"><![CDATA[
  24. /**
  25. * Vor 1.10
  26. */
  27. public function errorAction()
  28. {
  29. $errors = $this->_getParam('error_handler');
  30. switch ($errors->type) {
  31. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  32. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  33. // ...
  34. /**
  35. * Ab 1.10
  36. */
  37. public function errorAction()
  38. {
  39. $errors = $this->_getParam('error_handler');
  40. switch ($errors->type) {
  41. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
  42. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  43. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  44. // ...
  45. ]]></programlisting>
  46. </sect2>
  47. <sect2 id="migration.110.zend.feed.reader">
  48. <title>Migrating from 1.9.6 to 1.10 or later</title>
  49. <para>
  50. Mit der Einführung von Zend Framework 1.10 wurde die Behandlung für das Empfangen von
  51. Autoren und Entwicklern in <classname>Zend_Feed_Reader</classname> geändert. Diese
  52. Änderung war ein Weg die Behandlung solcher Daten zwischen RSS und Atom Klassen zwischen
  53. den Komponenten zu harmonisieren und die Rückgabe von Autoren und Entwicklern in einer
  54. besseren, verwendbareren und detailuerteren Form zu ermöglichen. Das korrigiert auch
  55. einen Fehler bei dem angenommen wurde das jedes Autor Element auf einen Namen zeigt.
  56. In RSS ist das falsch, da ein Autor Element aktuell nur eine Email Adresse anbieten
  57. muss. Zusätzlich fügte die originale Implementation seine RSS Limits bei Atom Feeds
  58. hinzu was zu einer Reduzierung der Nützlichkeit des Parsers mit diesem Format führte.
  59. </para>
  60. <para>
  61. Die Änderung bedeutet das Methoden wie <methodname>getAuthors()</methodname> und
  62. <methodname>getContributors</methodname> nicht länger ein einfaches Array von Strings
  63. zurückgeben die von den relevanten RSS und Atom Elementen geparst wurden Statt dessen
  64. ist der Rückgabewert eine Unterklasse von <classname>ArrayObject</classname> die
  65. <classname>Zend_Feed_Reader_Collection_Author</classname> genannt wird und ein
  66. aufzählbares multidimensionales Array an Autoren simuliert. Jedes Mitglied dieses
  67. Objekts ist ein einfaches Array mit drei potentiellen Schlüsseln (wie in den
  68. Quelldaten erlaubt). Diese beinhalten name, email und uri.
  69. </para>
  70. <para>
  71. Das originale Verhalten dieser Methoden würde ein einfaches Array von Strings
  72. zurückgeben, wobei jeder String versucht einen einzelnen Namen zu präsentieren, aber in
  73. der Realität war dies nicht möglich da es keine Regel gibt die das Format der RSS
  74. Autor Strings leiten.
  75. </para>
  76. <para>
  77. Die einfachste Methode der Simulation des originalen Verhaltens dieser Methoden ist die
  78. Verwendung von <classname>Zend_Feed_Reader_Collection_Author</classname>'s
  79. <methodname>getValues()</methodname> welche auch ein einfaches Array an Strings
  80. darstellt und die "relevantesten Daten" repräsentiert. Für Autoren wird deren Name
  81. angenommen. Jeder Wert in resultierenden Array wird vom "name" Wert abgeleitet welcher
  82. jedem Autor angehängt ist (wenn vorhanden). In den meisten Fällen ist diese einfache
  83. Änderung einfach durchzuführen wie anbei demonstriert.
  84. </para>
  85. <programlisting language="php"><![CDATA[
  86. /**
  87. * In 1.9.6
  88. */
  89. $feed = Zend_Feed_Reader::import('http://example.com/feed');
  90. $authors = $feed->getAuthors();
  91. /**
  92. * Äquivalent in 1.10
  93. */
  94. $feed = Zend_Feed_Reader::import('http://example.com/feed');
  95. $authors = $feed->getAuthors()->getValues();
  96. ]]></programlisting>
  97. </sect2>
  98. <sect2 id="migration.110.zend.filter.html-entities">
  99. <title>Zend_Filter_HtmlEntities</title>
  100. <para>
  101. Um zu einem höheren Sicherheitsstandard für die Zeichenkodierung zu kommen, ist der
  102. Standardwert von <classname>Zend_Filter_HtmlEntities</classname> jetzt
  103. <acronym>UTF-8</acronym> statt <acronym>ISO-8859-1</acronym>.
  104. </para>
  105. <para>
  106. Zusätzlich, weil der aktuelle Mechanismus mit Zeichenkodierung handelt und nicht mit
  107. Zeichensets, wurden zwei Methoden hinzugefügt. <methodname>setEncoding()</methodname>
  108. und <methodname>getEncoding()</methodname>. Die vorhergehenden Methoden
  109. <methodname>setCharSet()</methodname> und <methodname>setCharSet()</methodname> sind
  110. jetzt deprecated und verweisen auf die neuen Methoden. Letztendlich, statt die
  111. geschützten Mitglieder in der <methodname>filter()</methodname> Methode direkt zu
  112. verwenden, werden Sie durch Ihre expliziten Zugriffsmethoden empfangen. Wenn man den
  113. Filter in der Vergangenheit erweitert hat, sollte man seinen Code und seine Unittests
  114. prüfen um sicherzustellen das weiterhin alles funktioniert.
  115. </para>
  116. </sect2>
  117. <sect2 id="migration.110.zend.filter.strip-tags">
  118. <title>Zend_Filter_StripTags</title>
  119. <para>
  120. <classname>Zend_Filter_StripTags</classname> enthielt in voehergehenden Versionen ein
  121. <varname>commentsAllowed</varname> Flag, welches es erlaubt hat <acronym>HTML</acronym>
  122. Kommentare in von dieser Klasse gefiltertem <acronym>HTML</acronym> Text als erlaubt zu
  123. markieren. Aber das öffnet den Weg für <acronym>XSS</acronym> Attacken, speziell im
  124. Internet Explorer (der es erlaubt konditionelle Funktionalität über
  125. <acronym>HTML</acronym> Kommentare zu spezifizieren). Beginnend mit Version 1.9.7 (und
  126. retour mit den Versionen 1.8.5 und 1.7.9), hat das <varname>commentsAllowed</varname>
  127. Flag keine Bedeutung meht, und alle <acronym>HTML</acronym> Kommentare, inklusive denen
  128. die andere <acronym>HTML</acronym> Tags oder untergeordnete Kommentare enthalten, werden
  129. von der endgültigen Aufgabe des Filters entfernt.
  130. </para>
  131. </sect2>
  132. <sect2 id="migration.110.zend.file.transfer">
  133. <title>Zend_File_Transfer</title>
  134. <sect3 id="migration.110.zend.file.transfer.files">
  135. <title>Sicherheitsänderung</title>
  136. <para>
  137. Aus Gründen der Sicherheit speichert <classname>Zend_File_Transfer</classname> nicht
  138. länger die originalen Mimetypen und Dateigrößen welche vom anfragenden Client
  139. angegeben wurden in seinem internen Speicher. Stattdessen werden die echten Werte
  140. bei der Instanzierung erkannt.
  141. </para>
  142. <para>
  143. Zusätzlich werden die originalen Werte in <varname>$_FILES</varname> bei der
  144. Instanzierung mit den echten Werten überschrieben. Das macht auch
  145. <varname>$_FILES</varname> sicher.
  146. </para>
  147. <para>
  148. Wenn man die originalen Werte benötigt, kann man diese entweder vor der
  149. Instanzierung von <classname>Zend_File_Transfer</classname> speichern, oder bei der
  150. Instanzierung die Option <property>disableInfos</property> verwenden. Es ist zu
  151. beachten das diese Option sinnlos ist wenn Sie nach der Instanzierung verwendet
  152. wird.
  153. </para>
  154. </sect3>
  155. <sect3 id="migration.110.zend.file.transfer.count">
  156. <title>Count Prüfung</title>
  157. <para>
  158. Vor dem Release 1.10 hat die <classname>MimeType</classname> Prüfung eine falsche
  159. Benennung verwendet. Aus Gründen der Konsistenz wurden die folgenden Konstanten
  160. geändert:
  161. </para>
  162. <table id="migration.110.zend.file.transfer.count.table">
  163. <title>Geänderte Prüfmeldungen</title>
  164. <tgroup cols="4">
  165. <thead>
  166. <row>
  167. <entry>Alt</entry>
  168. <entry>Neu</entry>
  169. <entry>Wert</entry>
  170. </row>
  171. </thead>
  172. <tbody>
  173. <row>
  174. <entry><constant>TOO_MUCH</constant></entry>
  175. <entry><constant>TOO_MANY</constant></entry>
  176. <entry>
  177. Too many files, maximum '%max%' are allowed but '%count%' are given
  178. </entry>
  179. </row>
  180. <row>
  181. <entry><constant>TOO_LESS</constant></entry>
  182. <entry><constant>TOO_FEW</constant></entry>
  183. <entry>
  184. Too few files, minimum '%min%' are expected but '%count%' are given
  185. </entry>
  186. </row>
  187. </tbody>
  188. </tgroup>
  189. </table>
  190. <para>
  191. Wenn man diese Meldungen im eigenen Code übersetzt dann sollte man die neuen
  192. Konstanten verwenden. Als Vorteil muss man den originalen String im englischen nicht
  193. mehr übersetzen um die richtige Schreibweise zu erhalten.
  194. </para>
  195. </sect3>
  196. </sect2>
  197. <sect2 id="migration.110.zend.translate">
  198. <title>Zend_Translate</title>
  199. <sect3 id="migration.110.zend.translate.xliff">
  200. <title>Xliff Adapter</title>
  201. <para>
  202. In der Vergangenheit hat der Xliff Adapter den Source String als Message Id
  203. verwendet. Laut dem Xliff Standard sollte die trans-unit Id verwendet werden.
  204. Dieses Verhalten wurde mit Zend Framework 1.10 korrigiert. Jetzt wird
  205. standardmäßig die trans-unit Id als Message Id verwendet.
  206. </para>
  207. <para>
  208. Aber man kann trotzdem das falsch und alte Verhalten bekommen indem die
  209. <property>useId</property> Option auf <constant>FALSE</constant> gesetzt wird.
  210. </para>
  211. <programlisting language="php"><![CDATA[
  212. $trans = new Zend_Translate(
  213. 'xliff', '/path/to/source', $locale, array('useId' => false)
  214. );
  215. ]]></programlisting>
  216. </sect3>
  217. </sect2>
  218. <sect2 id="migration.110.zend.validate">
  219. <title>Zend_Validate</title>
  220. <sect3 id="migration.110.zend.validate.selfwritten">
  221. <title>Selbst geschriebene Adapter</title>
  222. <para>
  223. Wenn in einer selbst geschriebenen Prüfung ein Fehler gesetzt wird um diesen
  224. zurückzugeben muß die <methodname>_error()</methodname> Methode aufgerufen werden.
  225. Vor Zend Framework 1.10 konnte man diese Methode ohne einen angegebenen Parameter
  226. aufrufen. Es wurde dann das erste gefundene Nachrichtentemplate verwendet.
  227. </para>
  228. <para>
  229. Dieses Verhalten ist problematisch wenn man Prüfungen hat die mehr als eine
  230. Nachricht zurückgeben kann. Auch wenn man eine existierende Prüfung erweitert kann
  231. man unerwartete Ergebnisse erhalten. Das kann zum Problem führen das der Benutzer
  232. nicht die Nachricht erhält die man erwartet.
  233. </para>
  234. <programlisting language="php"><![CDATA[
  235. My_Validator extends Zend_Validate_Abstract
  236. {
  237. public isValid($value)
  238. {
  239. ...
  240. $this->_error(); // Unerwartete Ergebnisse zwischen verschiedenen OS
  241. ...
  242. }
  243. }
  244. ]]></programlisting>
  245. <para>
  246. Um dieses Problem zu verhindern erlaubt es die <methodname>_error()</methodname>
  247. Methode nicht mehr ohne einen angegebenen Parameter aufgerufen zu werden.
  248. </para>
  249. <programlisting language="php"><![CDATA[
  250. My_Validator extends Zend_Validate_Abstract
  251. {
  252. public isValid($value)
  253. {
  254. ...
  255. $this->_error(self::MY_ERROR);
  256. // Definierter Fehler, keine unerwarteten Ergebnisse
  257. ...
  258. }
  259. }
  260. ]]></programlisting>
  261. </sect3>
  262. <sect3 id="migration.110.zend.validate.datevalidator">
  263. <title>Vereinfachungen im Date Prüfer</title>
  264. <para>
  265. Vor Zend Framework 1.10 wurden 2 identische Nachrichten im Date Prüfer geworfen.
  266. Es gab <constant>NOT_YYYY_MM_DD</constant> und <constant>FALSEFORMAT</constant>.
  267. Ab Zend Framework 1.10 wird nur mehr die <constant>FALSEFORMAT</constant> Meldung
  268. zurückgegeben wenn das angegebene Datum mit dem gesetzten Format nicht
  269. übereinstimmt.
  270. </para>
  271. </sect3>
  272. <sect3 id="migration.110.zend.validate.barcodevalidator">
  273. <title>Fehlerbehebungen im Alpha, Alum und Barcode Prüfer</title>
  274. <para>
  275. Vor dem Zend Framework 1.10 waren Nachrichten in den 2 Barcode Adaptern, dem Alpha
  276. und dem Alnum Prüfer identisch. Das führte zu Problemen bei der Verwendung von
  277. eigenen Meldungen, Übersetzungen oder mehreren Instanzen dieser Prüfer.
  278. </para>
  279. <para>
  280. Mit Zend Framework 1.10 wurden die Werte dieser Konstanten so geändert das Sie
  281. eindeutig sind. Wenn man, so wie es im Handbuhc erklärt wird, die Konstanten
  282. verwendet gibt es keine Änderungen. Aber wenn man den Inhalt der Konstanten im
  283. eigenen Code verwendet dann muß man diese Ändern. Die folgende Tabelle zeigt die
  284. geänderten Werte:
  285. </para>
  286. <table id="migration.110.zend.validate.barcodevalidator.table">
  287. <title>Vorhandenen Meldungen der Prüfer</title>
  288. <tgroup cols="3">
  289. <thead>
  290. <row>
  291. <entry>Prüfer</entry>
  292. <entry>Konstante</entry>
  293. <entry>Wert</entry>
  294. </row>
  295. </thead>
  296. <tbody>
  297. <row>
  298. <entry><classname>Alnum</classname></entry>
  299. <entry><constant>STRING_EMPTY</constant></entry>
  300. <entry>alnumStringEmpty</entry>
  301. </row>
  302. <row>
  303. <entry><classname>Alpha</classname></entry>
  304. <entry><constant>STRING_EMPTY</constant></entry>
  305. <entry>alphaStringEmpty</entry>
  306. </row>
  307. <row>
  308. <entry><classname>Barcode_Ean13</classname></entry>
  309. <entry><constant>INVALID</constant></entry>
  310. <entry>ean13Invalid</entry>
  311. </row>
  312. <row>
  313. <entry><classname>Barcode_Ean13</classname></entry>
  314. <entry><constant>INVALID_LENGTH</constant></entry>
  315. <entry>ean13InvalidLength</entry>
  316. </row>
  317. <row>
  318. <entry><classname>Barcode_UpcA</classname></entry>
  319. <entry><constant>INVALID_LENGTH</constant></entry>
  320. <entry>upcaInvalidLength</entry>
  321. </row>
  322. <row>
  323. <entry><classname>Digits</classname></entry>
  324. <entry><constant>STRING_EMPTY</constant></entry>
  325. <entry>digitsStringEmpty</entry>
  326. </row>
  327. </tbody>
  328. </tgroup>
  329. </table>
  330. </sect3>
  331. </sect2>
  332. </sect1>