Al actualizar desde una versión anterior a Zend Framework 1.5 o superior debe tener en cuenta las siguientes notas de migración.
Aunque la mayor parte de la funcionalidad básica permanece igual, y toda la funcionalidad documentada permanece igual, hay una "característica" no documentada en particular que ha cambiado.
Al escribir URLs, la forma documentada de escribir nombres de acción en camelCase es usar un separador de palabras; estos son '.' o '-' por defecto, pero pueden configurarse en el dispatcher. El dispatcher internamente convierte el nombre de la acción a minúsculas, y usa estos separadores de palabras para reensamblar el método de acción usando camelCasing. Sin embargo, debido a que las funciones de PHP no distinguen entre mayúsculas y minúsculas, podía escribir URLs usando camelCasing, y el dispatcher resolvería estas a la misma ubicación. Por ejemplo, 'camel-cased' se convertiría en 'camelCasedAction' por el dispatcher, mientras que 'camelCased' se convertiría en 'camelcasedAction'; sin embargo, debido a la insensibilidad a mayúsculas/minúsculas de PHP, ambos ejecutarán el mismo método.
Esto causa problemas con el ViewRenderer al resolver los scripts de vista.
La forma canónica y documentada es que todos los separadores de palabras
se convierten en guiones, y las palabras se ponen en minúsculas. Esto crea
un vínculo semántico entre las acciones y los scripts de vista, y la
normalización garantiza que los scripts puedan encontrarse. Sin embargo, si se
llama a la acción 'camelCased' y esta realmente se resuelve, el separador
de palabras ya no está presente, y el ViewRenderer intenta
resolver a una ubicación diferente -- camelcased.phtml en lugar de
camel-cased.phtml.
Algunos desarrolladores dependían de esta "característica", que nunca fue intencional. Sin embargo, varios cambios en el árbol 1.5.0 hicieron que el ViewRenderer ya no resuelva estas rutas; el vínculo semántico ahora se aplica de forma estricta. En primer lugar, el dispatcher ahora aplica la sensibilidad a mayúsculas/minúsculas en los nombres de las acciones. Esto significa que referirse a sus acciones en la url usando camelCasing ya no resolverá al mismo método que usando separadores de palabras (es decir, 'camel-casing'). Esto hace que el ViewRenderer ahora solo reconozca las acciones separadas por palabras al resolver los scripts de vista.
Si descubre que dependía de esta "característica", tiene varias opciones:
Mejor opción: renombre sus scripts de vista. Pros: compatibilidad hacia adelante. Contras: si tiene muchos scripts de vista que dependían del comportamiento anterior, no intencional, tendrá mucho renombrado por hacer.
-
Segunda mejor opción: El ViewRenderer ahora delega la resolución de scripts de vista a
Zend_Filter_Inflector; puede modificar las reglas del inflector para que ya no separe las palabras de una acción con un guion:$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $inflector = $viewRenderer->getInflector(); $inflector->setFilterRule(':action', array( new Zend_Filter_PregReplace( '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i', '' ), 'StringToLower' ));El código anterior modificará el inflector para que ya no separe las palabras con guion; también puede querer eliminar el filtro 'StringToLower' si desea que los nombres reales de los scripts de vista sean también camelCase.
Si renombrar sus scripts de vista fuera demasiado tedioso o llevara mucho tiempo, esta es su mejor opción hasta que pueda encontrar el tiempo para hacerlo.
-
Opción menos deseable: puede forzar al dispatcher a despachar nombres de acción en camelCase con una nueva bandera del front controller, useCaseSensitiveActions:
$front->setParam('useCaseSensitiveActions', true);Esto le permitirá usar camelCasing en la url y aun así hacer que se resuelva a la misma acción que cuando usa separadores de palabras. Sin embargo, esto significará que los problemas originales se propagarán en cascada; probablemente necesitará usar la segunda opción anterior además de esta para que las cosas funcionen de forma fiable en todos los casos.
Tenga en cuenta, además, que el uso de esta bandera generará un aviso de que este uso está en desuso.