TigerZF
🌐Español

B.5. Zend Framework 1.7

Al actualizar desde una versión anterior a Zend Framework 1.7 o superior debe tener en cuenta las siguientes notas de migración.

B.5.1. Zend_Controller

B.5.1.1. Cambios en la interfaz Dispatcher

Los usuarios nos hicieron notar el hecho de que Zend_Controller_Action_Helper_ViewRenderer estaba utilizando un método de la clase abstracta del dispatcher que no estaba en la interfaz del dispatcher. Ahora hemos añadido el siguiente método para asegurar que los dispatchers personalizados sigan funcionando con las implementaciones proporcionadas:

  • formatModuleName(): debe utilizarse para tomar un nombre de controlador en bruto, como el que se empaquetaría dentro de un objeto request, y reformatearlo a un nombre de clase apropiado que una clase que extienda de Zend_Controller_Action pueda usar

B.5.2. Zend_File_Transfer

B.5.2.1. Cambios al usar filtros y validadores

Como han hecho notar los usuarios, los validadores de Zend_File_Transfer no funcionan en conjunto con Zend_Config debido a que no utilizaban arrays con claves con nombre.

Por ello, todos los filtros y validadores de Zend_File_Transfer han sido rediseñados. Aunque las firmas antiguas siguen funcionando, han sido marcadas como obsoletas y emitirán un aviso de PHP pidiéndole que las corrija.

La siguiente lista muestra los cambios que deberá realizar para el uso correcto de los parámetros.

B.5.2.1.1. Filtro: Rename
  • API del método antiguo: Zend_Filter_File_Rename($oldfile, $newfile, $overwrite)

  • API del método nuevo: Zend_Filter_File_Rename($options) donde $options acepta las siguientes claves de array: source equivale a $oldfile, target equivale a $newfile, overwrite equivale a $overwrite.

Ejemplo B.4. Cambios en el filtro rename de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addFilter('Rename',
                   array('/path/to/oldfile', '/path/to/newfile', true));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addFilter('Rename',
                   array('source' => '/path/to/oldfile',
                         'target' => '/path/to/newfile',
                         'overwrite' => true));

B.5.2.1.2. Validador: Count
  • API del método antiguo: Zend_Validate_File_Count($min, $max)

  • API del método nuevo: Zend_Validate_File_Count($options) donde $options acepta las siguientes claves de array: min equivale a $min, max equivale a $max.

Ejemplo B.5. Cambios en el validador count de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Count',
                      array(2, 3));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Count',
                      false,
                      array('min' => 2,
                            'max' => 3));

B.5.2.1.3. Validador: Extension
  • API del método antiguo: Zend_Validate_File_Extension($extension, $case)

  • API del método nuevo: Zend_Validate_File_Extension($options) donde $options acepta las siguientes claves de array: * equivale a $extension y puede tener cualquier otra clave, case equivale a $case.

Ejemplo B.6. Cambios en el validador extension de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Extension',
                      array('jpg,gif,bmp', true));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Extension',
                      false,
                      array('extension1' => 'jpg,gif,bmp',
                            'case' => true));

B.5.2.1.4. Validador: FilesSize
  • API del método antiguo: Zend_Validate_File_FilesSize($min, $max, $bytestring)

  • API del método nuevo: Zend_Validate_File_FilesSize($options) donde $options acepta las siguientes claves de array: min equivale a $min, max equivale a $max, bytestring equivale a $bytestring.

Adicionalmente, la firma del método useByteString() ha cambiado. Ahora solo puede utilizarse para comprobar si el validador espera utilizar cadenas de bytes en los mensajes generados. Para establecer el valor del indicador, use el método setUseByteString().

Ejemplo B.7. Cambios en el validador filessize de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('FilesSize',
                   array(100, 10000, true));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('FilesSize',
                      false,
                      array('min' => 100,
                            'max' => 10000,
                            'bytestring' => true));

// Example for 1.6
$upload->useByteString(true); // set flag

// Same example for 1.7
$upload->setUseByteSting(true); // set flag

