Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

FrontController

Estas en el tema de FrontController en el foro de Frameworks y PHP orientado a objetos en Foros del Web. buenas, me han pasado una aplicación para que realice varios cambios la misma usa MVC, y esta estructurada de esta manera: core/ FrontController.php controladores/ .....itemsControlador.php ...
  #1 (permalink)  
Antiguo 06/12/2009, 11:56
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
FrontController

buenas, me han pasado una aplicación para que realice varios cambios la misma usa MVC, y esta estructurada de esta manera:
core/
FrontController.php
controladores/
.....itemsControlador.php
modelos/
.....itemsModelo.php
vistas/
.....listar.php
index.php

el FrontController.php es asi:
Código php:
Ver original
  1. < ?php
  2. class FrontController
  3. {
  4.     static function main()
  5.     {
  6.         //Incluimos algunas clases:
  7.  
  8.         require 'libs/Config.php'; //de configuracion
  9.         require 'libs/SPDO.php'; //PDO con singleton
  10.         require 'libs/View.php'; //Mini motor de plantillas
  11.  
  12.         require 'config.php'; //Archivo con configuraciones.
  13.  
  14.         //Con el objetivo de no repetir nombre de clases, nuestros controladores
  15.         //terminaran todos en Controller. Por ej, la clase controladora Items, será ItemsController
  16.  
  17.         //Formamos el nombre del Controlador o en su defecto, tomamos que es el IndexController
  18.         if(! empty($_GET['controlador']))
  19.               $controllerName = $_GET['controlador'] . 'Controller';
  20.         else
  21.               $controllerName = "IndexController";
  22.  
  23.         //Lo mismo sucede con las acciones, si no hay accion, tomamos index como accion
  24.         if(! empty($_GET['accion']))
  25.               $actionName = $_GET['accion'];
  26.         else
  27.               $actionName = "index";
  28.  
  29.         $controllerPath = $config->get('controllersFolder') . $controllerName . '.php';
  30.  
  31.         //Incluimos el fichero que contiene nuestra clase controladora solicitada
  32.         if(is_file($controllerPath))
  33.               require $controllerPath;
  34.         else
  35.               die('El controlador no existe - 404 not found');
  36.  
  37.         //Si no existe la clase que buscamos y su acción, tiramos un error 404
  38.         if (is_callable(array($controllerName, $actionName)) == false)
  39.         {
  40.             trigger_error ($controllerName . '->' . $actionName . '` no existe', E_USER_NOTICE);
  41.             return false;
  42.         }
  43.         //Si todo esta bien, creamos una instancia del controlador y llamamos a la accion
  44.         $controller = new $controllerName();
  45.         $controller->$actionName();
  46.     }
  47. }
  48. ?>

y el index.php es:
Código php:
Ver original
  1. < ?php
  2. //Incluimos el FrontController
  3. require 'libs/FrontController.php';
  4. //Lo iniciamos con su método estático main.
  5. FrontController::main();
  6. ?

La cuestión es que me han pedido que separe el frontend y el backend para que no este todo en un mismo lugar, estuve viendo algunos FW (cake, codeigniter, etc) si tenían alguna separación de estructura así pero no vi.
Entonces mi duda es si yo separo la estructura asi:
core/
FrontController.php
website/controladores/
.....itemsControlador.php
website/modelos/
.....itemsModelo.php
website/vistas/
.....listar.php
index.php

admin/controladores/
.....itemsControlador.php
admin/modelos/
.....itemsModelo.php
admin/vistas/
.....listar.php
admin/index.php

1- el index.php del backend, tiene que ser igual al index del root.
2- para saber a que controller redireccionar si al backend o al frontend en el frontcontroller debería preguntar por ejemplo si la session del backend no esta vacia setear las rutas al backend sino al frontend.

Desde ya muchas gracias
  #2 (permalink)  
Antiguo 07/12/2009, 10:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: FrontController

