Controladores em seu próprio framework MVC em PHP
Como você já sabe, todos os controladores do nosso
framework possuem o método render, que
precisa ser chamado para enviar dados para a view.
Este método é herdado pelos nossos controladores
personalizados da classe pai Controller,
localizada no núcleo. Vamos criar esta classe:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Como você vê, o método render recebe como parâmetro
o nome da view e os dados para
exibição. Deixe este método retornar
um objeto de uma classe especial Page, na
qual estará contida a informação sobre a view
da ação do controlador. Nesta classe
estarão contidos o nome da view, os dados,
bem como o título da página e o nome do arquivo de layout
do site:
<?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;
}
}
?>
Então o código do nosso método render
ficará assim:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Vou explicar o que está acontecendo aqui. O nome da view
e os dados chegam como parâmetros do método. No entanto,
no controlador personalizado também é definido
o título da página - através da atribuição da propriedade
title. Portanto, em $this->title
estarão contidos o título que passaremos
ao construtor da classe Page.
Há também nuances com o layout. Como você sabe,
nosso framework usa o layout do arquivo
default.php. Na verdade, cada
ação pode ter um layout diferente. Para
isso, é necessário na própria ação, na propriedade layout,
atribuir um outro nome de layout.
Como isso é alcançado: nosso controlador pai
tem a propriedade layout, por padrão
com o valor 'default.php'. Este
será o layout padrão. No entanto, se
a ação do controlador personalizado sobrescrever
o valor da propriedade layout, então o layout
será outro.
Copie o código da minha classe Controller e coloque-o no arquivo
/core/Controller.php.
Copie o código da minha classe Page e
coloque-o no arquivo /core/Page.php.