Kontrollers i ditt eget MVC-ramverk i PHP
Som du redan vet har alla kontrollers i vårt
ramverk metoden render, som
behöver anropas för att skicka data till vyn.
Denna metod ärver våra anpassade kontrollers
från förälderklassen Controller,
placerad i kärnan. Låt oss skapa denna klass:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Som du ser tar metoden render som parameter
emot namnet på vyn och data för
visning. Låt denna metod returnera
ett objekt av en speciell klass Page, i
vilken information om visningen av
kontrolleraktionens data kommer att finnas. I denna klass
kommer namnet på vyn, data,
samt sidans titel och filnamnet för webbplatsens layout
att finnas:
<?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;
}
}
?>
Då kommer koden för vår metod render att
se ut så här:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Låt mig förklara vad som händer här. Namnet på vyn
och data kommer som parametrar till metoden. Dock
sätts även sidans titel i den användardefinierade
kontrollern - genom att skriva till egenskapen
title. Det betyder att i $this->title
kommer titeln att finnas, som vi skickar vidare
till konstruktorn för klassen Page.
Det finns även nyanser med layouten. Som du vet
använder vårt ramverk en layout från filen
default.php. Egentligen kan varje
åtgärd ha en annan layout. För
att göra detta behöver man i själva åtgärden i egenskapen layout
skriva ett annat layoutnamn.
Hur detta uppnås: vår föräldrakontroller
har en egenskap layout, som som standard
har värdet 'default.php'. Detta
kommer att vara standardlayouten. Men om
en åtgärd i den användardefinierade kontrollern åsidosätter
värdet på egenskapen layout, så kommer layouten
att bli en annan.
Kopiera koden för min klass Controller och placera den i filen
/core/Controller.php.
Kopiera koden för min klass Page och
placera den i filen /core/Page.php.