Acceder a recursos de CodeIgniter desde tus propias librerías

  • Por
  • PHP
Veamos cómo acceder a los recursos del framework PHP CodeIgniter, desde el código de las librerías creadas por tu mismo.
Ahora que ya sabemos un poco sobre cómo crear nuestras propias librerías en CodeIgniter, vamos a comentar cómo se accede, desde su código, a los recursos nativos de CodeIgniter. Cuando nos referimos a los recursos de CodeIgniter puede ser cualquier cosa que dependa del framework, como las vistas, modelos u otras librerías, por poner varios ejemplos.

Si estás leyendo el Manual de CodeIgniter que estamos publicando en DesarrolloWeb.com, quizás no entiendas de entrada para qué puedes necesitar esos recursos, pero a medida que te plantees hacer cosas más o menos interesantes en tus librerías verás que necesitas invocar recursos dependientes de otros componentes de tu aplicación web. Para aclarar este punto, en la parte final de este artículo mostraremos un ejemplo de librería que utiliza un modelo, para acceso a la base de datos desde la propia librería.

Obtener la instancia de CodeIgniter con get_instance()

La función get_instance() sirve para acceder a una instancia del superobjeto CodeIgniter, con la que podremos recuperar o usar todos los recursos nativos de CodeIgniter.

Para hacernos una idea, en nuestros controladores accedemos a los recursos de CodeIgniter por medio de la variable $this, con la que hacemos cosas como las siguientes:

$this->load->helper('array');
$this->load->library('Milibreria');
$this->config->item('base_url');

Desde los controladores, vistas o modelos podemos acceder a esa variable $this sin problemas, pero si estamos definiendo nuestras librerías, u otras clases que vamos a utilizar en CodeIgniter, la variable $this no servirá para acceder a CodeIgniter. En ese caso debemos utilizar este modelo de código para obtener la instancia del framework.

Asignamos CodeIgniter dentro de una variable con get_instance().

$CI =& get_instance();

Ahora accedemos a los métodos del superobjeto CodeIgniter por medio de esa variable.

$CI->load->helper('array');
$CI->load->library('Milibreria');
$CI->config->item('base_url');

Nota: Te habrás fijado en el carácter "&" al recuperar la instancia del superobjeto CodeIgniter. Esto se hace para que se pase por referencia el objeto, así podrás usar el objeto CodeIgniter original en vez de utilizar una copia del mismo. Es importante este detalle.

Para los usuarios de PHP 4: En entornos donde todavía se trabaje con PHP 4 tenemos que tener en cuenta la siguiente recomendación que podemos encontrar en la guía de uso de CodeIgniter. Por favor, no crees instancias de CodeIgniter con get_instance() desde los constructores de las clases, porque te puede dar problemas. Esto es porque PHP 4 tiene un problema al obtener referencias al objeto CodeIgniter en constructores, pues los objetos no existen antes de que la clase sea totalmente instanciada.

Ejemplo de librería que hace uso de recursos de CodeIgniter

Veamos ahora un ejemplo con el que afianzar nuestros conocimientos. Simplemente vamos a mostrar el código de una librería que tiene una función en la que se accede a base de datos. Como en CodeIgniter el acceso a base de datos se centraliza en los modelos, tendremos que acceder a recursos de CodeIgniter desde la librería.

Este código lo he sacado de uno de los ejemplos de CodeIgniter que veremos más adelante en DesarrolloWeb.com. Quizás ahora no tenga mucho sentido, porque no conocemos el modelo que estamos invocando, pero sirve para hacernos una idea.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Validador{
   protected $ci;
   
   function __construct(){
      $this->ci =& get_instance();
   }

   //comprueba si un email está repetido
   function hay_email_repetido($str){
      $this->ci->load->model('usuario_model');
      if ($this->ci->Usuario_model->existe_email($str))
      {
         return TRUE;
      }
      else
      {
         return FALSE;
      }
   }
}

En el código anterior se ha definido una propiedad en la clase $ci. Luego, en el constructor colocamos la instancia del superobjeto CodeIgniter en esa propiedad.

Nota: El modelo de constructor que hemos utilizado en el código anterior es de PHP 5. Además, recordar que llamar en el constructor a get_instance() da problemas en PHP 4. Por lo que la llamada a get_instance() la deberíamos poner en el código de la función.

En la función hay_email_repetido() se accede a la propiedad $ci a través de $this->ci, donde tenemos la instancia de CodeIgniter. Podemos a través de ella acceder a la carga de modelos y la invocación de alguna de las funciones del modelo.

En el próximo artículo mostraremos cómo se pueden extender las librerías nativas de CodeIgniter y cómo podemos reemplazarlas totalmente por otro código distinto.