Ελεγκτές στο δικό μας MVC framework σε PHP

Όπως ήδη γνωρίζετε, όλοι οι ελεγκτές του framework μας έχουν τη μέθοδο render, η οποία πρέπει να καλείται για την αποστολή δεδομένων στην προβολή. Αυτή η μέθοδος, οι δικοί μας, προσαρμοσμένοι ελεγκτές την κληρονομούν από την γονική κλάση Controller, που βρίσκεται στον πυρήνα. Ας φτιάξουμε αυτή την κλάση:

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

Όπως βλέπετε, η μέθοδος render δέχεται ως παράμετρο το όνομα της προβολής και τα δεδομένα για την εμφάνιση. Ας κάνουμε αυτή τη μέθοδο να επιστρέφει ένα αντικείμενο μιας ειδικής κλάσης Page, στην οποία θα περιέχονται πληροφορίες σχετικά με την προβολή δεδομένων της δράσης του ελεγκτή. Σε αυτή την κλάση θα περιέχεται το όνομα της προβολής, τα δεδομένα, καθώς και ο τίτλος (title) της σελίδας και το όνομα του αρχείου με τη διάταξη (layout) του site:

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

Τότε ο κώδικας της μεθόδου render θα μοιάζει κάπως έτσι:

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

Ας εξηγήσω τι συμβαίνει εδώ. Το όνομα της προβολής και τα δεδομένα έρχονται ως παράμετροι της μεθόδου. Ωστόσο, στον προσαρμοσμένο ελεγκτή ορίζεται επίσης και ο τίτλος (title) της σελίδας - μέσω της εγγραφής της ιδιότητας title. Αυτό σημαίνει ότι στο $this->title θα περιέχεται ο τίτλος, τον οποίο θα περάσουμε στον κατασκευαστή (constructor) της κλάσης Page.

Υπάρχουν επίσης αποχρώσεις με το layout. Όπως γνωρίζετε, το framework μας χρησιμοποιεί layout από το αρχείο default.php. Στην πραγματικότητα, κάθε δράση μπορεί να έχει και διαφορετικό layout. Για να γίνει αυτό, χρειάζεται στην ίδια τη δράση, στην ιδιότητα layout να γραφεί ένα διαφορετικό όνομα layout.

Πώς επιτυγχάνεται αυτό: ο γονικός ελεγκτής μας έχει την ιδιότητα layout, η οποία από προεπιλογή έχει την τιμή 'default.php'. Αυτό θα είναι το layout από προεπιλογή. Ωστόσο, εάν η δράση του προσαρμοσμένου ελεγκτή επαναορίσει την τιμή της ιδιότητας layout, τότε και το layout θα είναι διαφορετικό.

Задание 1

Αντιγράψτε τον κώδικα της κλάσης Controller και τοποθετήστε τον στο αρχείο /core/Controller.php.

Задание 2

Αντιγράψτε τον κώδικα της κλάσης Page και τοποθετήστε τον στο αρχείο /core/Page.php.