Pues he hecho esto, no se si esta decente, mal o se puede mejorar, etc. pero asi lo he hecho.
Clase Vista
Código PHP:
abstract class ClaseVista{
private $_peticion;
private $_css;
private $_themes;
private $_js;
private $_jsPlugin;
private $_acl;
private $_rutas;
protected $_plantilla;
protected $_marco;
public function __construct( Peticion $peticion ) {
$this->_peticion = $peticion;
$this->_themes = array();
$this->_css = array();
$this->_js = array();
$this->_jsPlugin = array();
//$this->_acl = $_acl;
$this->_rutas = array();
$this->_plantilla = $peticion->getAccion();
$this->_marco = 'default';
$this->_mostrar = true;
}
public function renderizar()
{
if ( $this->_mostrar == null)
exit();
$rutaPlantilla = DIR_VISTAS . $this->_peticion->getControlador() . DS . $this->_plantilla . '.phtml';
if( is_readable( $rutaPlantilla ) ){
$class_vars = get_class_vars( get_class( $this ) );
$class_properties = get_object_vars( $this );
$class_data = array_diff_key ( $class_properties , $class_vars );
foreach ($class_data as $key => $value)
$$key = $value;
// incluyo las plantillas phtml
if ( !$this->_marco){
include_once ( $rutaPlantilla );
exit();
}
include_once ( DIR_VISTAS . 'layout' . DS . 'cabecera_html.phtml' );
include_once ( DIR_VISTAS . 'layout' . DS . $this->_marco . DS . 'cabecera.phtml' );
include_once ( $rutaPlantilla );
include_once ( DIR_VISTAS . 'layout' . DS . $this->_marco . DS . 'pie.phtml' );
}else {
throw new MiExcepcion('Error de vista',array('rutaPlantilla' => $rutaPlantilla, 'plantilla' => $plantilla, 'marco' => $marco));
}
}
...
Clase Lanzador o Bootstrap:
Código PHP:
<?php
class Lanzador
{
public static function run( Peticion $peticion )
{
$controlador = $peticion->getControlador() . 'Controlador';
$rutaControlador = DIR_CONTROLADORES . $controlador . '.php';
$accion = $peticion->getAccion();
$argumentos = $peticion->getArgumentos();
if( is_readable( $rutaControlador ) ){
require_once $rutaControlador;
//$registro = new claseRegistro();
$controlador = new $controlador( $peticion );
if(is_callable(array($controlador, $accion))){
if( empty($argumentos) == true ){
call_user_func(array($controlador, $accion));
}
else{
call_user_func_array(array($controlador, $accion), array( $argumentos ) ) ;
}
$controlador->getVista()->renderizar();
exit();
}
}
header('Location: '.PAGINA_ERROR_404);
}
}
?>
Lo único que tengo que hacer si en algún método no necesito mostrar la vista, es llamar el metodo $this->_vista->noMostrar() que me modifica la propiedad de $_mostrar a false.
Incluso si quiero rizar el rizo puedo optar por llamar a los metodos que no vayan a mostrar vista con un nombre que empiece o termine por una cadena de caracteres especifica a comprobar y si es igual a esa cadena, simplemente pongo la propiedad de $this->_mostrar a false.