Cita:
Iniciado por mayid 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 require 'core/clases/FrontController.php';
$router = new Router($_SERVER['PHP_SELF']);
$router->loader();
$router->route();
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 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 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 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/**
* @package Punk Framework
* @copyright Copyright (C) 2009 Onírico Sistemas. Todos los derechos reservados.
* @version 0.1
* @author Lucas M. Sastre
* @link http://www.oniricosistemas.com
*
* @name Control.php
*
* Modificaciones
* 14/02/10 - Se agrego la clase email para enviar correos electronicos.
*/
abstract class Controller {
protected $Config;
protected $Email;
protected $Paginador;
protected $Session;
protected $Utilidades;
protected $Imagen;
protected $Upload;
protected $Captcha;
protected $BreadCrumb;
protected $Vistas;
protected $Mensajes;
protected $Debug;
protected $Calendario;
protected $PermisosUsuarios;
protected $Log;
protected $Fechas;
protected $Librerias = array();
/**
* Constructor
*
* @access public
* @version 0.1
*
*/
public function __construct() {
//creo una instancia de la configuración
$this->Config = Config::singleton();
//creo la instancia para las sesiones.
$this->Session = new Session();
$this->Session->Session();
//creo las instancias para el email
$this->Email = new Email();
//creo las instancias para las utilidades varias
$this->Utilidades = new Utilidades();
//creo la instancia para el captcha
$this->Captcha = new Captcha();
//creo la instancia para las imagenes
$this->Imagen = new SimpleImage();
//creo la instancia para el upload
$this->Upload = new file_upload();
//creo la instancia para el breadcrumb
$this->BreadCrumb = new breadCrumbs();
//creo la instancia de la vista
$this->Vistas = new Vistas();
//creo la instancia de los mensajes
$this->Mensajes = new Mensajes();
//creo la instancia del calendario
$this->Calendario = new calendar();
//creo la instancia de los permisos
$this->PermisosUsuarios = new PermisosUsuarios();
//crea la instancia para el log
//crea la instancia para las fechas
$this->Fechas = new Fechas();
//creo la instancia del FirePHP
if($this->Config->get('entorno')!='pro') {
$this->Debug = FirePHP::getInstance(true);
}
else {
FirePHP::getEnabled(false);
}
//Incluimos los modelos
$this->Utilidades->recursiveInclude($this->Config->get('modelsFolder'));
}
Cita:
Iniciado por mayid 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