Foros del Web » Programando para Internet » PHP »

seleccionar controladores y vistas en MVC

Estas en el tema de seleccionar controladores y vistas en MVC en el foro de PHP en Foros del Web. Que opinan de este FrontController? Lo que hace, basicamente, es elegir un controlador y una vista. Sin embargo aún me falta una buena parte del ...
  #1 (permalink)  
Antiguo 22/08/2010, 15:12
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años
Puntos: 101
seleccionar controladores y vistas en MVC

Que opinan de este FrontController? Lo que hace, basicamente, es elegir un controlador y una vista. Sin embargo aún me falta una buena parte del proyecto y ya siento que el FrontController se hace demasiado largo:

Código PHP:
class FrontController{    

    var 
$controller;
    var 
$dbObject;
    var 
$phpvars;
    var 
$contentsVars;
    
    function 
__construct(){
                
        include 
"controllers/BaseController.php"
        
$baseController = new BaseController(); 
        
$baseController->defineConstants();
        
        include 
"models/Model.php"
        
$this->dbObject = new dbConsults();
        
        
        
/* Translations for the UI */
        
$this->phpvars $baseController->varsConsult($this->dbObject); 
                
        
// utf-8 fixer
        
include (APP_LIB."fixEncoding.php"); 
        
        
$this->includeControllers();
        
        
/*** init View ****/
        
include "views/View.php";            
        
$whichView $this->chooseView(); //$whichView = $this->chooseView(); // template name    
        
$View = new View($whichView); // display view
        
$View->prepareContents($this->phpvars$this->contentsVars);
        
$View->render();
    }    
    
    private function 
chooseView(){
        
        if ( isset(
$_GET['login']) )        
            
$response TEMPLATES."login.tpl.php";
        
        elseif ( isset(
$_GET['register']) )        
            
$response TEMPLATES."registration.tpl.php";
        
        elseif ( isset(
$_GET['lostpassword']) )        
            
$response TEMPLATES."lostpassword.tpl.php";
            
        elseif(isset(
$download))            
            
$response TEMPLATES."contents.download.tpl.php";
        
        elseif(!isset(
$_SESSION['name']))        
            
$response TEMPLATES."contents.NoLogued.tpl.php";
        
        elseif(isset(
$_SESSION['name']))        
            
$response TEMPLATES."contents.Logued.tpl.php";    
            
        return 
$response;    
    }

    private function 
includeControllers()
    {
        
        if (isset(
$_GET['login']))
        {    
        
            include 
"controllers/LoginController.php"
            
$LoginController = new LoginController($this->dbObject);
            
$this->contentsVars['usersData'] = $LoginController->checkUser();                    
        }    
        elseif (isset(
$_GET['register']))
        {    
        
            include 
"controllers/RegistrationController.php"
            
$RegistrationController = new RegistrationController($this->dbObject);
            
$this->contentsVars['usersData'] = $RegistrationController->registerUser();    
        }
        elseif (isset(
$_GET['logout']))
        {    
        
            include 
"controllers/LoginController.php"
            
$LoginController = new LoginController($this->dbObject);
            
$LoginController->logout();
        }    
        elseif (isset(
$_GET['lostpassword']))
        {    
        
            include 
"controllers/RememberPassController.php"
            
$RememberPassController = new RememberPassController($this->dbObject);
            
$this->contentsVars['usersData'] = $RememberPassController->rememberPassword();
        }
        elseif (!isset(
$_GET['load']) and (FILENAME == "index"))
        {
            
            include 
"controllers/MainPageController.php"
            
$MainPageController = new MainPageController();
            
$this->contentsVars['tutorialsList'] = $MainPageController->listTutorials($this->phpvars$this->dbObject);                        
        }
        else{
        
            include 
"controllers/PageController.php"
            
$PageController = new PageController($this->dbObject);
            
$this->contentsVars['theContents'] = $PageController->printPageContents();    
        }
        
        include 
"controllers/MenusController.php"
        
$MenusController = new MenusController($this->dbObject);
        
$this->contentsVars['mainLinks'] = $MenusController->printMainMenu$this->phpvars );
        @
$this->contentsVars['relPages']  = $MenusController->printSecondaryMenu$contentsVars['theContents']['relatedPages'] );
        
        include 
