martes, 18 de diciembre de 2012

Como extender clases en CodeIgniter (II)

El otro día hablábamos de Como extender clases del modelo en CodeIgniter sin recibir el temible error "Class not found". El método comentado consistía en cargar manualmente la clase base antes que la clase hija. Desgraciadamente este método no puede usarse para los controladores pues es el propio framework el que se encarga de cargar los controladores. Afortunadamente en PHP 5 hay un método adecuado para extender cualquier clase si recibir ese fatal error: La función __autoload()

Dicha función se diseñó para evitar que los desarrolladores de aplicaciones orientadas a objetos que escriben cada clase en un fichero fuente PHP separado tuvieran que poner una larga lista de includes al comienzo de cada script. La función __autoload() es invocada automáticamente por el motor PHP (si está definida) en caso de que se intente usar una clase o interfaz que todavía no hayan sido definidos. Es como una última oportunidad.

En el caso de CodeIgniter la siguiente función cargaría automáticamente cualquier clase del controlador o del modelo.

function __autoload($class_name) {

  $class_folders = array(
    'controllers',
    'models'
  );

  foreach ($class_folders as $folder_name) {

    $full_address = APPPATH . $folder_name . '/' . strtolower($class_name) . EXT;
    if (file_exists($full_address)) {
      require_once($full_address);
    }
  }
}

Ya solamente queda poner esa función en un lugar del código fuente de la aplicación que se ejecute siempre. Algunos autores recomiendan añadirla al final del archivo de configuraciones "/application/config/config.php". Yo he probado con el fichero "/application/config/autoload.php" porque me parecía un buen sitio pero el controlador se invoca antes, con lo que no funciona.

No hay comentarios:

Publicar un comentario