Kontrollere i ditt eget MVC-rammeverk i PHP
Som du allerede vet, har alle kontrollerne i vårt
rammeverk en metode render, som
må kalles for å sende data til visningen.
Denne metoden arver våre, brukerdefinerte kontrollere
fra foreldreklassen Controller,
plassert i kjernen. La oss lage denne klassen:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Som du ser, tar metoden render parameter
imot navnet på visningen og dataene for
visning. La denne metoden returnere
et objekt av en spesiell klasse Page, i
som vil inneholde informasjon om visningen
av kontrollerhandlingens data. I denne klassen
vil navnet på visningen, dataene,
samt sidetittelen og filnavnet med layoutet
på nettstedet inneholdes:
<?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;
}
}
?>
Da vil koden til vår render-metode
se slik ut:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
La meg forklare hva som skjer her. Visningens navn
og data kommer som parametre til metoden. Imidlertid
settes også sidetittelen i den brukerdefinerte
kontrolleren - ved å skrive til egenskapen
title. Det betyr at i $this->title
vil tittelen som vi sender til
konstruktøren til klassen Page, være tilstede.
Det er også nyanser med layout. Som du vet,
bruker rammeverket vårt en layout fra filen
default.php. Faktisk kan hver
handling ha et annet layout. For
å gjøre dette må du i selve handlingen i egenskapen layout
skrive et annet layoutnavn.
Hvordan dette oppnås: vår foreldrekontroller
har en egenskap layout, som standard
har verdien 'default.php'. Dette
vil være standardlayoutet. Imidlertid, hvis
handlingen til den brukerdefinerte kontrolleren overstyrer
verdien til egenskapen layout, vil layoutet
være annerledes.
Kopier koden til min Controller-klasse og plasser den i filen
/core/Controller.php.
Kopier koden til min Page-klasse og
plasser den i filen /core/Page.php.