No os voy a engañar, llevo semanas durmiendo mal. Hace poco heredé un proyecto en PHP que era, para ser suaves, un despropósito. Un CMS a medida escrito hace años donde cada archivo era una selva de consultas MySQL incrustadas en medio del HTML, variables globales paseándose como Pedro por su casa y bloques de include("header.php") repetidos hasta la saciedad. Mantener eso sin romper algo era como jugar a la ruleta rusa.

Después de pasarme noches enteras descifrando código y acordándome de toda la familia del colega que desarrolló esto, decidí que no podía seguir así. Llevaba tiempo escuchando hablar maravillas de los frameworks y del patrón MVC (Modelo-Vista-Controlador), pero siempre me pareció que añadían demasiada sobrecarga al servidor y una capa de complejidad innecesaria. Sin embargo, al ver alternativas más pesadas como CakePHP, Symfony o el mismísimo Zend Framework, me topé con uno que prometía ligereza y una curva de aprendizaje mínima: CodeIgniter.

El infierno del PHP tradicional frente al patrón MVC

Hasta ahora, mi forma de trabajar y la de muchos de nosotros era bastante procedimental. Si querías mostrar una lista de usuarios, hacías un rudimentario mysql_connect, lanzabas la query "a pelo" y mezclabas la lógica del while con las etiquetas <tr> de una tabla HTML. Rápido, sí, pero un dolor de cabeza enorme cuando tienes que cambiar el diseño y tienes que rebuscar entre mil líneas para modificar una triste clase CSS.

Al migrar a CodeIgniter, la gran revelación técnica fue separar las responsabilidades. El patrón MVC te obliga a estructurar tu mente y tu código, separando el grano de la paja. El Controlador recibe la petición HTTP del usuario, llama al Modelo para extraer o guardar la información en la base de datos, y finalmente carga la Vista pasándole únicamente los datos ya procesados. Cero HTML en el modelo, cero lógica SQL en la vista.

Este cambio de paradigma es un salto cualitativo brutal en nuestro flujo de trabajo. Ya hablé hace tiempo sobre la llegada de la POO a PHP 5, pero os aseguro que es al usar un framework cuando realmente le sacas partido a la orientación a objetos en el día a día.

Entrando al asunto: Active Record y Controladores limpios

Una de las cosas que más me ha volado la cabeza de CodeIgniter es su implementación del patrón Active Record para abstraer las consultas a la base de datos. Se acabó escribir sentencias SQL a mano concatenando strings y rezar para no cometer un error de sintaxis tonto. Además, te protege por defecto contra ataques de inyección SQL escapando automáticamente las variables, algo que en los viejos scripts requerían usar mysql_real_escape_string por todas partes.

Aquí tenéis un ejemplo real de cómo he refactorizado un módulo antiguo para obtener los artículos de un blog. Así de limpio queda el Modelo (models/articulo_model.php):

<?php
class Articulo_model extends Model {

    function Articulo_model() {
        parent::Model();
    }

    function obtener_ultimos($limite = 10) {
        // Active Record hace la magia por debajo
        $this->db->order_by('fecha', 'desc');
        $this->db->limit($limite);
        $query = $this->db->get('articulos');

        if ($query->num_rows() > 0) {
            return $query->result(); // Devuelve un array de objetos
        }
        return false;
    }
}
?>

Y este sería el Controlador correspondiente (controllers/blog.php) que orquesta la petición y procesa la vista:

<?php
class Blog extends Controller {

    function index() {
        // Cargamos el modelo
        $this->load->model('Articulo_model');

        // Obtenemos los datos y preparamos el array para la vista
        $datos['articulos'] = $this->Articulo_model->obtener_ultimos(5);
        $datos['titulo'] = 'Últimas entradas del sistema';

        // Pasamos los datos a la vista
        $this->load->view('blog_vista', $datos);
    }
}
?>

Como veis, el código se vuelve completamente legible y predecible. Las URL también cambian radicalmente. Dejamos atrás las típicas cadenas horribles tipo index.php?modulo=blog&accion=ver para pasar a URLs amigables basadas en segmentos, gracias a su sistema de enrutamiento: /blog/index.

Reflexiones desde el dolor

Migrar este monstruo legacy no ha sido un camino de rosas. He tenido que reescribir prácticamente todo el backend y adaptar la base de datos a unas convenciones lógicas, pero el esfuerzo ha merecido completamente la pena. El proyecto ahora es escalable, el rendimiento es espectacular (CodeIgniter apenas consume recursos, no como otros mastodontes) y, lo más importante, ya no me tiemblan las manos cuando tengo que tocar el código.

Tengo clarísimo que los frameworks han llegado para quedarse. PHP ya no es ese lenguaje de scripting de andar por casa; está madurando a pasos agigantados. Mientras proyectos gigantes como Zend Framework se posicionan para el mundo corporativo con patrones ultra complejos, herramientas como CodeIgniter nos dan a los desarrolladores independientes el equilibrio perfecto entre agilidad, orden y velocidad. Si aún seguís escribiendo código con consultas puras, haceos un favor: probad un framework. Vuestra salud mental os lo agradecerá eternamente.