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:

cake schema generate

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:

<?php

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:

cake schema run create

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?

Twitea este artículo y sígueme en twitter @joaquin_win

Tags: , , ,

Comentarios

» 2 Personas han comentado sobre “Precargar la base de datos utilizando el Shell Schema de CakePHP [Instalador]”

  1. Adrian:

    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!

  2. Joaquín Windmüller:

    Tienes toda la razón Adrian, es necesario ejecutar desde la consola de CakePHP:

    cake schema run create

    Ya lo agrego a la entrada, gracias

Deja tu respuesta

requerido

requerido

Nota: mantente dentro del tema y se respetuoso.