Introducción
Hace algún tiempo, por diversión, escribí un generador de código de CodeIgniter.
Todo nació a partir de una plática con unos amigos sobre hacer un script que, dada una base de datos, generase el código necesario del modelo, la vista y el controlador para que un ser humano hiciera las operaciones básicas.
Obviamente este generador de código de CodeIgniter es algo hecho por diversión y que no debería usarse en producción pero es entretenido de usar.
Para escribirlo no usé nada más que el propio lenguaje de PHP. Y no, no es magia, son simples concatenaciones de cadenas, formateo de las mismas con sprintf y condiciones.
Pero bueno, vamos por partes y veamos cómo funciona, porque sí, claro que funciona y puede generar un CRUD en menos de un segundo 🙂
Lecturas recomendadas
Para obtener las tablas y columnas de la base de datos de MySQL utilicé código que ya he publicado, pásate por esos posts.
Y para aprender CodeIgniter, recomiendo esto:
- Anatomía de un controlador de CodeIgniter
- Anatomía de un modelo de CodeIgniter
- Iniciar proyecto de CodeIgniter
- Sistema de ventas con CodeIgniter
- CodeIgniter y PDO para conectar con MySQL
¿Dónde se puede ver?
Puedes ver el CRUD de mascotas y clientes que hizo este generador visitando este enlace (no funciona por el momento, agosto de 2019).
Para ver el código fuente visita el repositorio en GitHub.
¿Qué hace este generador de código de CodeIgniter?
Este generador de código lee tu base de datos, y:
- Genera un modelo que interactúa con la base de datos
- Genera un controlador que pega la vista y formularios con el modelo
- Hace que tus datos sean leídos con paginación
- Permite que tus datos sean consumidos con JSON
- Crea vistas para los formularios de edición e inserción, y adicionalmente pone los tipos de los
<input>
dependiendo del tipo de dato - Cuando eliminas o haces alguna acción, te lo indica con un mensaje flash, es decir, un mensaje tipo notificación que vive únicamente una vez, y se quita al refrescar la página
- Genera tablas amigables y una paginación
- En resumen, hace o programa todo un CRUD que tú tendrías que hacer a mano, el cual es, la mayoría de veces, un proceso repetitivo
¿Qué no hace?
No se encarga de nada de seguridad ni validación, tampoco le importan mucho las relaciones de las tablas. Y por cierto, está hecho para que se vea bien en Bulma CSS (puedes adaptarlo a Bootstrap, o a tus propios estilos, no es difícil).
Así que tú debes proporcionar el encabezado que cargue los estilos y esas cosas, algo que no es difícil.
Hablar es de mal gusto, vamos al código
He hecho un intento de abstraer este código en una clase. Su uso es sencillo. Tenemos que incluir el archivo llamado Generador.php si queremos con un include_once
, y más tarde crear una instancia del mismo.
El código está en GitHub, justo aquí. No lo pego aquí porque puede que más tarde le haga actualizaciones y tenga que cambiarlo, además de que se ve mejor en mi perfil de GitHub. Y finalmente, qué pereza pegar más de 700 líneas de código.
Ejemplo de uso
Aquí hay un ejemplo. Le pasamos al generador los argumentos o parámetros para que él pueda construir una instancia de PDO y trabajar con ella.
También le indicamos el nombre de la base de datos, aparte de las credenciales.
Opcionalmente le podemos pasar un array o arreglo con las tablas a omitir, si no queremos que omita alguna entonces no ponemos nada. Adicionalmente, como último argumento puedes enviar el nombre del directorio de salida; si no lo mandas, se tomará el nombre generado.
Y no te preocupes, los folders o carpetas son creados y eliminados automáticamente, no tienes que preocuparte de ello.
<?php
include_once __DIR__ . "/Generador.php";
$generador = new Generador("localhost", "root", "", "mascotas");
# Ninguna tabla a ignorar
$generador->setTablasAIgnorar([]);
# ¡Vamos allá!
$generador->generar();
?>
Ese es todo el código que necesitas para generar más código. Así de simple. Más tarde encontrarás una carpeta que se ve así como en la siguiente imagen. En mi caso lo hice con una base de datos de mascotas.
Así es, ha generado todo un CRUD. Lo maravilloso de esto es que si hubiera más tablas (2, 3, 50000) generaría el código para todas ellas; aunque lo malo es que no sabe de relaciones.
Si, por ejemplo, mi base de datos tuviera otra tabla de clientes, el resultado sería este:
Ahora sólo falta que copies todo lo generado (la carpeta models, views y controllers) dentro de la carpeta application de tu proyecto. Es decir, en una instalación fresca de CodeIgniter 3 pega lo generado.
Si ahora visito a localhost/probar_generador/index.php/mascotas las mismas se listarán:
Ahora puedo agregar un json al final de la URL para que las devuelva como JSON:
Igualmente si presiono el botón de agregar, me lleva a este formulario:
Si la agrego, más tarde me redirige al listado con un aviso:
Los botones de editar y eliminar también sirven como un encanto; pero no quiero alargar el post. Recuerda que puedes probarlo con los enlaces que dejo arriba.
Configuraciones extra
Esto no es magia, y necesita que tú le ayudes un poco (justo como lo harías con un proyecto normal). Debes configurar tu base de datos, la base url y cargar algunas librerías y helpers, así como definir unas constantes. No te preocupes, aquí te guiaré.
Al inicio dejé un post para configurar CodeIgniter con PDO, configúralo con tus credenciales, las mismas que le pasaste al generador. Averigua cómo hacerlo leyéndolo.
En el autoload.php, en las librerías agrega la carga automática de session. Así:
$autoload['libraries'] = array('session');
Y ahí mismo, carga el ayudante de url en los helpers. Así:
$autoload['helper'] = array('url');
En el index.php, define una constante para que se paginen tus datos. Recomiendo dejarlo en 10:
define("DATOS_MOSTRAR_POR_PAGINA", 10);
No importa si cambias el dato, pero recuerda dejar intacto el nombre de la constante. Finalmente define un encabezado simple con Bulma:
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Probando generador :)</title>
<link rel="stylesheet" href="<?php echo base_url() ?>css/bulma.min.css">
<link rel="stylesheet" href="<?php echo base_url() ?>css/font-awesome.min.css">
</head>
<body>
<div class="container">
Y un pie:
</div>
</body>
</html>
Tanto el encabezado como el pie van en la carpeta views. Descarga las fuentes de fontawesome y el framework de Bulma, pega todo en la carpeta del proyecto (junto al index.php) y listo.
Conclusión
Ni siquiera yo creía que así de fácil fuera crear un generador. Sé que no es el mejor método, pero realmente funciona a la perfección. De hecho generé un proyecto con 22 tablas y únicamente tuve que cambiar las relaciones en cada una de ellas. Aparte de agregar unos input de tipo checkbox y algunos select.
Igualmente pudo haber sido escrito en otro lenguaje, pero decidí en hacerlo en PHP para cumplir el sueño de “¿Puedes escribir un programa que escriba programas?” y la respuesta es que, aunque no con la exactitud con la que lo haría un humano, este generador lo hace.
Finalmente quiero aclarar que sé que hay miles de generadores por ahí, aunque no conozco ninguno para CodeIgniter pero he oído hablar por ejemplo de los comandos artisan de Laravel, o de la famosa CLI de Angular y esas cosas.
Como lo dije al inicio, esto es por diversión pero en lugar de que lo borre algún día, lo publico por si a alguien más le sirve.