Introducción
CodeIgniter es un framework de PHP. Su principal competidor es Laravel, pero no vamos a hablar de comparaciones ni de cuál es mejor, si vienes aquí es porque quieres saber cómo comenzar un proyecto de CodeIgniter.
Veamos entonces cómo descargar e instalar lo necesario para programar usando este framework.
Nota: ya existe CodeIgniter 4.
Aprender más
Después de leer este post tal vez quieras saber más sobre modelos y controladores en este framework.
Descargar e instalar última versión de la librería
Puedes obtener la última versión en el sitio oficial. Después de descargarlo cópialo a una carpeta pública de tu servidor web; por ejemplo, si instalaste XAMPP entonces está en C:\xampp\htdocs.
Ahí vas a extraer el archivo que se llama CodeIgniter-XXXX.zip en donde las X representan una versión, en mi caso es CodeIgniter-3.1.9.zip. Al extraerlo se crea otra carpeta, todo el contenido de la misma lo vamos a copiar un directorio arriba. Tranquilo, si no entiendes sigue leyendo.
Voy a crear una carpeta llamada tutorialci en mi carpeta pública ubicada en C:\xampp\htdocs. Ahí extraje CodeIgniter y todo el contenido de la carpeta extraída lo moví arriba. Así:
Cabe aclarar que yo cambié la ruta de instalación de XAMPP pero si tú lo tienes instalado por defecto, debe estar en C:\xampp\htdocs. De igual manera si la cambiaste no importa, mientras sepas en dónde está la carpeta pública.
Probar instalación
Ahora navegamos a localhost/tutorialci (en este caso tutorialci es el nombre de mi carpeta) y debemos ver algo así:
Eso significa que hemos instalado todo perfectamente bien.
Configurar URL base
Para tener urls absolutas debemos configurar la url base, que no es más que la dirección en donde vemos el sitio. En este caso, como es local, es http://localhost/tutorialci/.
Si lo ponemos en el sitio holamundo.com entonces la URL sería http://holamundo.com/, o si tiene HTTPS pues https://holamundo.com/ pero debemos dejar la /
al final.
Para configurar esto, abrimos el archivo llamado config.php dentro de application/config. Buscamos la línea en donde diga $config['base_url']
y ponemos el valor en la ruta de nuestro sitio.
El mío queda así:
A la izquierda vemos que estamos dentro de application/config. Y que dentro de esa carpeta editamos el archivo llamado config.php. Luego navegamos a la línea 26 y ponemos la url base.
CodeIgniter y MVC
CodeIgniter sigue el patrón de Model View Controller o Modelo vista controlador. Pero no vamos a detenernos a pensar cómo funciona ni nada, veremos cómo se aplica en este framework.
Modelo
El modelo es normalmente una clase que representa una entidad. Por ejemplo, podemos tener el modelo Usuario.
Y ese modelo se encarga de proveer una API para que sea consumido más tarde. Dentro del modelo Usuario podríamos tener la función obtenerPorId
que obtendría un usuario a través de su ID.
Estos modelos son privados, o sea, cuando el usuario de nuestro sistema quiere usarlos, no interactúa directamente con los modelos, interactúa con los controladores. ¿Y qué son los controladores? sigue leyendo
Cabe mencionar que es casi una regla poner la interacción con las bases de datos aquí en el modelo, pero respetando el principio de responsabilidad única.
Controladores
Un controlador es el pegamento. Se encarga de llamar a un modelo, y luego, según lo que regrese el modelo, pasar datos a la vista.
Es un pegamento, un intermediario. También puede renderizar una vista sin pasarle datos, o llamar a un modelo sin pasar los datos a la vista, pero se usa mayormente para pegar los datos.
Hablando específicamente de CodeIgniter, este framework tiene un sistema en donde las rutas son métodos, y lo que sigue después de ellas son argumentos de los métodos mencionados previamente.
Por ejemplo, si en nuestro controlador llamado ventas, y dentro de ventas tenemos la función detalle, y esa función recibe el argumento que indica el ID, la ruta sería:
sitio.com/index.php/ventas/detalle/1
Ahí, ventas es el nombre del controlador. Detalle es el nombre de la función que existe dentro del controlador, y 1 es un argumento.
La función podría quedar así:
<?php
class VentasController extends CI_Controller{
public function detalle($id){
// Aquí magia para obtener los detalles de venta
}
}
Entonces luego podemos agregar más funciones con o sin argumentos, y más controladores. Y todo ello estará disponible y expuesto a través de la URL.
Sobre index.php
Aquí puede haber una confusión, y es que la url era localhost/tutorialci. Pero cuando explicamos lo del controlador y eso, dijimos que era localhost/tutorialci/index.php/ventas/detalle/1.
Siguiendo la lógica de la url base, ¿por qué no es localhost/tutorialci/ventas/detalle/1? y la respuesta es que debemos poner index.php ya que ese archivo se encarga de interpretar la ruta; como son rutas dinámicas, Apache (O Nginx o lo que usemos) intentará resolverlas como si de archivos se tratara, y no queremos eso, queremos que las rutas sean interpretadas como controladores y métodos.
Una solución a esto es modificar al archivo de apache, pero es otra historia que confundiría al lector. En resumen:
Sí, siempre tendrás que poner index.php y luego el controlador y el método, seguidos de los parámetros opcionales
Vista
La vista es lo que ve el usuario. Normalmente es código HTML combinado con PHP (así como cuando renderizamos cualquier cosa usando estos dos lenguajes). CodeIgniter no tiene activado por defecto un preprocesador de plantillas como twig o blade; y para mantenerlo simple no hablaremos de ello.
La ventaja que obtenemos con esto es que podemos tener vistas separadas e independientes de sí mismas. Además, en la vista no ponemos ningún código de programación, sino de diseño. Ya que los datos son pasados a través del controlador.
Hola mundo con MVC
Pero bueno, basta de charlas. Hablar es de mal gusto, mejor muestro el código. Vamos a hacer un hola mundo en donde renderizamos una simple lista obtenida del modelo, pasada a la vista a través del controlador.
Creando el modelo
Los modelos van en la carpeta models.
Vamos a crear el modelo. Se llamará HolaMundoModel. Por lo tanto el nombre del fichero será HolaMundoModel.php y dentro de él, tendremos a la clase HolaMundoModel
que extiende de CI_Model
Si cambias el nombre de la clase, también debes cambiar el nombre del archivo. Digamos que tu clase se llama UsuariosModel
, entonces tu fichero debería llamarse UsuariosModel.php. Por cierto, aunque la clase se llame de otro modo, siempre debe extender de CI_Model
.
<?php
class HolaMundoModel extends CI_Model{
public function obtenerLista(){
return array(
"Esta", "Es", "una",
"lista", "obtenida",
"desde", "el",
"Modelo");
}
}
?>
Vamos por partes, como dijimos debe extender de CI_Model
. Luego declaramos una función que se llama obtenerLista
y que regresa un simple arreglo.
En la vida real podría comunicarse con una base de datos, consumir una API o cualquier otra cosa. Este código puede ser llamado más tarde desde cualquier controlador.
La vista
Todavía no veremos al controlador, primero veremos cómo será la vista. En este caso es un documento PHP que renderiza una lista (elemento ul
con muchos li
) y ya, nada de más.
Vemos que incluye todo lo de <head>
, <body>
y esas cosas. Lo que permite un framework como este es definir múltiples vistas comunes (por ejemplo: encabezado, pie, menu) y luego juntarlas a todas para formar una plantilla y cambiar únicamente el contenido; pero este no es el caso.
La vista va dentro de la carpeta views y la llamaremos hola.php. Queda así:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Mi primer acercamiento a CI</title>
</head>
<body>
<h1><?php echo $titulo; ?></h1>
<ul>
<?php foreach($lista as $elemento){ ?>
<li><?php echo $elemento; ?></li>
<?php } ?>
</ul>
</body>
</html>
Recordemos que podemos tener un archivo PHP sin un trozo de código PHP, es decir, podríamos poner todo en HTML. Lo que agrega PHP es el prepocesado del HTML.
Por eso es que la mayoría de nuestro documento tiene HTML y sólo en los casos “dinámicos” agregamos código PHP. Usamos un foreach y en cada iteración dibujamos un elemento <li>
. Hay que fijarnos en cómo abrimos la llave y la cerramos más abajo.
Tip: podemos crear carpetas para organizar nuestras vistas, ya veremos cómo llamarlas desde el controlador.
¿Y de dónde vienen $titulo
y $lista
? dijimos que la pasaremos como datos desde el controlador.
El controlador
Los controladores se ubican en la carpeta controllers. Crearemos uno y lo vamos a llamar HolaMundo, por lo tanto la clase se llamará HolaMundo
(sin un sufijo, ya veremos por qué) y el fichero igualmente HolaMundo.php
. En este caso extendemos de CI_Controller
.
Dentro de la clase definimos al método listar. El código queda así:
<?php
class HolaMundo extends CI_controller{
public function listar(){
# Cargar el modelo a $this
$this->load->model('HolaMundoModel');
# Ahora el modelo está en $this como una propiedad
# Todo esto le pasaremos a la vista
$datos = array();
# Ponemos el título...
$datos["titulo"] = "¡Título desde el controlador!";
# Cargar la lista
$datos["lista"] = $this->HolaMundoModel->obtenerLista();
# Renderizar y pasar datos.
# Tip: no es necesario pasar la extensión del archivo de la vista (sería hola.php)
$this->load->view("hola", $datos);
}
}
?>
Comenzamos cargando el modelo. Una vez cargado podemos acceder a él como si formara parte de nuestra clase gracias a los métodos mágicos de PHP.
Como lo que se le pasa a la vista es un arreglo, podemos ponerle miles de cosas. De hecho podríamos llamar a dos o más modelos, pasar datos de otros lugares, etcétera.
Y finalmente cargamos a la vista llamada hola
. Aunque nuestro archivo se llama hola.php
, al incluir la vista no es necesario poner la extensión.
Como segundo argumento al método view pasamos los datos.
Tip: puedes dividir las vistas en subcarpetas. Por ejemplo, si tienes la carpeta usuarios y dentro existe la vista perfil.php podrías cargarla con $this->load->view("usuarios/perfil", $datos)
. Ah, y puedes subdividir cuantas veces quieras 😉
Poniendo todo junto
Es hora de ir a nuestro navegador. La url base (no la confundas con la que configuramos) es localhost/tutorialci/index.php
Como vamos a llamar al controlador HolaMundo entonces lo agregamos y nuestra url va quedando así: localhost/tutorialci/index.php/holamundo
Más tarde agregamos el nombre del método, el cual es listar. La url final queda así:
localhost/tutorialci/index.php/holamundo/listar.
La visitamos y…
Lo hemos logrado. Al definir el controlador no definimos un sufijo porque la ruta sería más larga y menos entendible y expresiva.
Tip: si en la URL llamamos al controlador sin pasarle ningún nombre de la función (por ejemplo, que la URL fuera simplemente localhost/tutorialci/index.php/holamundo), se llamará a la función index
. Podemos definirla para controlar ese comportamiento; si no la definimos se muestra un error 404.
¿Qué sigue?
Con esto ya puedes comenzar a programar. Más tarde traeré un ejemplo con una base de datos; mientras tanto aquí dejo estas notas finales:
- Podemos definir más controladores y funciones dentro de los mismos, y llamarlos simplemente visitando la ruta.
- También podemos crear más modelos, los modelos son llamados desde los controladores. No necesariamente debes crear un modelo por cada controlador, pero se recomienda separar todo por cada entidad.
- Para enviar un formulario, igualmente lo enviamos a una ruta y con CodeIgniter accedemos al arreglo superglobal
$_POST
. - Recuerda que puedes llamar múltiples veces a
$this->load->view('vista')
para cargar plantillas por separado y juntarlas usando el controlador - Si subes tu proyecto a internet, cambia la URL base.
- Y por último, pero no menos importante, aquí la fuente de la verdad, la guía CodeIgniter. No vayas a culpar de los errores de sintaxis al framework; para manejarlo bien primero debes saber PHP así que aquí dejo igualmente la documentación.
Pingback: Generador de código (Modelo, vista y controlador) para CodeIgniter - Parzibyte's blog
Pingback: Subir y publicar un proyecto de CodeIgniter a internet - Parzibyte's blog
Pingback: Ejemplo y anatomía de un modelo en CodeIgniter 3 - Parzibyte's blog