Precargar la base de datos utilizando el Shell Schema de CakePHP [Instalador]
Para quienes no desean escribir SQL y mucho menos desarrollar la lógica de un instalador en CakePHP, el shell Schema de la cónsola de CakePHP es una solución sencilla y facil de implementar al problema de inicializar una base de datos.
A veces cuando desarrollamos aplicaciones, estas requieren de un instalador completo que le permita al administrador configurar elementos. Ejemplo de este tipo de aplicaciones (en PHP) son wordpress y ósmosis. Sin embargo, cuando sabemos que una aplicación no será instalada por más nadie, el “instalador” puede ser tan sencillo como un script SQL o, mejor aún, un schema de CakePHP que puedes ejecutar desde la cónsola. A continuación les explico la manera de utilizar los schemas de CakePHP para cargar datos:
Genera el schema de CakePHP
Primero debemos generar el schema de la base de datos ejecutando el siguiente comando:
Esto generará el archivo en APP/config/sql/schema.php el cual contiene dos funciones las cuales son las que utilizaremos a continuación.
La inserción de datos
Las funciones before y after son las que podemos utilizar para este fin, estas se ejecutan antes y después (respectivamente) de la creación de cada tabla. Esto representa un problema ya que evita que se puedan instanciar los modelos: las tablas de los modelos relacionados puede que no existan aún lo cual generará errores. Para superar esta dificultad utilizaremos las funciones de más bajo nivel de Cake, para acceso a la base de datos, de la siguiente manera:
Suponiendo que schema.php tiene la definición de una tabla users (por ejemplo) podemos crear el primer usuario de la aplicación de la siguiente manera:
…
function after($event = array()) {
$inserts = array(
"users" => array(
array(
"username" => "admin",
"password" => Security::hash("miPasswordSuperSecreto", null, true),
"group" => "Admin"
)
)
);
if (
isset($event["create"]) &&
isset($inserts[$event["create"]])
) {
$db =& ConnectionManager::getDataSource($this->connection);
$data = $inserts[$event["create"]];
$values = $fields = array();
foreach($data as $row) {
$fields = array_keys($row);
$values[] = "(" .
implode(
", ",
array_map(
array(&$db, "value"),
array_values($row)
)
)
. ")";
}
$db->insertMulti($event["create"], $fields, $values);
}
}
…
?>
De este modo insertamos el primer usuario (encriptando la clave con Security, aquí deben suar el método que prefieran), la misma técnica se puede utilizar para pre cargar otros datos – usando arreglos muy parecidos a los que usa CakePHP – para inicializar la aplicación sin necesidad de un instalador y todos los problemas de seguridad que conlleva.
Nota: para cargar la base de datos se debe ejecutar el siguiente comando:
Gracias a Adrian por su comentario al respecto
Recibe otros artículos como este automáticamente
Suscríbete vía RSS a aikon.com.ve ||
¿Qué es RSS?
Muy bueno!!! Gracias!!
Lo unico que me parece que falta decir, es que luego, en otro lado lo que hay que correr para que se generen las tablas es “schema run create”, no?
O generar el .sql con “schema dump ”
Sueret!
Enero 22, 2009 // 21:42
Tienes toda la razón Adrian, es necesario ejecutar desde la consola de CakePHP:
Ya lo agrego a la entrada, gracias
Enero 22, 2009 // 23:29