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( $controllerClass, true ) ) { // 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 :)