Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/08/2010, 16:48
Avatar de destor77
destor77
 
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años, 2 meses
Puntos: 43
Respuesta: seleccionar controladores y vistas en MVC

creo que estas mezclando algunas cosas, el frontcontroller solo debería encargarse de saber a que controlador tiene que llamar, este es el frontcontroller que uso en mi framework:
Código PHP:
Ver original
  1. /**
  2.      * @package Punk Framework
  3.      * @copyright Copyright (C) 2009 Onírico Sistemas. Todos los derechos reservados.
  4.      * @version 0.1
  5.      * @author Lucas M. Sastre
  6.      * @link http://www.oniricosistemas.com
  7.      *
  8.      * @name FrontController.php
  9.      */
  10.     /**
  11.      * Modificaciones realizadas
  12.      *
  13.      * 28/02/2010
  14.      * - se modificó el código, ahora valida si la aplicación esta siendo ejecutada
  15.      * en el servidor del cliente o en un servidor local, y a partir de esa
  16.      * validación setear las ruta_absolutas de los directorios de la apliación.
  17.      *
  18.      * 07/03/2010
  19.      * - se agrego un ruta_absoluta relativa para el directorio de las imagenes.
  20.      *
  21.      * 23/03/2010
  22.      * - Se agrego el redireccionamiento error404.
  23.      * - Se agrego el guardado de errores en un archivo errores.log
  24.      *
  25.      * 30/03/2010
  26.      * - se agrego al método loader que evite los directorios .svn
  27.      *
  28.      * 02/04/2010
  29.      * - Se modifico en el FrontController.php los include y la validación para el idioma.
  30.      */
  31.  
  32.     class Router {
  33.     private static $instance;
  34.     private $servidor;
  35.     private $ubicacion;
  36.     private $ruta;
  37.     private $ruta_absoluta;
  38.     private $path;
  39.  
  40.     /**
  41.      * Constructor
  42.      *
  43.      * @name _construct
  44.      * @param $registry
  45.      * @access public
  46.      * @version 0.1
  47.      * @author Lucas M. Sastre
  48.      *
  49.      *
  50.      */
  51.     function __construct($param) {
  52.         $this->servidor = $_SERVER['HTTP_HOST'];
  53.         $ubicacion=explode('/',$_SERVER['PHP_SELF']);
  54.         array_pop($ubicacion);
  55.         $this->ubicacion = $ubicacion;
  56.         $this->path = implode('/',$this->ubicacion);
  57.         if(array_search('admin',$this->ubicacion)) {
  58.         array_pop($this->ubicacion);
  59.         $ruta = implode('/',$this->ubicacion);
  60.         $this->ruta_absoluta = $ruta.'/' ;
  61.         }
  62.         else {
  63.         $ruta = implode('/',$this->ubicacion);
  64.         $this->ruta_absoluta = $ruta.'/' ;
  65.         }
  66.         $this->ruta = $_SERVER['DOCUMENT_ROOT'].$ruta.'/';
  67.     }
  68.  
  69.     /**
  70.      *  router
  71.      * @name router
  72.      * @access public
  73.      * @version 0.1
  74.      * @author Lucas M. Sastre
  75.      */
  76.     public function route() {
  77.         include_once($this->ruta.'configuracion.php');
  78.         $config->set('root',$this->ruta);
  79.         //configuro la ruta_absoluta de las imagenes
  80.         $config->set('imagenes',$config->get('root').'images/');
  81.         $config->set('urlImagenes','http://'.$this->servidor.$this->ruta_absoluta.'images/');
  82.  
  83.         //seteo el path
  84.         $path=$config->get('root');
  85.  
  86.         //valido si no estoy en el root y seteo el nuevo path
  87.         if(strpos($this->path,'admin')) {
  88.         $path=$config->get('root').'admin';
  89.         //seteo la ruta_absoluta url
  90.         $config->set('urlRoot','http://'.$this->servidor.$this->ruta_absoluta);
  91.         }
  92.         else {
  93.         $path=$config->get('root').'website';
  94.         //seteo la ruta_absoluta url
  95.         $config->set('urlRoot','http://'.$this->servidor.$this->ruta_absoluta);
  96.         }
  97.  
  98.         //seteo el path definitivo
  99.         $config->set('path',$path);
  100.  
  101.         //cargo todas las clases
  102.         $this->loader($config->get('root').$config->get('core'));
  103.  
  104.         //obtengo el controlador que se envia por $_GET
  105.         $controller = $_GET['controlador'];
  106.  
  107.         //obtengo el controlador que se envia por $_GET
  108.         if(isset($_GET['accion'])) {
  109.         $action = $_GET['accion'];
  110.         }
  111.  
  112.  
  113.         //seteo el controlador si esta vacio seteo el controlador por default
  114.         if( empty($controller) ) {
  115.         $controller = 'indexController';
  116.         }
  117.         else {
  118.         $controller = $controller.'Controller';
  119.         }
  120.  
  121.         //unset($_COOKIE['leng']);
  122.         //cargo el lenguaje del sistema
  123.         if($config->get('multi')==1) {
  124.         $leng = Language::singleton();
  125.         $leng->get_session_handler();
  126.         $idiomaActual = $config->get('lenguaje');
  127.         setcookie ("leng", 'es', time () + 7*24*60*60);
  128.         session_start();
  129.         //echo "<pre>";print_r ($_COOKIE['leng']);echo "</pre>";exit();
  130.  
  131.         $_SESSION['leng'] = $idiomaActual;
  132.  
  133.         if(isset($_GET['leng'])) {
  134.             setcookie ("leng", $_GET['leng'], time () + 7*24*60*60);
  135.             $idiomaActual = $_GET['leng'];
  136.             $_SESSION['leng'] = $_GET['leng'];
  137.         }
  138.         elseif(isset($_COOKIE['leng'])) {
  139.             if(file_exists($config->get('root')."/lenguajes/".$_COOKIE['leng'].".php")) {
  140.             $idiomaActual = $_COOKIE['leng'];
  141.             $_SESSION['leng'] = $_COOKIE['leng'];
  142.             }
  143.         }
  144.         else {
  145.             if(file_exists($config->get('root')."/lenguajes/".$_SESSION['leng'].".php")) {
  146.             $idiomaActual = $_SESSION['leng'];
  147.  
  148.             }
  149.         }
  150.  
  151.         // Incluimos el archivo del idioma seleccionado
  152.         // o el archivo por defecto si no se seleccionó
  153.         // idioma o si no se encuentra el archivo
  154.         include $config->get('root')."/lenguajes/".$idiomaActual.".php";
  155.         }
  156.  
  157.         //extraigo el nombre del controlador.
  158.         $nombre=explode('Controller',$controller);
  159.  
  160.         //seteo la accion, si esta vacia seteo la acción por default
  161.         if( empty($action) ) {
  162.         $action = 'index';
  163.         }
  164.         else {
  165.         $action = $action ;
  166.         }
  167.  
  168.         //seteo la ruta_absoluta del controlador
  169.  
  170.         $controllerLocation =  $config->get('path') . '/controladores/' . $nombre[0] . '/'.$controller.'.php';
  171.         $vista=$config->get('path') . '/controladores/' . $nombre[0] . '/templates/';
  172.         $config->set('vista',$vista);
  173.  
  174.         //creo una instancia de los errores
  175.         //$errores= Errores::singleton();
  176.  
  177.         //valido si existe el archivo sino ejecuta la excepcion
  178.         if( file_exists( $controllerLocation ) ) {
  179.         include_once( $controllerLocation );
  180.         } else {
  181.         //trigger_error("No se encuentra el controlador $controllerLocation<br/>",E_USER_NOTICE);
  182.         error_log("[".date("F j, Y, G:i")."] [E_USER_NOTICE] [tipo Controlador] No se encuentra el controlador: {$controllerLocation}\n", 3,$config->get('root').'/errores.log');
  183.         header("Location:index.php?controlador=error404");
  184.         }
  185.  
  186.         //valido si existe la clase sino ejecuta la excepcion
  187.         if( class_exists( $controller, false ) ) {
  188.         $cont = new $controller();
  189.         } else {
  190.         //trigger_error( "No se encuentra la clase en el controlador $controller en $controllerLocation<br/>",E_USER_NOTICE);
  191.         error_log("[".date("F j, Y, G:i")."] [E_USER_NOTICE] [tipo Clase] No se encuentra la clase en el controlador $controller en $controllerLocation \n", 3,$config->get('root').'/errores.log');
  192.         header("Location:index.php?controlador=error404");
  193.         }
  194.  
  195.         //valido si existe el método sino ejecuta la excepcion
  196.         if( method_exists( $cont, $action ) ) {
  197.         $cont->$action();
  198.         } else {
  199.         //trigger_error( "La Acción $action no existe $action en la clase $controller en $controllerLocation<br/>",E_USER_NOTICE);
  200.         error_log("[".date("F j, Y, G:i")."] [E_USER_NOTICE] [tipo Accion] La Acción $action no existe $action en la clase $controller en $controllerLocation \n", 3,$config->get('root').'/errores.log');
  201.         header("Location:index.php?controlador=error404");
  202.         }
  203.  
  204.  
  205.  
  206.     }
  207.     /**
  208.      * Cargador de clases
  209.      *
  210.      * @name loader
  211.      * @access public
  212.      *  @version 0.2
  213.      *  @since 0.1
  214.      *  @author Lucas M. Sastre
  215.      */
  216.     public function loader() {
  217.         //separo los parametros de la url
  218.         /*$ubicacion=explode('/',$path);
  219.         $this->servidor=$_SERVER['HTTP_HOST'];
  220.  
  221.         //creo el path para las clases
  222.         if($this->servidor!='localhost' && $this->servidor!='192.168.1.105' && $this->servidor!='127.0.0.1:4001'){
  223.             $path=$_SERVER['DOCUMENT_ROOT'].'/core/clases/';
  224.         }
  225.         else{
  226.             $path=$_SERVER['DOCUMENT_ROOT']."/".$ubicacion[1].'/core/clases/';
  227.         }*/
  228.  
  229.         $path = str_replace('\\','/',dirname(__FILE__)).'/';
  230.         //echo "<pre>";print_r ($path);echo "</pre>";exit();
  231.         //echo "<pre>";print_r (dirname(__FILE__));echo "</pre>";exit();
  232.  
  233.         //leo el directorio
  234.         $dir = scandir($path);
  235.         //valido si es un array y que tenga algun contenido
  236.         if ((is_array($dir)) && (count($dir) > 0))
  237.         foreach ($dir as $k=>$v)
  238.         //recorro el directorio y valido que sea un archivo php
  239.             if ( !(is_dir($path.$v)) && ( file_exists($path.$v) ) && ($v != ".") && ($v != "FrontController.php") && ($v != "..") && (strtolower(end(explode(".", $v))) == 'php') )
  240.             //incluyo el archivo
  241.             include_once($path.$v);
  242.             elseif ( is_dir($path.$v) && ($v != ".") && ($v != "..") && ($v != 'smarty') && ($v != '.svn')&& ($v != 'ajax'))
  243.             loader($path.$v."/");
  244.     }
  245.     }

si te fijas en ningun momento instancio la vistas u otras clases, solamente hago la instancia del controlador a llamar.

Después lo que hago es crear una clase abstracta para que todos los contoladores hereden de ella, y una clase vista para el manejo de las vistas (obvio no jejeje) cuya instancia la hago en la clase abastracta para que este disponible para todos los controladores.