Kontrollerid oma MVC raamistikus PHP-s

Nagu te juba teate, on kõigil meie raamistiku kontrolleritel meetod render, mida tuleb kutsuda andmete saatmiseks vaatesse. Selle meetodi pärivad meie kasutajate loodud kontrollerid ülemklassist Controller, mis asub tuumas. Teeme selle klassi:

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

Nagu näete, võtab meetod render parameetritena vastu vaate nime ja andmed kuvamiseks. Olgu see meetod tagastab spetsiaalse klassi Page objekti, mis sisaldab teavet kontrolleri tegevuse andmete vaate kohta. Selles klassis sisalduvad vaate nimi, andmed, samuti lehe pealkiri ja saidi maketi faili nimi:

/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;
    }
  }
?>

Siis näeb meie meetodi render kood välja selline:

/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);
    }
  }
?>

Selgitan, mis siin toimub. Vaate nimi ja andmed tulevad meetodi parameetritena. Kuid kasutaja kontrolleris määratakse ka lehe pealkiri - omaduse title kirjutamise teel. Seega sisaldub $this->title-s pealkiri, mille me edastame klassi Page konstruktorile.

On ka nüansse maketiga. Nagu te teate, kasutab meie raamistik maketit failist default.php. Tegelikult võib iga tegevus omada ka teist maketit. Selleks tuleb tegevuses endas omadusse layout kirjutada teine maketi nimi.

Kuidas see saavutatakse: meie ülemkontrolleril on omadus layout, mille vaikeväärtus on 'default.php'. See ongi vaikimisi maketiks. Kui aga kasutaja kontrolleri tegevus muudab omaduse layout väärtust, siis on ka makett teine.

Задание 1

Kopeerige minu klassi Controller kood ja asetage see faili /core/Controller.php.

Задание 2

Kopeerige minu klassi Page kood ja asetage see faili /core/Page.php.