Ver Mensaje Individual
  #6 (permalink)  
Antiguo 23/08/2010, 13:44
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

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