Después de desarrollar dos proyectos utilizando CodeIgniter decidí para los nuevos proyectos utilizar Kohana el cual hasta ahora ha sido un cambio agradable desde el punto de vista de una mejor orientación a objetos y el soporte de una comunidad mas dinámica.
Debido a que CI y por supuesto Kohana que es un fork de la primera, separan a las entidades del MVC en directorios por separado: /controllers, /models y /views, me he acostumbrado a crear subdirectorios dentro de ellas para separar los objetos de cada uno de los módulos que componen al sistema de información. Ejemplo: /controllers/admin/perfil.php.
Con CI cargaba los modelos utilizando la siguiente sintáxis:
$this -> load -> model("admin/perfil");
Ahora con Kohana esta sintáxis es obsolota y deben instanciarse los objetos, ya sea con un ámbito local:
$perfil = new Perfil_Model();
O con un ámbito global a todo el controlador.
$this -> perfil = new Perfil_Model();
El problema es que ya no hay forma de especificar el subdirectorio del módulo (no confundir con los módulos de Kohana) que para hechos prácticos de la instanciación del modelo es una cadena de texto.
Estuve revisando la documentación y los foros de Kohana y al parecer aún no hay una solución nativa a esta situación, así que decidí implementar la mia propia que permita la carga modelos en subdirectorios desde cualquier controlador y que hasta la fecha me ha funcionado bien.
Para la implementación de la autenticación que me dispongo a realizar próximamente he definido mi propio controlador base definiendo la clase Controller en application/libraries/MY_Controller.php. Con esto defino los comportamientos generales que tendrán todos los controladores del proyecto.
<?php defined('SYSPATH') or die('No direct script access.');
class Controller extends Controller_Core
{
public function __construct()
{
parent::__construct();
}
}
?>
A este controlador base le agrego los métodos necesarios para localizar el archivo .php que contiene el modelo que se intenta instanciar y realizo las modificaciones necesarias para incluír esta búsqueda durante la etapa de autocarga de clases (autoload). Los nombres del módulo (del SI), controlador, acción y parámetros son obtenidos en tiempo de ejecución gracias a la facilidad de la clase Router.
El primer método a implementarse es buscarArchivo($directorio, $archivo) el cual se encarga de realizar la búsqueda física y recursiva de $archivo dentro del $directorio especificado.
Se implementa al método auto_load($clase) el cual determina si la clase a cargarse es un modelo debido a la terminación _Model de su nombre de clase, por ahora ignora cualquier otro tipo. En caso de ser un modelo realiza la búsqueda utilizando al método definido anteriormente, el cual en caso de encontrarlo lo incluye para hacerlo disponible al ambiente de ejecución.
Como paso final, en el constructor del Controller se le indica que tome al método auto_load como una de las funciones ejecutadas durante la autocarga de clases.
spl_autoload_register(array('Controller', 'auto_load'));
Gracias a estas modificaciones es posible realizar la creación del objeto new Perfil_Model y el controlador se encargará de realizar la búsqueda y encontrarlo dentro del subdirectorio /models/admin. Sobra hacer notar que para esta solución, la colisión de nombres es un problema ya que se resuelve según sea la clase que se encuentra físicamente primero en el directorio de archivos.
El código fuente del ejemplo descrito puede descargarse del siguiente enlace: MY_Controller.php.
Tags: Kohana, PHP