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

Duda Model View Controller (MVC)

Estas en el tema de Duda Model View Controller (MVC) en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hola tengo una duda sobre el MVC, supongamos una pagina de alquiler de vehiculos: -en la BD tres tablas camion,auto,moto -en codigo php 4 clases ...
  #1 (permalink)  
Antiguo 18/10/2006, 02:53
 
Fecha de Ingreso: septiembre-2005
Ubicación: Ourense
Mensajes: 25
Antigüedad: 18 años, 7 meses
Puntos: 1
Pregunta Duda Model View Controller (MVC)

hola tengo una duda sobre el MVC, supongamos una pagina de alquiler de vehiculos:

-en la BD tres tablas camion,auto,moto
-en codigo php 4 clases clase_camion, clase_auto, clase_moto, clase_bd
-en php el controler.php

bien ahora en una pagina un formulario para el alta de un camion (en la BD) ¿como seria segun el MVC la forma correcta de esa alta?:

FORMA 1:
- la clase_camion solo un constructor
- el submit del formulario se envia al controler.php indicando la operacion a realizar:
Código:
action="controler.php?operacion=alta_camion
el controller tendra tantos metodos como operaciones (alta_camion,modificar_camion,baja_camion e igual para auto y moto)
- el controler crea un objeto camion con los datos del formulario y un objeto clase_bd
- el controler pasa este objeto a un metodo del ojbeto clase_bd (habria una funcion de alta/modiicacion/baja para cada tipo de objeto en la clase_bd)
-la clase_bd ejecuta el metodo guardando los datos en la tabla.


FORMA 2:
-la clase camion constructor y metodos alta / baja / modificacion
-submit del formulario se validan los datos y si es correcto se crea un objeto camion que se envia al controller a un metodo generico nueva_alta
-el metodo nueva_alta del controller llama el metodo ->alta del objeto recibido.
-el metodo alta del objeto camion crea un objeto clase_bd que cuenta con un metodo ->consulta($sql) que ejecuta la SQL de alta para ese objeto camion.


espero que me hayais entendido y vuestra respuesta

Última edición por karide; 18/10/2006 a las 04:15
  #2 (permalink)  
Antiguo 18/10/2006, 08:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
La forma correcta es la forma 2, asi "separas" toda la capa del modelo con respecto a la vista, el controlador recibe los datos del formulario, los valida si son correctos los manda al modelo y espera una respuesta.

La forma de separacion es tal que el controlador y la vista no tienen porque saber ni les interesa jeje si hay una base de datos, un archivo xml, datos en memoria etc.

Espero ser claro en mi respuesta, saludos! y felicidades por implementar el patron MVC.
  #3 (permalink)  
Antiguo 18/10/2006, 09:31
 
Fecha de Ingreso: octubre-2006
Mensajes: 34
Antigüedad: 17 años, 6 meses
Puntos: 0
Si la forma 2 es la adecuada tienes que tener varias clases genericas: Modelo, Controlador, Vista (Dejaremos la vista) y una clase
por cada tabla principal. Por orden de actuacion:
- Al controlador se le pasa una operacion.
- El controlador llama a la clase/s que sea y a la/s funcion/es que corresponda para esa operacion.
- El modelo es el encargado de definir los campos y metodos genericos que se realizan para una tabla.
- Por ultimo en las clases de cada tabla se define el nombre de la tabla, nombre del id, relaciones con otras tablas, etc.

Ejemplo basico(Es muy simple pero para que se entienda mas que nada...)

Código PHP:
//CLASE MODELO (Modelo.inc.php)
require_once ("Adodb.inc.php"); //O tu propia clase_db

class Modelo{
var 
$nombreTabla;
var 
$nombreId;

function 
Modelo($nombreTabla$nombreId)
{
    
$this->nombreTabla=$nombreTabla;
    
$this->nombreId=$nombreId;    
    
$this->db=new Adodb();
}

/*
Parametros de los campos en forma de array($clave->$valor,$clave2 => $valor2,...)
*/
function insertar($campos)
{
        
$s "INSERT INTO " $this->nombreTabla "(";
        if (
is_array($campos)) {
            
$s .= implode(","array_keys($campos));
        }
        
$s .= ") VALUES (";
        if (
is_array($campos)) {
            
$s .= "'" implode("','"array_values($campos)) . "'";
        }
        
$s .= ")";
        return 
$this->db->Execute($s);
}

function 
borrar($id)
{
    
$s "DELETE FROM "$this->nombreTabla." WHERE "$this->campoId"='"$id."'";
    return 
$this->db->Execute($s);
}

//Mas ejemplo de funciones posibles: modificar, getRegistros, insertarRelacion, borrarRelacion, getRelacionados,......

Código PHP:
//CLASE CAMIONES (camion.php);
require_once("Modelo.inc.php");
class 
camion extends Modelo{
 
function 
camion{
    
Parent::Modelo("camiones""id_camion");
}

function 
alta()
{
    
//AQUI PONEMOS LOS DATOS QUE QUEREMOS INSERTAR DE POST, GET, etc..
    
$campos=array("campo1"    => "valor1""campo2" => "valor2");
    
$this->insertar($campos);
}
function 
baja()
{
    
$id=$_POST["id"];    
    
$this->borrar($id);
}

Código PHP:
//CLASE CONTROLADOR (controlador.inc.php)
class controlador{
    function 
controlador()
    {
    }

    function 
operaciones($operacion$clase)
    {
        if (
file_exists($clase)
        {
            require_once(
$clase);
            
$obj= new $clase;
        } 
        switch (
$operacion)
        {
            case 
alta$obj->alta();break;
            case 
baja$obj->baja();break;
            default: return;
        }
        return;
    }

Código PHP:
//controler.php
require_once("controlador.inc.php");
$controler= new controlador();
$controler->operaciones($_GET['operacion'], $_GET['tabla']);

//Action formulario
action="controler.php?operacion=alta&tabla=camion"
Bueno esta es la idea muy basicamente. Lo normal es que las acciones de un controlador se lean de algun sitio (XML, txt, BD)
Llamando a varios metodos del modelo y luego a la vista que sea.
Esto esta en PHP 4 pero vamos en PHP 5 no varia demasiado..

Espero que te haya servido!

Última edición por _Radamantis_; 18/10/2006 a las 10:12
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 06:20.