Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/03/2008, 05:11
Merodeador
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Comprobar sesion en el frontController y en la vista?

Hola GatorV,

Te comento como lo estoy haciendo a ver que te parece:
Para controlar las sesiones he pensado lo siguiente: De la clase Controller heredan todos los controladores, por lo que en el constructor de la misma comprobaré sesión y el constructor de la clase hija llamará al del padre:

Código PHP:
<?php
  
class ControllerException extends Exception {}
  class 
Controller {
    function 
__construct(){
      
session_start();
      IF (!isset(
$_SESSION['s_username'])){
        
session_destroy();
        
header("Location: views/login/login.html");
      }
    }
    
    public function 
__call($funcion,$parametro) {
      throw new 
ControllerException('Error fatal, se llamo a una funcion que no esta definida');
    }
  }
?>
Con esto consigo que desde el FrontController cuando se instancia el objeto se haga la validación. ¿Te parece una buena solución?

Por otro lado tengo un problema, adjunto ficheros para que lo veáis más claro.

index.php
Código PHP:
<?php

class FrontControllerException extends Exception {}

class 
FrontController {
  public static function 
Main() {
    
    
//Incluimos el fichero de configuración
    
include 'config/config.php';

    
//Realizamos la conexión a la Base de datos    
    
include $models_dir.'database.php';
    
$db = new database();
    
$db->conectar();
    
    
$dir = isset($_GET['dir'])? $_GET['dir']."/":"";
    
$controller $_GET['controller'];
    
$accion $_GET['accion'];

    if( empty( 
$controller ) ) { // Comprobamos si esta vacia, si asi es definimos que por defecto cargue Index
      
$controller "index";
    }
    if( empty( 
$accion ) ) { // Comprobamos tambien..
      
$accion "index";
    }

    
$controllerFile $controllers_dir $dir $controller "_controller.php";

    if( !
file_exists$controllerFile ) ) { // Si no existe el archivo lanzamos una excepcion
      
throw new FrontControllerException"No se encontro el archivo especificado" );
    }
    else{
      include 
$controllerFile;
    }
  
    
$controllerClass $controller "_controller";

    if(!
class_exists$controllerClasstrue ) ) { // Si existe el archivo pero no esta la clase lanzamos otra excepcion

      
throw new FrontControllerException"El controlador fue cargado pero no se encontro la clase $controllerClass" );
    }
  
      
$controllerInst = new $controllerClass();
   
    if( !
is_callable( array( $controllerInst$accion ) ) ) { // Comprobamos si la accion es posible llamarla
      
throw new FrontControllerException"El controlador no tiene definida la accion $accion" );
    } else {
      
$controllerInst->$accion(); // Llamamos a la accion y dejamos el proceso al controlador

    
}
  }
}
 
// Iniciamos todo
 
FrontController::Main();
 
?>

Controlador de login:
Código PHP:
<?php
  
class login_controller extends controller{
  
    function 
__construct(){
  
//    parent::__construct(); //No es necesario controlar la session
    
}
    
    function 
valida_user(){
      
$username trim($_POST["username"]);
      
$password trim($_POST["password"]);
      
      if (
$username != null AND $password != null) { //Comprobamos que se han rellenado los campos del formulario
        
        
include('models/usuario/usuario_model.php');
        
$user usuario_model::get_usuario($username);
        
        if (!
$user){
        
//Usuario incorrecto
        // header('Location:../html/login.html');
          
echo "Usuario incorrecto";
         }
        else{
          if(
$user->get_pass() != md5($password)){
          
//Usuario correcto, passwd incorrecta
          //  header('Location:../html/login.html');
            
echo "Password incorrecto";
          }
          else{
            
//Usuario y passwd correctos
            
$_SESSION["s_username"] = $username;
            echo 
"Has sido logueado correctamente ".$_SESSION["s_username"]." y puedes acceder al index.php.";
              }      
        }
      }
  
//  include('../html/login.html');
    //header('Location:../html/login.html');
    
}
  }
?>
Usuario_model.php

Código PHP:
  class usuario_model{

    function 
__construct(){
  
    }
    
    function 
get_usuario($p_user){
      
$tipos = array();
      
$parametros = array();
      
$tipos [] = CADENA;
      
$parametros [] = $p_user;
      
$db->consultar(m_usuario_user,$parametros,$tipos );
      
$resul_array $db->consulta2array();
      if(
$resul_array){ 
        
$user = new usuario($resul_array[0]['idUsuario'], $resul_array[0]['user'], $resul_array[0]['pass'], $resul_array[0]['DNI'], $resul_array[0]['nombre'], $resul_array[0]['apellidos'], $resul_array[0]['idOcupacion'], $resul_array[0]['Profesor']);
        return 
$user;
      }
      return 
null;
    }

Al hacer esta llamada desde el navegador "index.php?dir=login&controller=login&accion=valid ar_user"

Hago un include de las variables con los datos de los directorios que declaro en el fichero config.php desde el FrontController e instancio un objeto $db para las conexiones a BD y al hacer el include del controlador y llamar a la función y esta a la del modelo, las variables me dice que no están declaradas(por lo que meto la ruta completa a mano) y el objeto $db desde el Usuario_model.php me dice que no existe, vamos que no hay persistencia de datos al hacer el include o entiendo que por instanciar el objeto no tengo acceso a otras variables "globales", entiendo que el problema es que mi sistema de programación no es el adecuado, ¿cómo lo puedo solucionar?

Se me ocurre por ejemplo crearme una clase "model" y que todos los modelos hereden de esta y esta misma se encarge de instanciar el objeto de BD, pero ¿no será rizar el rizo ya demasiado?

Espero vuestra ayuda, que ando un poco atascado...

Muchas gracias :)