B.5.2.1.5. Validador: Hash
  • API del método antiguo: Zend_Validate_File_Hash($hash, $algorithm)

  • API del método nuevo: Zend_Validate_File_Hash($options) donde $options acepta las siguientes claves de array: * equivale a $hash y puede tener cualquier otra clave, algorithm equivale a $algorithm.

Ejemplo B.8. Cambios en el validador hash de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Hash',
                   array('12345', 'md5'));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Hash',
                      false,
                      array('hash1' => '12345',
                            'algorithm' => 'md5'));

B.5.2.1.6. Validador: ImageSize
  • API del método antiguo: Zend_Validate_File_ImageSize($minwidth, $minheight, $maxwidth, $maxheight)

  • API del método nuevo: Zend_Validate_File_FilesSize($options) donde $options acepta las siguientes claves de array: minwidth equivale a $minwidth, maxwidth equivale a $maxwidth, minheight equivale a $minheight, maxheight equivale a $maxheight.

Ejemplo B.9. Cambios en el validador imagesize de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('ImageSize',
                      array(10, 10, 100, 100));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('ImageSize',
                      false,
                      array('minwidth' => 10,
                            'minheight' => 10,
                            'maxwidth' => 100,
                            'maxheight' => 100));

B.5.2.1.7. Validador: Size
  • API del método antiguo: Zend_Validate_File_Size($min, $max, $bytestring)

  • API del método nuevo: Zend_Validate_File_Size($options) donde $options acepta las siguientes claves de array: min equivale a $min, max equivale a $max, bytestring equivale a $bytestring.

Ejemplo B.10. Cambios en el validador size de la 1.6 a la 1.7

// Example for 1.6
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Size',
                      array(100, 10000, true));

// Same example for 1.7
$upload = new Zend_File_Transfer_Adapter_Http();
$upload->addValidator('Size',
                      false,
                      array('min' => 100,
                            'max' => 10000,
                            'bytestring' => true));

B.5.3. Zend_Locale

B.5.3.1. Cambios al usar isLocale()

Según los estándares de codificación, isLocale() tuvo que ser modificado para devolver un booleano. En versiones anteriores se devolvía una cadena en caso de éxito. Para la versión 1.7 se ha añadido un modo de compatibilidad que permite usar el antiguo comportamiento de devolver una cadena, pero que lanza un aviso al usuario mencionando que debe cambiar al nuevo comportamiento. El reencaminamiento que el antiguo comportamiento de isLocale() podía haber realizado ya no es necesario, ya que todos los procesos de I18n ahora gestionarán el reencaminamiento por sí mismos.

Para migrar sus scripts a la nueva API, simplemente utilice el método como se muestra a continuación.

Ejemplo B.11. Cómo cambiar isLocale() de la 1.6 a la 1.7

// Example for 1.6
if ($locale = Zend_Locale::isLocale($locale)) {
    // do something
}

// Same example for 1.7

// You should change the compatiblity mode to prevent user warnings
// But you can do this in your bootstrap
Zend_Locale::$compatibilityMode = false;

if (Zend_Locale::isLocale($locale)) {
}

Tenga en cuenta que puede usar el segundo parámetro para ver si el locale es correcto sin procesar un reencaminamiento.

// Example for 1.6
if ($locale = Zend_Locale::isLocale($locale, false)) {
    // do something
}

// Same example for 1.7

// You should change the compatiblity mode to prevent user warnings
// But you can do this in your bootstrap
Zend_Locale::$compatibilityMode = false;

if (Zend_Locale::isLocale($locale, false)) {
    if (Zend_Locale::isLocale($locale, true)) {
        // no locale at all
    }

    // original string is no locale but can be rerouted
}

B.5.3.2. Cambios al usar getDefault()

El significado del método getDefault() ha cambiado debido a que hemos integrado un locale de framework que puede establecerse con setDefault(). Ya no devuelve la cadena de locales, sino únicamente el locale de framework establecido.

