Controladores en tu propio framework MVC en PHP
Como ya sabes, todos los controladores de nuestro
framework tienen el método render, que
necesita ser llamado para enviar datos a la vista.
Este método es heredado por nuestros controladores
personalizados desde la clase padre Controller,
ubicada en el núcleo. Hagamos esta clase:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Como puedes ver, el método render recibe como parámetro
el nombre de la vista y los datos para
mostrar. Que este método retorne
un objeto de una clase especial Page, en
la cual estará contenida la información sobre la vista
de datos de la acción del controlador. En esta clase
estará contenido el nombre de la vista, los datos,
así como el título de la página y el nombre del archivo con el diseño
del sitio:
<?php
namespace Core;
class Page
{
private $layout;
private $title;
private $view;
private $data;
public function __construct($layout, $title, $view, $data)
{
$this->layout = $layout;
$this->title = $title;
$this->view = $view;
$this->data = $data;
}
public function __get($property)
{
return $this->$property;
}
}
?>
Entonces el código de nuestro método render
se verá así:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Explicaré lo que sucede aquí. El nombre de la vista
y los datos llegan como parámetros del método. Sin embargo,
en el controlador personalizado también se establece
el título de la página - mediante la escritura de la propiedad
title. Significa, que en $this->title
estará contenido el título, que pasaremos
al constructor de la clase Page.
También hay matices con el diseño. Como sabes,
nuestro framework utiliza un diseño del archivo
default.php. En realidad, cada
acción puede tener otro diseño. Para
esto es necesario en la propia acción en la propiedad layout
escribir otro nombre de diseño.
Cómo se logra esto: nuestro controlador padre
tiene la propiedad layout, por defecto
con el valor 'default.php'. Este
será el diseño por defecto. Sin embargo, si
la acción del controlador personalizado redefine
el valor de la propiedad layout, entonces el diseño
será otro.
Copia el código de mi clase Controller y colócalo en el archivo
/core/Controller.php.
Copia el código de mi clase Page y
colócalo en el archivo /core/Page.php.