Tema: MVC en php
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/04/2009, 15:19
Avatar de deivax
deivax
 
Fecha de Ingreso: marzo-2006
Mensajes: 31
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: MVC en php

Antes que nada, lo que preguntás sobre el concepto de implementación está bien: El Modelo maneja la base de datos y la lógica de negocio, la Vista maneja la salida de datos (templates, json, xml, etc), y el Controlador llama a sus acciones que interactúan con el modelo y la vista.

Pero quién elige el controlador? quién ejecuta la acción? dónde se decide qué plantilla se va a utilizar? en qué momento es consultada la base de datos?

Aparte de las clases Model, View y Controller, se necesita un bootstrap, una puerta de entrada al sistema por donde se pueda llegar hasta el controlador apropiado.

Por ejemplo el archivo index.php podría contener lo siguiente:
Código PHP:
<?php
//nombres del controlador y la acción
$controller = !empty($_REQUEST['controller']) ? $_REQUEST['controller'] : 'default';
$action = !empty($_REQUEST['action']) ? $_REQUEST['action'] : 'index';

//instancia de la clase controlador
$controller_class $controller.'Controller';
require_once 
$controller_class '.php';
$oController = new $controller_class();
$action $action 'Action';

//ejecutar la acción del controlador correspondiente
$oController->$action();
Hasta acá tenemos dos puntos importantes:
- Modelos, vistas y controladores son CLASES.
- Acciones son métodos públicos específicos de los controladores

DefaultController.php
Código PHP:
class DefaultController
{

  public function 
__construct()
  {
    
//incluir archivo de la clase vista
    
require_once 'View.php';
    
// la instancia de la clase View será una propiedad de la clase controlador para que las acciones puedan manejar la instancia a conveniencia.
    
$this->_oView = new View();
  }

  
/**
   * Método que se ejecutará cuando sea llamado desde el bootstrap
   */
  
public function indexAction()
  {
    
//acá es donde son instanciadas las clases modelo
    
$oModel = new Model();
    
$data $oModel->getData();

    
//copiar datos del modelo en la vista
    
$this->oView->data $data;
    
    
//mostrar el contenido de la plantilla index.tpl en pantalla
    
$this->oView->render('default/index.tpl');
  }

Luego en la vista vas a tener que escribir el código html imprimiendo variables que hayas pasado a la vista en el controlador, y ejecutando bucles o algún if.
Se supone que para el template no se necesita más que eso, porque la lógica estaría ubicada en el modelo y la interacción en el controlador.

Creo que esto te va a ayudar bastante. También podés mirar cómo están armados por ejemplo el Zend Framework o Symfony.
Más allá de lo conceptual, luego te toca ser creativo para satisfacer tus necesidades a la hora de desarrollar una aplicación.