Reemplazar y extender clases del Core de CodeIgniter

  • Por
  • PHP
Cómo podemos modificar las clases que forman el núcleo de CodeIgniter para alterar significativamente la manera de funcionar del framework PHP.
Una característica de CodeIgniter que le diferencia de otros frameworks PHP es la posibilidad que ofrece de cambiar los modos de trabajo que inicialmente propone a los desarrolladores. En este sentido, en CodeIgniter podemos hacer cosas tan críticas como modificar las propias clases que forman parte del "core" o núcleo de la aplicación.

Cuando se pone en marcha CodeIgniter existen varias clases que se cargan automáticamente como núcleo de proceso del framework. Esas clases son las que se denominan habitualmente el Core de CodeIgniter y nosotros podemos intercambiarlas por nuestros propios códigos, o lo que realmente sería más común, extenderlas con código adicional que realice funciones que resulten críticas en nuestras aplicaciones web.

En este artículo del Manual de CodeIgniter mostraremos el modo de modificar el Core de CodeIgniter, para las personas que juzguen que puede ayudarles en sus tareas de desarrollo.

Nota: Este es un artículo que podríamos catalogar de avanzado, de modo que lo más seguro es que no resulte en estos momentos muy interesante para las personas que están dando sus primeros pasos con el framework. No obstante, no hemos querido saltarnos el tema para seguir en la medida de lo posible el guión del "User Guide" oficial de CodeIgniter.
En la práctica, la mayoría de los usuarios no van a necesitar nunca alterar las clases del Core. Si acaso en algunos casos puede resultar interesante extender alguna de las clases con código adicional, para dotarles de algún método que resulte útil en determinadas aplicaciones. Del mismo modo, antes de cambiar nada del Core de CodeIgniter, es importante que el desarrollador sepa lo que está haciendo y sepa por qué lo está haciendo, aparte que tenga cierta experiencia que le ayude a no meter la pata con las clases más fundamentales de este framework.

Listado de clases del Core de CodeIgniter

Cuando nos referimos al Core de CodeIgniter, hacemos referencia de aquellas clases que son cargadas siempre que el framework se pone en funcionamiento. Son las siguientes:

  • Benchmark
  • Config
  • Controller
  • Exceptions
  • Hooks
  • Input
  • Language
  • Loader
  • Log
  • Output
  • Router
  • URI

Reemplazar las clases del core con nuestras propias versiones

La primera posibilidad que existe es sustituir completamente una clase del Core por otra creada enteramente por nosotros. Esta tarea en principio resulta poco aconsejable y además requeriría un nivel mucho mayor del desarrollador que está realizándola, porque estaremos eliminando una clase clave del framework y colocando un código nuestro, que tenemos que asegurarnos que funcione y que realiza las tareas para las que está diseñada la clase originalmente. En cualquier caso se realiza de la siguiente manera:

Primero tenemos que fijarnos en el nombre de la clase que queremos sustituir, que puede ser cualquiera de las listadas antes. Luego tenemos que crear una clase con el mismo nombre y colocarla en el directorio de "system/application/libraries".

Por ejemplo, imaginemos que queremos sustituir la clase "Config". Entonces crearíamos un archivo en:

system/application/libraries/Config.php

Luego, el código a insertar en ese archivo sería el necesario para definir la clase que estamos sustituyendo, teniendo en cuenta que el nombre de la clase a sustituir debe tener el prefijo CI_. Veamos el siguiente esquema:

class CI_Config {
   //Código de nuestra nueva clase Config
}

Extender el código de una clase del Core

Esta segunda posibilidad resulta bastante más interesante, al menos para usuarios más normales, puesto que permite agregar funcionalidad a las clases existentes en el Core de CodeIgniter, sin alterar las cosas que ya hacen originalmente.

Nota: En mi segunda aplicación de CodeIgniter ya me resultó interesante hacer alguna modificación de la clase Controller, para agregarle algunos métodos que me resultaba especialmente útil disponer en todos los controladores. Realmente, viendo el problema ahora desde otra perspectiva, pienso que quizás se podría haber colocado esos métodos en otras librerías, pero acabé decidiendo colocarlos en la clase de los controladores y funcionó bien.

Extender una clase se hace de manera similar a sustituirla, con la diferencia que al extenderla tenemos que asegurarnos de invocar al constructor de la clase "parent" (clase que estamos extendiendo) y que debemos utilizar un prefijo "MY_" tanto en el nombre del archivo como en el de la clase.

Así pues, veamos cómo podemos extender, por ejemplo, la clase Controller.

Tendremos que crear un archivo llamado MY_Controller.php que situaremos en la ruta system/application/libraries/MY_Controller.php. Su código sería el siguiente:

<?php if (!defined('BASEPATH')) exit('No deseo permitir acceso directo a este script');

class MY_Controller extends Controller {
   
   //constructor, debe llamar al constructor de la clase parent
   function MY_Controller(){
      parent::Controller();
   }

   function algo_importante_que_deseo_tener_siempre(){
      //código de una función con la que estoy extendiendo mis controladores
   }

}

Como se puede ver, estamos extendiendo la clase Controller y lo más importante es fijarse cómo en el constructor hemos hecho una llamada al constructor de la clase "parent", para que no se pierdan las tareas de inicialización de los objetos que se definieron en las clases del core que estamos extendiendo.

Nota: Hemos utilizado en el código de este caso el modelo de constructor de PHP 4, pero podría utilizarse el de PHP 5 si lo deseamos.

Luego, nuestros métodos tendrán cualquier nombre que deseemos. Además, si queremos sustituir específicamente alguno de los métodos que existían en la clase original, simplemente tenemos que crear un nuevo método con el mismo nombre que tenía antes. Por ejemplo, si creamos un método llamado index() en la clase MY_Controller, estaremos sustituyendo el código de ese método de los controladores originales.

Nota: Si lo deseamos, podemos cambiar el prefijo "MY_" utilizado para las clases que extienden el core y eso se consigue desde el archivo de configuración, que está en la ruta "system/application/config/config.php", donde tenemos que alterar esta variable:
$config['subclass_prefix'] = 'MY_';

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

franz_rojas

11/11/2010
Esta muy interesante los artículos
Agradecer al equipo de desarrollo web por los artículos que son de mucha ayuda, y dan la posibilidad de seguir aprendiendo.

Javier

19/12/2012
Buena
Muy buen articulo, felicitaciones

ddieegoo

12/3/2013
Agradezco por el manual + actualizacion
En poco menos de dos dias pude hacerme toda una idea clara de como trabajar con Codeigniter asi que agradezco su ayuda.
Queria agregar algo a esta seccion. Desde la version 2 se debe guardar nuestras extensiones en "applications/core/". Despues todo sigue intacto, a excepcion del Controller que paso a llamarse CI_Controller, pero que ya lo han comentado anteriormente.
Agradezco nuevamente a los escritores!