viernes, 14 de diciembre de 2012

Como extender clases del modelo en CodeIgniter

Una de las características de la Programación Orienta a Objetos es que las clases pueden heredar características de una clase base. En el patrón de diseño MVC que implementa CodeIgniter todas las clases que usamos al diseñar nuestra aplicación derivarán de alguna clase base del framework (CI_Model, CI_Controller, etc.) pero también es posible crear nuestras propias clases base.

Para ello la clase base derivará de alguna del framework y la clase definitiva derivará de nuestra clase base. Como en el siguiente ejemplo:

class Mybaseclass_model extends CI_Model {

  public function __construct() {
    parent::__construct();
  }

  // ...
}

class Myclass_model extends Mybaseclass_model {

  public function __construct() {
    parent::__construct();
  }

  // ...
}

class Myclass2_model extends Mybaseclass_model {

  public function __construct() {
    parent::__construct();
  }

  // ...
}

El problema de hacer esto es que las diferentes clases Mybaseclass_model, Myclass_model y Myclass2_model estarán definidas en archivos distintos, con lo que al intentar cargar una de las clases derivadas nos encontraremos con el error:

Fatal error: Class 'Mybaseclass_model' not found in
W:\www\test\application\models\myclass_model.php on line 17.

Para solucionarlo es necesario cargar la clase base antes que la derivada, ya sea manualmente, como vemos abajo, a sea agregando la clase base a la carga automática de componentes del modelo en el archivo "/application/config/autoload.php"

$this->load->model('Mybaseclass_model');
$this->load->model('Myclass_model');

ACTUALIZACIÓN:

El método descrito en este artículo para extender clases del modelo sin recibir el temible error "Class not found" no es válido para extender clases del controlador, pues éstas son cargadas por el propio framework. Por suerte en PHP 5 tenemos la función __autoload() que permite extender clases del modelo y del controlador en CodeIgniter.

No hay comentarios:

Publicar un comentario