"controllers/TagsController.php"
        
$TagsController = new TagsController($this->dbObject);
        
$this->contentsVars['theTags'] = $TagsController->tag_cloud();
    }    
    

Además, tengo ya muuchas plantillas y una sola vista. Así que creo que estoy equivocando los conceptos en algún punto.
  #2 (permalink)  
Antiguo 22/08/2010, 16:48
Avatar de 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: 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.
  #3 (permalink)  
Antiguo 22/08/2010, 19:38
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años
Puntos: 101
Respuesta: seleccionar controladores y vistas en MVC

Veo. Gracias por publicarlo.

Lo que estas haciendo con el constructor y con el metodo route() es definir rutas locales y absolutas para distintas carpetas. Yo a eso lo hago con define() para que esten disponibles en todas las clases. Pero veo que vos usas metodos magicos. Esos metodos son tácitos y no hay que redeclararlos? Van a estar presentes dentro de las demás clases o hay que pasarlos como parámetros?

Luego seteas un controlador dependiendo de una variable get:
$controller = $_GET['controlador'];

Mismo con una acción:
$action = $_GET['accion'];

A eso lo he visto en el framework Zend. Y quisiera aprender a implementarlo.

Más adelante definis idioma en session y en cookie. E incluís una pagina de idioma que supongo que contiene variables especificas para el idioma.

Y finalmente hay un método loader() que supongo que carga las clases automáticamente en vez de hacer includes para cada una?.

En fin, lo que me haría falta es definir un Controller abstracto, e implementarlo con varios otros controladores que serían llamados por una variable get (que siempre debe estar definida, no?).

También debería aprender a ligar los controladores con las vistas. En tu FrontController vos tenés esto:

$vista=$config->get('path') . '/controladores/' . $nombre[0] . '/templates/';
$config->set('vista',$vista);

Pero no estás instanciando la vista aún, no?
  #4 (permalink)  
Antiguo 22/08/2010, 20:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: seleccionar controladores y vistas en MVC

Recuerden que uno de los principios básicos de la programación orientada a objetos es el correcto diseño de sus clases y el de delegar responsabilidades.

Me refiero que intenten hacer sus clases en componentes independientes, que se ocupen a la tarea específica.

El FrontController, inicia y llama al controlador, el Router rutea las rutas correctas desde la URL, la vista renderea, el controller realiza las acciones etc.

Si hacen una clase todo en uno luego es más complicado el mantenimiento, recuerden la clave en el buen diseño, es la abstracción y la delegación de tareas.

Saludos.
  #5 (permalink)  
Antiguo 22/08/2010, 21:11
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años
Puntos: 101
Respuesta: seleccionar controladores y vistas en MVC

Bueno, este es el FrontController según lo que pude concebir hasta ahora:

Código PHP:
class FrontController{    

    var 
$controller;
    
    function 
__construct(){
        
        
$this->defineConstants(); // url and path constants
        
$this->callController();        
    }    
    
    public function 
defineConstants(){ 
        
        
// If moving to another server, we must update this!
        
if (strpos($_SERVER["HTTP_HOST"], "localhost") !== false){
            
define('APP''http://localhost/AoI/AoITutorials/application/');
            
define('WEB''http://localhost/AoI/AoITutorials/web/'); // localhost for development
        
}
        else {    
            
define('APP''http://www.artofillusion.com.ar/application/');
            
define('WEB''http://www.artofillusion.com.ar/AoITutorials/');
        }
        
        
// fix for domain and subdomain issue: aoi-castellano / artofillusion.com.ar
        
if (strpos($_SERVER["HTTP_HOST"], "castellano") !== false){
            
header("Location: ".WEB);  // redirect.
        
};
        

        
define('WEB_REL_PATH'$_SERVER['DOCUMENT_ROOT']."AoI/AoITutorials/"."web/");        
        
define('APP_REL_PATH'$_SERVER['DOCUMENT_ROOT']."AoI/AoITutorials/"."application/");
        
define('APP_LIB'APP_REL_PATH.'Library/');    

        
// html <head> related constants (absolute path)
        
define('LIBRARY_DIR''Library/');
        
define('LINK_CSS''Library/styles/');
        
define('IMG_DIR''Library/images/');
                
        
// html <body> related constants (for including ui images, etc)                
        
define('CONTROLLERS'APP_REL_PATH.'controllers/');
        
define('TEMPLATES'APP_REL_PATH.'templates/');            
        
define('LIBRARY'WEB_REL_PATH.'Library/'); 
        
define('CSS_DIR'LIBRARY.'styles/');
    
    }
    
