Ver Mensaje Individual
  #7 (permalink)  
Antiguo 09/11/2010, 08:12
Avatar de Samie
Samie
 
Fecha de Ingreso: mayo-2009
Mensajes: 27
Antigüedad: 15 años
Puntos: 2
Respuesta: Forma óptima de trabajar con objetos y Model View Controller

Vale creo que ya lo he entendido. Aplicando el concepto a mi ejemplo ( y omitiendo alguna cosa como lo del patrón singleton) yo hice algo como esto:

index.php
Código PHP:
<?php
require 'FrontController.php';
FrontController::main();

?>
frontController.php
Código PHP:
<?php
class FrontController
{
    static function 
main()
    {
        

        if(! empty(
$_GET['controlador']))
              
$controllerName $_GET['controlador'] . 'Controller';
        else
              
$controllerName "UsuarioController";
        
        
//Lo mismo sucede con las acciones, si no hay accion, tomamos index como accion
        
if(! empty($_GET['accion']))
              
$actionName $_GET['accion'];
        else
              
$actionName "index";
        
        
$controllerPath =  $controllerName '.php'//mejorable, archivo de configuracion
            
        //Incluimos el fichero que contiene nuestra clase controladora solicitada    
        
if(is_file($controllerPath))
              require 
$controllerPath;
        else
              die(
'El controlador no existe - 404 not found');
        
        
//Si no existe la clase que buscamos y su accion, tiramos un error 404
        
if (is_callable(array($controllerName$actionName)) == false
        {
            
trigger_error ($controllerName '->' $actionName '` no existe'E_USER_NOTICE);
            return 
false;
        }
        
//Si todo esta bien, creamos una instancia del controlador y llamamos a la accion
        
$controller = new $controllerName();
        
$controller->$actionName();
    }
}


?>
UsuarioController.php
Código PHP:
<?php
class UsuarioController
{
    
    public function 
mostrarDatos()
    {
        include 
'UsuarioModel.php';
        
$model=new UsuarioModel();
        
$datos=$model->getDatos();
        
        include 
'usuarioView.php';
    }
   
}
?>
UsuarioModel.php:

Código PHP:
<?php
class UsuarioModel{

    public function 
__construct(){
    }

    public function 
getDatos(){
            
        
//Consultas a la BD
        // ............
        // ............
        
        
$arrayDatos[]='Pepe';
        
$arrayDatos[]='29';
        
$arrayDatos[]='España';
        return 
$arrayDatos;
    
    }

}

?>
UsuarioView.php:

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>MVC - Modelo, Vista, Controlador </title>
<style type="text/css">
.Estilo1 {color: #E8D2FF}
</style>
    
</head>
<body style="background-color:#0145A8;color:#D5E0F0;">
<h1>Datos principales:</h1>
<?php
    $nombre
=$datos[0];
    
$edad=$datos[1];
    
$loc=$datos[2];
    echo 
"Nombre: $nombre";
    echo 
"<br />";
    echo 
"Edad: $edad";
    echo 
"<br />";
    echo 
"Localizacion: $loc";
?>
</body>
</html>
He simplificado algunas cosas con respecto al tutorial, me he saltado lo que ponía de view->show('vistaUsuario.php') y en lugar de hacer eso hago directamente include 'vistaUsuario.php'; porque me parecía más intuitivo esto último, hay algún inconveniente que deba tener en cuenta al hacer esto??

Por lo que entiendo de patrones y prácticas aconsejables en la orientación a objetos se supone que cada objeto debe realizar sus funciones, en este caso usuario se encargaría de sus accesos a la base de datos.

Más o menos esta es la idea no?
Algo importante que se me haya quedado fuera?

Muchas gracias!