Kontrolery we własnym frameworku MVC w PHP
Jak już wiesz, wszystkie kontrolery naszego
frameworka mają metodę render, którą
trzeba wywoływać, aby wysłać dane do widoku.
Ta metodę nasze, użytkownikowe kontrolery
dziedziczą po klasie nadrzędnej Controller,
znajdującej się w jądrze. Stwórzmy tę klasę:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Jak widzisz, metoda render parametrem
przyjmuje nazwę widoku i dane do
wyświetlenia. Niech ta metoda zwraca
obiekt specjalnej klasy Page, w
którym będzie zawarta informacja o widoku
danych akcji kontrolera. W tej klasie
będzie zawarta nazwa widoku, dane,
a także tytuł strony i nazwa pliku z layoutem
strony:
<?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;
}
}
?>
Wtedy kod naszej metody render będzie
wyglądał tak:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Wyjaśniam, co się tutaj dzieje. Nazwa widoku
i dane przychodzą parametrami metody. Jednakże,
w kontrolerze użytkownika ustawiany jest jeszcze
tytuł strony - poprzez zapisanie właściwości
title. Oznacza to, że w $this->title
będzie zawarty tytuł, który przekażemy
konstruktorowi klasy Page.
Są także niuanse z layoutem. Jak wiesz,
nasz framework używa layoutu z pliku
default.php. W rzeczywistości, każda
akcja może mieć inny layout. W tym
celu trzeba w samej akcji we właściwość layout
wpisać inną nazwę layoutu.
Jak to się osiąga: nasz kontroler nadrzędny
ma właściwość layout, domyślnie
mającą wartość 'default.php'. To
będzie layout domyślny. Jednakże, jeśli
akcja kontrolera użytkownika nadpisze
wartość właściwości layout, to layout
będzie inny.
Skopiuj kod mojej klasy Controller i umieść go w pliku
/core/Controller.php.
Skopiuj kod mojej klasy Page i
umieść go w pliku /core/Page.php.