La idea del FrontController es que este sepa como enrutar los requests, para eso tienes que tener un router que traduzca del URI -> petición.

Lo que tu tienes que hacer para separar todo como quieres, es modificar solamente el FrontController para que sea más dinamico a la hora de procesar las peticiones y así puedas enrutar al frontend o al backend dependiendo del URL.

Saludos.
  #3 (permalink)  
Antiguo 07/12/2009, 12:20
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: FrontController

Hola GatorV,
empezando a toquetar e hice esto:
Código php:
Ver original
  1. class FrontController
  2. {
  3.     static function main()
  4.     {
  5.         /**
  6.          *  funcion para cargar todas las clases del core
  7.          */
  8.                
  9.         function recursiveInclude($path) {            
  10.             $dir    = scandir($path);              
  11.             if ( (is_array($dir)) && (count($dir) > 0) )              
  12.                 foreach($dir as $k => $v)                                    
  13.                     if ( !(is_dir($path.$v)) && ( file_exists($path.$v) ) && ($v != ".")  && ($v != "..") && (strtolower(end(explode(".", $v))) == 'php') )                                
  14.                         include_once($path.$v);
  15.                     elseif ( is_dir($path.$v) && ($v != ".") && ($v != "..") && ($v != 'smarty') )
  16.                         recursiveInclude($path.$v."/");
  17.            
  18.         }
  19.        
  20.         $ubicacion=explode('/',$_SERVER['PHP_SELF']);
  21.         //Incluimos todas las  clases:
  22.         if($ubicacion[2]=="admin"){
  23.             include_once '../core/clases/class.config.php';            
  24.             recursiveInclude('../core/clases/');
  25.         }
  26.         else{
  27.             include_once 'class.config.php';       
  28.             recursiveInclude('core/clases/');
  29.         }
  30.        
  31.      
  32.        
  33.         if($ubicacion[2]=='admin'){
  34.             require '../configuracion.php'; //Archivo con configuraciones.
  35.         }
  36.         else{
  37.             require 'configuracion.php';//Archivo con configuraciones.
  38.         }
  39.        
  40.         //Con el objetivo de no repetir nombre de clases, nuestros controladores
  41.         //terminaran todos en Controller. Por ej, la clase controladora Items, será ItemsController
  42.  
  43.         //Formamos el nombre del Controlador o en su defecto, tomamos que es el IndexController
  44.         if(! empty($_REQUEST['controlador'])){
  45.               $controllerName = $_REQUEST['controlador'].'Controller';
  46.               $controllerFolder = $_REQUEST['controlador'];
  47.         }
  48.         else{
  49.               $controllerName = "indexController";
  50.               $controllerFolder = 'index';
  51.         }
  52.  
  53.         //Lo mismo sucede con las acciones, si no hay accion, tomamos index como accion
  54.         if(! empty($_REQUEST['accion']))
  55.               $actionName = $_REQUEST['accion'];
  56.         else
  57.               $actionName = "index";
  58.  
  59.         //verifico si esta en el admin o no
  60.         if(!isset($_SESSION['admin'])&&$ubicacion[2]!='admin'){
  61.             $controllerPath = $config->get('controllersFolder') . $controllerFolder . '/'.$controllerName.'.php';
  62.             $config->set('viewsFolder',$config->get('controllersFolder') . $controllerFolder . '/templates/');
  63.             $templates=$config->get('adminControllerFolder') . $controllerFolder . '/templates/';
  64.             $config->set('viewsFolders',$templates);
  65.             //$error404 = $config->get('controllersFolder').'error404/error404Controller.php';
  66.            
  67.         }
  68.         else{
  69.             $controllerPath = $config->get('adminControllerFolder') . $controllerFolder . '/'.$controllerName.'.php';
  70.             $templates=$config->get('adminControllerFolder') . $controllerFolder . '/templates/';
  71.             $config->set('viewsFolders',$templates);
  72.             $config->set('templates',$config->get('adminViewsFolder'));
  73.             $error404 = $config->get('adminControllerFolder').'error404/error404Controller.php';
  74.         }
  75.  
  76.         //Incluimos el fichero que contiene nuestra clase controladora solicitada
  77.         if(is_file($controllerPath))
  78.               require $controllerPath;
  79.         else
  80.               die('El controlador no existe - 404 not found<br/>'.$controllerPath);
  81.               //require $error404;
  82.               //echo $error404;
  83.  
  84.         //Si no existe la clase que buscamos y su acción, tiramos un error 404
  85.        
  86.        
  87.         if (is_callable(array($controllerName, $actionName)) == false)
  88.         {
  89.             trigger_error ($controllerName . '->' . $actionName . ' no existe', E_USER_NOTICE);
  90.             return false;
  91.         }
  92.         //Si todo esta bien, creamos una instancia del controlador y llamamos a la accion
  93.         $controller = new $controllerName();
  94.         $controller->$actionName();
  95.     }
  96.    
  97.    
  98. }

