Antes que nada, es importante tener claro qué es MVC.
El modelo–vista–controlador (MVC) es un patrón de arquitectura de software que separa los datos y la lógica de negocio de una aplicación de la interfaz de usuario, así como del módulo encargado de gestionar los eventos y las comunicaciones. Para ello, MVC propone la construcción de tres componentes distintos: el modelo, la vista y el controlador. Por un lado, define componentes para la representación de la información y, por otro, para la interacción del usuario. Este patrón se basa en la reutilización de código y la separación de responsabilidades, lo que facilita el desarrollo y el mantenimiento de las aplicaciones.
Fuente: Wikipedia - Modelo–vista–controlador
La clase View no es más que un contenedor de vistas o código HTML, organizadas en secciones que corresponden a las definidas en el layout. Estas se almacenan temporalmente hasta que es necesario renderizarlas en el cliente.
view.php
abstract class View {
# Ruta donde se encuentran las vistas.
private static $_path_view;
# Contenedor de vistas agrupadas según la sección del layout.
private static $_container;
# Nombre del layout (por defecto: default).
private static $_layout;
# Extensión de los archivos de vista (ejemplo: .phtml o .php).
private static $_ext = '.php';
/**
* Inicializa la clase y define la ruta de las vistas.
*/
public static function initialize($path_view, $layout = 'default') {
self::$_container = array();
self::$_path_view = $path_view;
self::$_layout = $layout;
}
/**
* Captura una vista y la devuelve como string.
*/
private static function _capture($file, $data) {
ob_start();
require (self::$_path_view . $file . self::$_ext);
$view = ob_get_contents();
ob_end_clean();
return $view;
}
/**
* Elimina la extensión del archivo si está presente.
*/
private static function _removeExtention($file) {
if (substr($file, -strlen(self::$_ext)) == self::$_ext) {
$file = substr($file, 0, strlen($file) - strlen(self::$_ext));
}
return $file;
}
/**
* Guarda una vista en el contenedor.
*/
public static function keep($file, $data = array(), $alias = NULL) {
$file = self::_removeExtention($file);
$view = self::_capture($file, $data);
empty($alias) ? $key = $file : $key = $alias;
self::$_container[$key][] = $view . PHP_EOL;
}
/**
* Devuelve el contenido de una vista como string.
*/
public static function extract($file, $data) {
$file = self::_removeExtention($file);
return self::_capture($file, $data);
}
/**
* Inserta una vista desde un string en el contenedor.
*/
public static function insert($string, $alias, $important = FALSE) {
if (empty(self::$_container[$alias])) {
self::$_container[$alias] = array();
}
if ($important === FALSE) {
self::$_container[$alias][] = $string;
} else {
array_unshift(self::$_container[$alias], $string);
}
}
/**
* Muestra una vista almacenada previamente.
*/
public static function show($view) {
if (key_exists($view, self::$_container)) {
return implode('', self::$_container[$view]);
}
}
/**
* Cambia el layout por defecto.
*/
public static function setLayout($layout) {
$layout = self::_removeExtention($layout);
self::$_layout = $layout;
}
/**
* Renderiza la página usando el layout definido.
*/
public static function callLayout() {
require (self::$_path_view . 'layouts' . DIRECTORY_SEPARATOR . self::$_layout . '.php');
}
}