Ver Mensaje Individual
  #15 (permalink)  
Antiguo 12/01/2011, 12:13
Avatar de destor77
destor77
 
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: Duda con FrontController

cesarpunk (muy copado tu nic punk not dead!!!),
Te cuento como lo hice yo en mi framework (que no quita que sea la manera correcta).
En el frontcontroller, solo dejo la lógica para saber que controller ejecutar y configurar algunos parametros como la ruta por defult de las vistas (mi controladores tienen una carpeta template con las vistas, en vez de tenerlas todas en un solo lugar para todos ellos, cuestion de gustos jeje).
Despues en mi clase "Controller", lo que hago es 2 cosas (que ahora que lo pienso puede ser medio redundante jeje), en el constructor tengo esto:
Código PHP:
Ver original
  1. $this->Utilidades->recursiveInclude($this->Config->get('path_root').$this->Config->get('modelsFolder'));

el método recursiveInclude es asi:
Código PHP:
Ver original
  1. public function recursiveInclude($path) {
  2.         $config = Config::singleton();     
  3.         if(!empty($path)) {    
  4.         $dir    = scandir($path);
  5.         if ( (is_array($dir)) && (count($dir) > 0) )
  6.             foreach($dir as $k => $v)
  7.             if ( !(is_dir($path.$v)) && ( file_exists($path.$v) ) && ($v != ".")  && ($v != "..") && (strtolower(end(explode(".", $v))) == 'php') )
  8.                 include_once($path.$v);
  9.             elseif ( is_dir($path.$v) && ($v != ".") && ($v != "..") && ($v != 'smarty') && ($v != '.svn'))
  10.                 recursiveInclude($path.$v."/");
  11.         }
  12.     }

que lo que hace es cargar todos los archivos php de un directorio por ejemplo "modelos".
Después en tus controladores tiene que instanciar los modelos:
Código PHP:
Ver original
  1. private $cliente;
  2.  
  3. function __construct(){
  4.   $this->cliente = new ClienteModelo();
  5. }

pero despues hice un método en el Controller que permite como CI o cake cargar de manera independiente uno o varios modelos, helpers, etc. que es asi:
Código PHP:
Ver original
  1. public function modelo($nombre) {
  2.         if(empty($nombre)) {
  3.         return false;
  4.         }
  5.  
  6.         if(is_array($nombre)) {
  7.         foreach($nombre as $modelo) {
  8.             $modelo = ucfirst($modelo);
  9.             //valido si existe el archivo del modelo
  10.             if(!empty($modelo)) {
  11.             if(file_exists($this->Config->get('root').$this->Config->get('modelsFolder').$modelo.'Model.php')) {
  12.                 //valido si no esta instanciada la clase previamente
  13.                 if(!class_exists($modelo)) {
  14.                 include_once($this->Config->get('root').$this->Config->get('modelsFolder').$modelo.'Model.php');
  15.                 $this->$modelo = new $modelo();
  16.                 }
  17.                 else {
  18.                 $this->$modelo = new $modelo();
  19.                 }
  20.  
  21.             }
  22.             else {
  23.                 $ruta = $this->Config->get('root').$this->Config->get('modelsFolder').$modelo.'Model.php';
  24.                 error_log("[".date("F j, Y, G:i")."] [Error: E_USER_NOTICE] [tipo modelos] No se encuentra el modelo: {$modelo} en {$ruta}- \n", 3,$this->Config->get('root').'/errores.log');
  25.  
  26.                 return false;
  27.             }
  28.             }
  29.         }
  30.         }
  31.         else {
  32.         //valido si existe el archivo de la libreria
  33.         $modelo = ucfirst($nombre);    
  34.         if(file_exists($this->Config->get('root').$this->Config->get('modelsFolder').$modelo.'Model.php')) {                       
  35.             //valido si no esta instanciada la clase previamente
  36.             if(!class_exists(ucfirst($modelo))) {          
  37.             include_once($this->Config->get('root').$this->Config->get('modelsFolder').$modelo.'Model.php');
  38.             $this->$modelo = new $modelo();
  39.             }
  40.             else {
  41.             $this->$modelo = new $modelo();
  42.             }          
  43.         }
  44.         else {         
  45.             $ruta = $this->Config->get('root').$this->Config->get('modelsFolder').$modelo.'Model.php';
  46.             error_log("[".date("F j, Y, G:i")."] [Error: E_USER_NOTICE] [tipo modelos]  No se encuentra el modelo: {$modelo} en {$ruta}\n", 3,$this->Config->get('root').'/errores.log');
  47.             //trigger_error("No se encuentra la libreria: {$nombre} en {$ruta}<br/>",E_USER_NOTICE);
  48.             return false;
  49.         }
  50.         }
  51.     }
con eso desde el controlador podes hacer esto:
Código PHP:
Ver original
  1. function __construct(){
  2.  $this->modelos('clientes');
  3. //o hacerlo asi:
  4. // $this->modelos(array('clientes','proveedores','otromodelo'));
  5. }
  6.  
  7. // y usarlo asi:
  8. public function index(){
  9.  $this->clientes->metodoDelModelo();
  10. }

esto que yo aplique a los modelos, podes aplicarlo a lo que te convenga, podes usar el mismo código y sólo tenes que cambiar la ruta a donde buscar y listo.
No se si es la mejor forma, pero a mi me funciona de maravillas.
Salu2