pero cuando quiero entrar a elstitio/admin/
me salta el error:
El controlador no existe - 404 not found

y si imprimo la ruta del controlador sale:
admin/controladores/index/indexController.php

y el indexController tiene esto:
Código php:
Ver original
  1. class indexController extends Controller {
  2.     public function index(){
  3.         $hola="Hola mundo";
  4.         echo $hola;
  5.     }
  6. }

estoy armando mal el frontcontroller?, como sería eso del router?
  #4 (permalink)  
Antiguo 07/12/2009, 12:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: FrontController

Pues un error al inicio que veo es que declaras una función dentro de tu función main() lo cual es incorrecto.

Con router me refiero a que separes del frontController la parte del enrutamiento, es decir que tengas una clase que su trabajo sea el traducir el URI y te entregue el model / controller / action.

Saludos.
  #5 (permalink)  
Antiguo 08/12/2009, 17:15
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: FrontController

Hola GatorV,
disculpa pero estoy un poco "bastante" bastante perdido con esto del frontcontrolle y router, buscando por el foro encontre un ejemplo tuyo, asi que mi frontcontroller lo deje asi:
Código php:
Ver original
  1. class Router {
  2.      public function __construct() {}
  3.  
  4.      public function route() {
  5.            $controller = $_GET['controlador'];
  6.            $action = $_GET['accion'];
  7.            echo $_SERVER['PHP_SELF']."<br/>";
  8.            $ubicacion=explode('/',$_SERVER['PHP_SELF']);
  9.            switch($ubicacion[2]){
  10.               case 'admin':
  11.                 $path='admin/';
  12.               break;
  13.               case 'area_cliente';
  14.                  $path='area_clientes/';
  15.               break;
  16.               default:
  17.                 $path='';
  18.               break;
  19.            }
  20.            
  21.            if( empty($controller) ) $controller = 'index';
  22.            if( empty($action) ) $action = 'index';
  23.            else $action = $action ;
  24.            echo "el controlador es: $controller<br/>";
  25.            $controllerLocation = $path . 'controllers/' . $controller . 'Controller.php';
  26.  
  27.            if( file_exists( $controllerLocation ) ) {
  28.                  include_once( $controllerLocation );
  29.            } else {
  30.                  throw new Exception("No se encuentra el controlador $controllerLocation");
  31.            }
  32.  
  33.            if( class_exists( $controller, false ) ) {
  34.                   $cont = new $controller();
  35.            } else {
  36.                   throw new Exception( "Controller Class not found $controller" );
  37.            }
  38.  
  39.            if( method_exits( $cont, $action ) ) {
  40.                   $cont->$action();
  41.            } else {
  42.                    throw new Exception( "Action not callable $action" );
  43.            }
  44.  
  45.            
  46.  
  47.      }
  48. }