    private function 
callController(){
        
        
// get controller
        
if(! empty($_GET['controller']))
              
$controllerName $_GET['controller'] . 'Controller';
        else
              
$controllerName "MainPageController";
        
        
// get action
        
if(! empty($_GET['action']))
            
$actionName $_GET['action'];
        else
            
$actionName "index";
    
        
// check controller existence    
        
if(is_file(CONTROLLERS.$controllerName.".php"))
            require 
CONTROLLERS.$controllerName.".php";
        else
            die(
'Unexisting page - Go to index?');
        
        
// check action existence    
        
if (is_callable(array($controllerName$actionName)) == false)
        {
             die(
'Unexisting action - Go to index?');
        }
        
        
// instantiate the controller
        
$controller = new $controllerName();
        
$controller->$actionName();
        
$controller->callView();    
    }


  #6 (permalink)  
Antiguo 23/08/2010, 13:44
Avatar de 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: seleccionar controladores y vistas en MVC

Cita:
Iniciado por mayid Ver Mensaje
Veo. Gracias por publicarlo.

Lo que estas haciendo con el constructor y con el metodo route() es definir rutas locales y absolutas para distintas carpetas. Yo a eso lo hago con define() para que esten disponibles en todas las clases. Pero veo que vos usas metodos magicos. Esos metodos son tácitos y no hay que redeclararlos? Van a estar presentes dentro de las demás clases o hay que pasarlos como parámetros?
esos metodos los uso una sola vez, va en realidad se usa cada vez que se llama a un controlador, es decir en mi index.php tengo esto:
Código PHP:
Ver original
  1.     require 'core/clases/FrontController.php';
  2.    
  3.     $router = new Router($_SERVER['PHP_SELF']);
  4.     $router->loader();
  5.     $router->route();
  6.     ob_flush();
que lo que hace es instanciar el frontcontroller, llamar al cargador de clases y despues ejecutar el ruteo (esto no quiere decir que este bien, si ves los index.php de otros framework pueden tener mucho mas código, pero eso va en cada uno). También esta armado de esta manera, porque en mi framework puedo tener multiple aplicaciones que comparten el mismo core.
Cita:
Iniciado por mayid Ver Mensaje
Luego seteas un controlador dependiendo de una variable get:
$controller = $_GET['controlador'];

Mismo con una acción:
$action = $_GET['accion'];

A eso lo he visto en el framework Zend. Y quisiera aprender a implementarlo.
Algunos lo manejamos asi, otros usan $_REQUEST y otro hacen una "limpiado" de los $_get, $_post, etc.

Cita:
Iniciado por mayid Ver Mensaje
Más adelante definis idioma en session y en cookie. E incluís una pagina de idioma que supongo que contiene variables especificas para el idioma.
Exacto si en la configuración seteo que el sitio es multilenguaje incluyo el idioma seteo la cookie y la session.

Cita:
Iniciado por mayid Ver Mensaje
Y finalmente hay un método loader() que supongo que carga las clases automáticamente en vez de hacer includes para cada una?.

En fin, lo que me haría falta es definir un Controller abstracto, e implementarlo con varios otros controladores que serían llamados por una variable get (que siempre debe estar definida, no?).
Exacto con el loader(); "incluyo" todos los archivos de x carpeta para no tener que hacer un include por cada uno, te imaginas si tenes que hacer 50 includes a mano.... En cuanto al controller abstracto yo lo uso así (no quiere decir que sea la mejor forma... antes que me rete gatorv jejeje)
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 Control.php
  9.      *
  10.      * Modificaciones
  11.      * 14/02/10 - Se agrego la clase email para enviar correos electronicos.
  12.      */
  13.  
  14.     abstract class Controller {
  15.  
  16.     protected $Config;
  17.     protected $Email;
  18.     protected $Paginador;
  19.     protected $Session;
  20.     protected $Utilidades;
  21.     protected $Imagen;
  22.     protected $Upload;
  23.     protected $Captcha;
  24.     protected $BreadCrumb;
  25.     protected $Vistas;
  26.     protected $Mensajes;
  27.     protected $Debug;
  28.     protected $Calendario;
  29.     protected $PermisosUsuarios;
  30.     protected $Log;
  31.     protected $Fechas;
  32.     protected $Librerias = array();
  33.  
  34.    
  35.  
  36.     /**
  37.      * Constructor
  38.      *
  39.      * @access public
  40.      * @version 0.1
  41.      *
  42.      */
  43.     public function __construct() {
  44.  
  45.  
  46.         //creo una instancia de la configuración
  47.         $this->Config = Config::singleton();
  48.  
  49.         //creo la instancia para las sesiones.
  50.         $this->Session  = new Session();
  51.         $this->Session->Session();
  52.  
  53.         //creo las instancias para el email
  54.         $this->Email = new Email();
  55.  
  56.         //creo las instancias para las utilidades varias
  57.         $this->Utilidades   = new Utilidades();
  58.  
  59.         //creo la instancia para el captcha
  60.         $this->Captcha = new Captcha();
  61.  
  62.  
  63.         //creo la instancia para las imagenes
  64.         $this->Imagen   = new SimpleImage();
  65.  
  66.         //creo la instancia para el upload
  67.         $this->Upload   = new file_upload();
  68.  
  69.         //creo la instancia para el breadcrumb
  70.         $this->BreadCrumb   = new breadCrumbs();
  71.  
  72.         //creo la instancia de la vista
  73.         $this->Vistas   = new Vistas();
  74.  
  75.         //creo la instancia de los mensajes
  76.         $this->Mensajes = new Mensajes();
  77.  
  78.         //creo la instancia del calendario
  79.         $this->Calendario = new calendar();
  80.  
  81.         //creo la instancia de los permisos
  82.         $this->PermisosUsuarios = new PermisosUsuarios();
  83.  
  84.         //crea la instancia para el log
  85.         $this->Log = new Log();
  86.  
  87.         //crea la instancia para las fechas
  88.         $this->Fechas = new Fechas();
  89.  
  90.         //creo la instancia del FirePHP
  91.         if($this->Config->get('entorno')!='pro') {
  92.         $this->Debug = FirePHP::getInstance(true);
  93.         }
  94.         else {
  95.         FirePHP::getEnabled(false);
  96.         }
  97.  
  98.         //Incluimos los modelos
  99.         $this->Utilidades->recursiveInclude($this->Config->get('modelsFolder'));
  100.  
  101.     }


Cita:
Iniciado por mayid Ver Mensaje
También debería aprender a ligar los controladores con las vistas. En tu FrontController vos tenés esto:

$vista=$config->get('path') . '/controladores/' . $nombre[0] . '/templates/';
$config->set('vista',$vista);

Pero no estás instanciando la vista aún, no?
Exacto lo que estoy haciendo ahí es setear el atributo 'vista' con la ruta donde estan los html, ya que mi estructura de directorio es:
Cita:
admin
--------controladores
-------------nombrecontrolador
-------------------templates
-----------------------index.html
-----------------------addUpdate.html
-------------------nombrecontrolador.php
La vista la instancio en el controlador abstracto.
Espero te sirva de algo... salu2
  #7 (permalink)  
Antiguo 23/08/2010, 14:21
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años
Puntos: 101
Respuesta: seleccionar controladores y vistas en MVC

Me sirve, claro.

No entiendo bien tu clase abstracta. Ya teniendo un FrontController, yo lo que estoy haciendo ahora es definir un BasicController que:
- maneja cadenas en utf-8
- setea un estilo para la pagina
- consulta las variables de idioma
- llama a una vista que se le pasa por parametro.

Luego, genero al menos dos ramas que heredan de ese controlador. Una para mostrar las pagina, y otra para gestionar el login. Tendría que hacer algunas otras ramas para gestionar otras situaciones.

Mi inquietud es que cantidad de controladores y vistas debiera escribir. Ya tengo unos 10 controllers solo para mostrar las paginas (contenidos+menues+tagCloud), y hacer el login. Por ejemplo, para el login tengo:

-registrationController.php
-loginController.php
-lostPasswordController.php

Esos tres van asociados a una vista (loginView), y usan unas cuatro plantillas.

Me falta convertir una buena parte de mi projecto a MVC y no se bien si hacer pocos controladores superpoderosos, o varios con tareas puntuales. Por ejemplo, para controlar uploads, generar paginas nuevas, mostrar un panel de administrador, una seccion de notas para editores, etc, etc.

Quizás lo que me pasa es que aún no se usar las acciones, y que con eso se me compactaría el numero de controladores a escribir. Por ahora, todos los controladores tienen una acción index por default, que es llamada si no se pasa un parametro $_GET en especial.

Además, viendo tu codigo, que solo busca un controlador y una accion, no se bien como adaptar mi proyecto porque yo usaba la url para cambiar de lenguage también, y de ámbito. Mismo, necesitaría la url para hacer loads de diferentes paginas. Por eso en mi primera publicación hacía mucho esto:

Cita:
if (isset($_GET['login']))
{

}
elseif (isset($_GET['register']))
{
}
elseif (isset($_GET['logout']))
{

}
elseif (isset($_GET['lostpassword']))
{

}
elseif (!isset($_GET['load']))
...
Vuelvo a decir que ya descarté ese método y que estoy implementando el uso de variables get que se corresponden con controladores y acciones.

En fin, gracias!
  #8 (permalink)  
Antiguo 23/08/2010, 15:09
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: seleccionar controladores y vistas en MVC

Creo que te salia mucho mejor usar Zend Framework o parecidos para que veas como aplican varios patrones de diseño en su MVC tales como

"Two step view" y "Composite view"

http://martinfowler.com/eaaCatalog/twoStepView.html

http://java.sun.com/blueprints/corej...ositeView.html

Para resolver varios de los problemas que mencionas aquí, yo se que deseas aprender pero creo que el problema de aprender así es que empiezas por el lado equivocado cuando en realidad necesites hacer cambios en tu código te costara mucho trabajo ya que todo lo construiste sin una planeación mas robusta del código.

Yo por ejemplo vi sus ruteadores y sus Front controllers de Code Igniter, Cake PHP, Solar y Zend Framework y me gusto mucho la elegancia con la cual lo hace Zend y despues aplicar los conceptos a tu MVC es sencillo pero si no entiendes correctamente la delegación de funciones a objetos que les conciernen dificilmente vas a lograr algo más que mal código y tu intento por migrar tu aplicación a MVC sera meramente un "intento lleno de trucos parches y mañas"
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #9 (permalink)  
Antiguo 23/08/2010, 15:44
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años
Puntos: 101
Respuesta: seleccionar controladores y vistas en MVC

Gracias por comentar. Si, temo esto de andar parchando y arreglando.

También es un problema avanzar "sin una planeación robusta". Y sin embargo, no puedo planear hasta no comprender del todo el modelo MVC y algún framework. Es por eso que la migración me sirve como campo de juego en donde ir resolviendo y comprendiendo la complejidad del patron.

Gracias por los links. Curiosamente son los mismos que dan en la quickstart de Zend. Que estoy estudiando desde hace algunos días:
http://framework.zend.com/manual/en/...te-layout.html

Puedo decir que tengo a Zend como tutor. Pero todavía no lo conozco enteramente. Y mi problema principal es migrar.

Etiquetas: controladores, mvc, seleccionar, vistas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:48.