Controlere în cadrul propriului tău framework MVC în PHP

După cum știți deja, toate controlerele din framework-ul nostru au metoda render, care trebuie apelată pentru a trimite datele către view. Această metodă este moștenită de controlerele noastre, cele personalizate, de la clasa părinte Controller, aflată în nucleu. Să creăm această clasă:

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

După cum vedeți, metoda render primește ca parametru numele view-ului și datele pentru afișare. Să facem ca această metodă să returneze un obiect al unei clase speciale Page, în care vor fi conținute informații despre view-ul datelor acțiunii controlerului. În această clasă vor fi conținute numele view-ului, datele, precum și titlul paginii și numele fișierului cu layout-ul site-ului:

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

Atunci codul metodei noastre render va arăta astfel:

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

Să explic ce se întâmplă aici. Numele view-ului și datele vin ca parametri ai metodei. Cu toate acestea, în controlerul personalizat se mai setează și titlul paginii - prin scrierea proprietății title. Înseamnă că în $this->title va fi conținut titlul pe care îl vom transmite constructorului clasei Page.

Există și nuanțe cu layout-ul. După cum știți, framework-ul nostru folosește layout-ul din fișierul default.php. De fapt, fiecare acțiune poate avea și alt layout. Pentru aceasta este nevoie ca în acțiunea însăși, în proprietatea layout să se scrie un alt nume de layout.

Cum se realizează acest lucru: controlerul nostru părinte are proprietatea layout, care în mod implicit are valoarea 'default.php'. Acesta va fi layout-ul implicit. Cu toate acestea, dacă acțiunea controlerului personalizat redefește valoarea proprietății layout, atunci și layout-ul va fi altul.

Задание 1

Copiați codul clasei mele Controller și plasați-l în fișierul /core/Controller.php.

Задание 2

Copiați codul clasei mele Page și plasați-l în fișierul /core/Page.php.