pero sigo sin hacerlo andar cuando entro al sitio (localhos/singd/) me sale esto:
Cita:
Fatal error: Class 'ControllerBase' not found in D:\xampp\htdocs\singd\controllers\indexController. php on line 2
después si quiero entrar al admin (localhost/singd/admin) me sale este error:
Cita:
Fatal error: Uncaught exception 'Exception' with message 'No se encuentra el controlador admin/controllers/indexController.php' in D:\xampp\htdocs\singd\libs\FrontController.php:31 Stack trace: #0 D:\xampp\htdocs\singd\admin\index.php(4): Router->route() #1 {main} thrown in D:\xampp\htdocs\singd\libs\FrontController.php on line 31
pero si quiero entrar a area_clientes (localhost/singd/area_clientes) me sale este error:
Cita:
Fatal error: Class 'ControllerBase' not found in D:\xampp\htdocs\singd\area_clientes\controllers\in dexController.php on line 2
la verdad que estoy mas perdido que "turco en la neblina" jeje, si me podrías indicar como se puede solucionar estare muy agradecido.
  #6 (permalink)  
Antiguo 08/12/2009, 17:34
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: FrontController

Esos errores estan claros, no encuentra el archivo... para el primer error supongo que estara mal el includePath (si usas autoload), sino fijate de incluir la clase ControllerBase antes de usarla, para el error que no encuentra el controllador, empieza a debugear por ahi, fijandote cual es el archivo que esta buscando, porque no existe, donde tendria que buscar, etc...
  #7 (permalink)  
Antiguo 08/12/2009, 18:47
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: FrontController

Cita:
Iniciado por rodrigo_00 Ver Mensaje
Esos errores estan claros, no encuentra el archivo... para el primer error supongo que estara mal el includePath (si usas autoload), sino fijate de incluir la clase ControllerBase antes de usarla, para el error que no encuentra el controllador, empieza a debugear por ahi, fijandote cual es el archivo que esta buscando, porque no existe, donde tendria que buscar, etc...
si tenias razón no la estaba incluyendo a la clase ControllerBase jeje, pero sigo sin poder hacerlo andar ahora me tira este error ahora:
Cita:
Fatal error: Call to undefined function method_exits() in D:\xampp\htdocs\singd\libs\FrontController.php on line 49
las linea 43 a 53 tiene:
Código php:
Ver original
  1. if( class_exists( $controller, false ) ) {
  2.                   $cont = new $controller();
  3.            } else {
  4.                   throw new Exception( "No se encuentra la clase en el controlador $controller en $controllerLocation<br/>" );
  5.            }
  6.            
  7.            if( method_exits( $cont, $action ) ) {
  8.                   $cont->$action();
  9.            } else {
  10.                    throw new Exception( "Action not callable $action en la clase $controller en $controllerLocation<br/>" );
  11.            }

intente cambiando el method_exists() por if (is_callable(array($controllerName, $actionName)) == false)) pero me devolvia el error:
Cita:
Fatal error: Uncaught exception 'Exception' with message 'Action not callable index en la clase indexController en controllers/indexController.php<br/>' in D:\xampp\htdocs\singd\libs\FrontController.php:52 Stack trace: #0 D:\xampp\htdocs\singd\index.php(5): Router->route() #1 {main}
pero el metodo existe en mi controllers/indexController.php
Código php:
Ver original
  1. class indexController extends ControllerBase
  2. {
  3.     //Accion index
  4.     public function index()
  5.     {
  6.         echo "Controlador Index";
  7.     }
  8.    
  9.     public function testView()
  10.     {
  11.         $vars['nombre'] = "Mariela";
  12.         $vars['lugar'] = $this->getLugar();
  13.         $this->view->show("test.php", $vars);
  14.     }
  15.    
  16.     private function getLugar()
  17.     {
  18.         return "Gálvez, Argentina";
  19.     }
  20. }