Para migrar sus scripts a la nueva API, simplemente utilice el método como se muestra a continuación.

Ejemplo B.12. Cómo cambiar getDefault() de la 1.6 a la 1.7

// Example for 1.6
$locales = $locale->getDefault(Zend_Locale::BROWSER);

// Same example for 1.7

// You should change the compatiblity mode to prevent user warnings
// But you can do this in your bootstrap
Zend_Locale::$compatibilityMode = false;

$locale = Zend_Locale::getOrder(Zend_Locale::BROWSER);

Tenga en cuenta que el segundo parámetro de la antigua implementación de getDefault() ya no está disponible, pero los valores devueltos son los mismos.


[Note] Nota

Por defecto el comportamiento antiguo sigue activo, pero lanza un aviso al usuario. Cuando haya modificado su código al nuevo comportamiento, también debería cambiar el modo de compatibilidad a FALSE para que no se lance más el aviso.

B.5.4. Zend_Translate

B.5.4.1. Estableciendo idiomas

Al usar la detección automática de idiomas, o al establecer idiomas manualmente en Zend_Translate, es posible que haya notado que de vez en cuando se lanza un aviso sobre traducciones no añadidas o vacías. En algunas versiones anteriores también se lanzaba una excepción en algunos casos.

La razón es que, cuando un usuario solicita un idioma que no existe, no tiene una forma sencilla de detectar qué está fallando. Por ello añadimos esos avisos que aparecen en su registro y le indican que el usuario solicitó un idioma que usted no soporta. Tenga en cuenta que el código, incluso cuando lanzamos dicho aviso, sigue funcionando sin problemas.

Pero cuando usa su propio manejador de errores o excepciones, como xdebug, obtendrá todos los avisos devueltos, aunque esa no fuera su intención. Esto se debe a que dichos manejadores anulan todas las configuraciones dentro de PHP.

Para deshacerse de estos avisos simplemente puede establecer la nueva opción 'disableNotices' a TRUE. Por defecto es FALSE.

Ejemplo B.13. Establecer idiomas sin recibir avisos

Supongamos que tenemos disponible 'en' y nuestro usuario solicita 'fr', que no está en nuestro repertorio de idiomas traducidos.

$language = new Zend_Translate('gettext',
                               '/path/to/translations',
                               'auto');

En este caso obtendremos un aviso sobre un idioma no disponible 'fr'. Simplemente añada la opción y los avisos se deshabilitarán.

$language = new Zend_Translate('gettext',
                               '/path/to/translations',
                               'auto',
                               array('disableNotices' => true));

B.5.5. Zend_View

[Note] Nota

Los cambios de API dentro de Zend_View son relevantes únicamente si está actualizando a la versión 1.7.5 o superior.

Antes de la versión 1.7.5, el equipo de Zend Framework fue notificado de una posible vulnerabilidad de Inclusión de Archivo Local (LFI) en el método Zend_View::render(). Antes de la 1.7.5, el método permitía, por defecto, la posibilidad de especificar scripts de vista que incluyeran notación de directorio padre (por ejemplo, "../" o "..\"). Esto abre la posibilidad de un ataque de LFI si se pasa entrada de usuario sin filtrar al método render():

// Where $_GET['foobar'] = '../../../../etc/passwd'
echo $view->render($_GET['foobar']); // LFI inclusion

Zend_View ahora, por defecto, lanza una excepción cuando se solicita un script de vista de este tipo.

B.5.5.1. Deshabilitar la protección LFI para el método render()

Dado que varios desarrolladores informaron que estaban usando dicha notación dentro de sus aplicaciones que no era el resultado de entrada de usuario, se creó un indicador especial para permitir deshabilitar la protección por defecto. Tiene dos formas de hacerlo: pasando la clave 'lfiProtectionOn' a las opciones del constructor, o llamando explícitamente al método setLfiProtection().

// Disabling via constructor
$view = new Zend_View(array('lfiProtectionOn' => false));

// Disabling via exlicit method call:
$view = new Zend_View();
$view->setLfiProtection(false);