Kontrollerek a saját MVC keretrendszerben PHP-ben

Amint már tudjátok, a keretrendszerünk összes kontrollerének van egy render metódusa, amelyet az adatok nézetbe történő elküldéséhez kell meghívni. Ezt a metódust a felhasználói kontrollereink öröklik a Controller szülőosztálytól, amely a magban található. Hozzuk létre ezt az osztályt:

/core/Controller.php<?php
  namespace Core;
  
  class Controller
  {
    protected function render($view, $data) {
      
    }
  }
?>

Amint látjátok, a render metódus paraméterként fogadja a nézet nevét és a megjelenítendő adatokat. Legyen ez a metódus egy speciális Page osztály objektumát adja vissza, amely a kontroller műveletének adatmegjelenítési információit tartalmazza. Ez az osztály tartalmazza a nézet nevét, az adatokat, valamint az oldal címét és a webhely elrendezésének fájlnevét:

/core/Page.php<?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;
    }
  }
?>

Ekkor a render metódusunk kódja így fog kinézni:

/core/Controller.php<?php
  namespace Core;
  
  class Controller
  {
    protected $layout = 'default';
    
    protected function render($view, $data) {
      return new Page($this->layout, $this->title, $view, $data);
    }
  }
?>

Hadd magyarázzam el, mi történik itt. A nézet neve és az adatok paraméterként érkeznek a metódushoz. Azonban a felhasználói kontrollerben még az oldal címe is be van állítva - a title tulajdonság beírásával. Ez azt jelenti, hogy a $this->title lesz az a cím, amelyet továbbadunk a Page osztály konstruktorának.

Vannak árnyalatok az elrendezéssel kapcsolatban is. Amint tudjátok, a keretrendszerünk a default.php fájlból származó elrendezést használja. Valójában minden műveletnek lehet más elrendezése is. Ehhez magában a műveletben a layout tulajdonságba egy másik elrendezésnevet kell beírni.

Hogyan érhetjük ezt el: a szülői kontrollerünk rendelkezik egy layout tulajdonsággal, amely alapértelmezés szerint a 'default.php' értékkel rendelkezik. Ez lesz az alapértelmezett elrendezés. Ha azonban a felhasználói kontroller művelete felülírja a layout tulajdonság értékét, akkor az elrendezés is más lesz.

Задание 1

Másolja le a Controller osztályom kódját és helyezze el a /core/Controller.php fájlban.

Задание 2

Másolja le a Page osztályom kódját és helyezze el a /core/Page.php fájlban.