sigo sin poder entrar a los otros directorios, pero vamos por parte que por lo menos funcione esto jeje.
  #8 (permalink)  
Antiguo 08/12/2009, 20:34
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: FrontController

Es un error de sintaxis, es method_exists :)

Saludos
  #9 (permalink)  
Antiguo 09/12/2009, 14:35
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: FrontController

Cita:
Iniciado por rodrigo_00 Ver Mensaje
Es un error de sintaxis, es method_exists :)

Saludos
jejeje el aptana no me marcaba el error jeje eso pasa porque uno reniega mucho con las cosas y llega un punto que se le pasan las cosas mas pequeñas jajaja.

Con el problema que si es el de entrar a los controladores de las otras carpetas, me sigue tirando el error:
Cita:
Fatal error: Uncaught exception 'Exception' with message 'No se encuentra el controlador admin/controllers/indexController.php ' in D:\xampp\htdocs\singd\libs\FrontController.php:41 Stack trace: #0 D:\xampp\htdocs\singd\admin\index.php(5): Router->route() #1 {main} thrown in D:\xampp\htdocs\singd\libs\FrontController.php on line 41
si hago un echo de $_SERVER['PHP_SELF'] me devuelve:
/singd/admin/index.php

si hago un echo de esto:
Código php:
Ver original
  1. $ubicacion=explode('/',$_SERVER['PHP_SELF']);
  2.            //var_dump($ubicacion)."<br/>";
  3.            switch($ubicacion[2]){
  4.               case 'admin':
  5.                 $path='admin/';
  6.               break;
  7.               case 'area_clientes';
  8.                  $path='area_clientes/';
  9.               break;
  10.               default:
  11.                 $path='';
  12.               break;
  13.            }
  14.            
  15.            if( empty($controller) ){
  16.              $controller = 'indexController';
  17.            }
  18.            else{
  19.              $controller = $controller."Controller";
  20.            }
  21.            if( empty($action) ) $action = 'index';
  22.            else $action = $action ;
  23.            echo "el controlador es: $controller<br/>";
  24.            $controllerLocation = $path . 'controllers/' . $controller . '.php';

me devuelve

Cita:
el controlador es: indexController
en cuanto a este error:
Cita:
Stack trace: #0 D:\xampp\htdocs\singd\admin\index.php(5): Router->route()
nose si tiene que ver con que no encuentra el controlador o que, pero el archivo singd/admin/index.php tiene esto:
Cita:
require '../libs/FrontController.php';
$router = new Router();
$router->route();
como puedo solucionarlo para poder dormir en paz jejej

gracias
  #10 (permalink)  
Antiguo 09/12/2009, 14:51
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: FrontController

la variable $path que tienes debe tener la ruta fisica completa

saludos
  #11 (permalink)  
Antiguo 09/12/2009, 15:40
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
Cita:
Iniciado por rodrigo_00 Ver Mensaje
la variable $path que tienes debe tener la ruta fisica completa

saludos
te refieres a esto:
Código php:
Ver original
  1. switch($ubicacion[2]){
  2.               case 'admin':
  3.                 $path="http://".$_SERVER['SERVER_NAME']. $_SERVER['REQUEST_URI'];
  4.               break;
  5.               case 'area_clientes';
  6.                  $path="http://".$_SERVER['SERVER_NAME']. $_SERVER['REQUEST_URI'];
  7.               break;
  8.               default:
  9.                 $path='';
  10.               break;
  11.            }

lo que me devuelve es:

por dios que perdido que estoy jajajja

solucionado lo de la ruta jejeje

Última edición por GatorV; 09/12/2009 a las 17:11
  #12 (permalink)  
Antiguo 09/12/2009, 16:42
 
Fecha de Ingreso: noviembre-2007
Ubicación: Lanus, Buenos Aires
Mensajes: 178
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: FrontController

me alegro
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 01:34.