Extensión de controladores en CodeIgniter

Estaba en etapa de refactorización en un proyecto que estoy desarrollando sobre CodeIgniter y me di cuenta que los controladores tenían bastante código en común y que se repetía en cada uno de ellos. Me pareció más que conveniente hacer una extracción de superclase y poner todo lo repetido en una nueva clase del tipo controlador, pero más genérica.

Para poder realizar esto, es necesario extender el controlador nativo de CodeIgniter, llamado CI_Controller. Esta clase es parte del núcleo (core) del framework y por lo tanto, si se quiere heredar de ella, es necesario tener algunas aspectos en mente. El manual de CodeIgniter lo aclara bastante bien, aunque no está del todo completo desde el punto de vista práctico.

Función autoload

En primer lugar, es necesario tener definida una clase autoload. Las clases de este tipo, sirven para cargar de forma dinámica cualquier archivo que no haya sido incluido mediante las funciones include o require.

En el sitio web upshots hay un artículo muy bueno sobre extensión de controladores en CodeIgniter y es ahí donde aparece la clase de autoload escrita por Phil Sturgeon, desarrollador web. Si bien esta clase no es la única que sirve, cumple con lo que necesitamos.

El código es el siguiente y lo pueden añadir al final del archivo config.php, en la ruta application/config de su instalación del framework.

Prefijo de la clase controlador propia

CodeIgniter exige que todas aquellas clases que hereden del núcleo de clases del sistema comiencen con un prefijo. Por defecto, el prefijo es MY_. Si escribimos una clase que hereda de CI_Controller, debería llamarse, por ejemplo, MY_Controlador. El prefijo puede cambiarse y para hacer esto, se necesita editar el mismo archivo config.php al que recién le agregamos la función autoload.

Buscamos la línea que dice

Y la cambiamos por lo que queramos, excepto por CI_ que es el que usa el sistema. Por ejemplo:

Extensión del controlador nativo

Ahora vamos a escribir nuestro propio controlador que, por supuesto, deberá heredar de CI_Controller.

Esta y todas las clases que extiendan clases de sistema del framework deben ir ubicadas en application/core. Noten que al final del código anterior, se incluye la ruta al archivo, tal cual se indica que debe hacerse en la documentación oficial de CodeIgniter.

Con esa estructura básica, ya es posible agregar métodos y personalizar el nuevo controlador.

Extensión del controlador personalizado

Resta únicamente hacer heredar a nuestros controladores del nuevo que hemos creado. Esto es lo más fácil de todo y lo vemos a continuación (no muestro el archivo entero, solo lo necesario).

Conclusiones

CodeIgniter provee una forma de extender las clases de sistema, como por ejemplo, los controladores. Siguiendo los pasos que vimos, es realmente fácil lograrlo.

Esto puede ser útil, por ejemplo, al aplicar el método de refactorización de extraer la superclase cuando se tiene mucho código repetido en varias clases similares. En el caso puntual de una aplicación web, esto podría ser un método privado encargado de cargar la vista. Sería normal que se repitiese en todos los controladores, pudiéndose ubicar como protegido (protected) en una clase más genérica para evitarlo.

Soy programador web y me desempeño como Líder Técnico en Polar Bear Development. Trabajo con tecnologías como PHP, Javascript, MySQL y HTML5 para el desarrollo de sitios y sistemas web. Me especializo en Zend Framework 2 y otros frameworks MVC, como también en WordPress y otros CMS. Lidero equipos de desarrolladores trabajando con Scrum. Vivo en Buenos Aires, Argentina.