noviembre
30

Cada vez que CakePHP lanza una nueva versión basta con actualizar el directorio cake con los nuevos archivos y (por lo general) todo funciona correctamente. Sin embargo, hay veces en que se producen algunos errores que pueden pasar desapercibidos para los casos de testing y lamentablemente estos bugs llegan a producción. Cuando esto sucede deberemos volver a volver a una versión anterior de CakePHP, hasta tanto encontremos el error y lo solucionemos. Este proceso de rollback puede ser un problema, ya que volver a reemplazar el directorio cake lleva tiempo y los bugs siguen en producción.

Primer intento de solución

Tener varios directorios con el framework, uno llamado cake con la versión actual (que será la que use nuestra aplicación) y otros directorios con las versiones anteriores, por ejemplo cake-1.2.5, cake-1.3.2, etc. De este modo, cada vez que se necesite volver a una versión anterior simplemente se renombran dos directorios.

Esta solución tiene algunos problemas

  • Renombrar los directorios es una tarea que tenemos que hacer manualmente, por fuera del proceso de deploy automatizado.
  • El core de Cake no es código mantenido por nosotros y por lo general se lo deja fuera del repositorio de nuestra app. Por lo tanto, cada vez que se modifica el directorio cake, tenemos que avisar a todos los miembros de nuestro equipo que hagan lo mismo para que todos trabajemos en iguales condiciones.
  • Debemos mantener actualizado nuestro archivo .gitignore para que las nuevas versiones de cake no formen parte del repositorio de Git (o el sistema de versionado que utilicemos).
  • Si alguien realiza un checkout de nuestra aplicación no encontrará en el código información acerca de cuál es la versión de CakePHP que necesita para funcionar.

Solución

Crearemos la siguiente estructura de directorios

  • app
  • cakeversions
    • 1.2.5
      • cake
    • 1.3.2
      • cake

El directorio cakeversions contendrá todas las versiones del core que alguna vez necesitó nuestra aplicación y será ignorada por Git. Los directorios cake dentro de cada número de versión son necesarios ya que el framework requiere que todo el core esté dentro de un directorio llamado exactamente cake.

Después tendremos que modificar el archivo app/webroot/index.php para que tome la nueva ubicación del core. La siguiente línea:

define('CAKE_CORE_INCLUDE_PATH', ROOT);

Debe ser reemplazada por esta:

define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'cakeversions' . DS . '1.3.6');

De este modo, cada vez que necesitemos cambiar la versión de cake sólo deberemos modificar el número en esta línea. Los cambios que hagamos se implementarán en producción en el próximo deploy y como el archivo app/webroot/index.php forma parte del repositorio en Git, el resto del equipo lo tendrá actualizado en el próximo fetch o pull que realicen.

marzo
11

Uno de los problemas que tienen los UUID es que pueden resultar demasiado largos para algunas aplicaciones. Aquí veremos un método para reducir los clásicos UUID de 36 caracteres a 25.

Supongamos que a cada usuario registrado en nuestro sistema le asignamos un UUID, el cual tenemos que incluir en la url para visualizar su perfil. Esta URL quedaría algo más o menos así:
http://example.com/users/profile/4a3009bd-43f4-4535-ae3e-08a0650df841

Si observamos la composición de un UUID vemos que todos sus caracteres son números hexadecimales (excepto los guiones). Hay muchos caracteres que no están siendo utilizados en esta cadena y si convertimos los números hexadecimales a una base mayor que utilice más caracteres, podríamos reducir la cadena.

PHP tiene una función llamada base_convert que toma tres argumentos: el número a convertir, la base en la que se encuentra dicho número y la base a la cual lo queremos convertir. Si a esta función le pasamos nuestro UUID generado por CakePHP para convertirlo a base 36 (la máxima base que soporta dicha función) y lo pasamos a mayúsculas (sólo para que sea más prolijo), nos queda una cadena de 25 caracteres similar a esta: 4FPTDWER5VQ4G4S408C8O8WO0. La cadena generada sigue siendo única porque el número que representa es el mismo que el UUID original, sólo que está convertido a otra base mayor.

Ahora, para hacer un poco más sencillo el proceso, sería ideal que CakePHP genere automáticamente estos UUID cortos, del mismo modo que los hace con los largos. Si el campo id de una tabla es una cadena de 36 caracteres CHAR(36) o VARCHAR(36), CakePHP genera automáticamente un UUID por cada insert que se hace en la tabla. Con este behavior logramos el mismo comportamiento pero para aquellos campos id que sean cadenas de 25 caracteres. Veamos el código.

<?php

Class ShortUuidBehavior extends ModelBehavior {

	function setup(&$Model, $settings) {
	}

	function beforeSave(&$Model) {
		if(
			empty($Model->data[$Model->alias]['id'])
			and $Model->_schema['id']['length'] == 25
			and $Model->_schema['id']['key'] == 'primary'
			and $Model->_schema['id']['type'] == 'string'
		) {
			$Model->data[$Model->alias]['id'] = $this->_generateShortUUID();
		}
	}

	function _generateShortUUID() {
		$uuid = str_replace('-', '', String::uuid());
		return strtoupper(base_convert($uuid, 16, 36));
	}

}

?>

Este behavior se puede ubicar dentro de app_model.php, ya que sólo afectará a aquellos modelos cuyo id sea una cadena de 25 caracteres.

marzo
12

Los frameworks agilizan el desarrollo

Posted In: Frameworks by Mauro Zadunaisky

framework

Sea de manera intuitiva y casera, o sea porque conocemos y utilizamos herramientas avanzadas, todos de alguna manera usamos un framework que nos permite mantener nuestro trabajo organizado. ¿Pero qué es un framework? ¿Cómo puede ayudarnos a facilitar nuestro trabajo y el de los demás? Encontrarás definiciones y guías que te ayudarán a comprender mejor el tema, pero nosotros intentaremos una explicación práctica, tratando de dirigirnos al usuario no técnico/no programador que trabaja en desarrollo web.

Read More