PHPにおける独自MVCフレームワークのコントローラ

ご存知の通り、私たちのフレームワークのすべてのコントローラは、 データをビューに送信するために呼び出す必要があるメソッド renderを持っています。 このメソッドは、私たちのユーザー定義コントローラが、 コアにある親クラスControllerから継承します。 このクラスを作成しましょう:

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

ご覧の通り、メソッドrenderはパラメータとして ビュー名と表示用データを受け取ります。 このメソッドに、コントローラアクションのデータ表示に関する情報を含む 特別なクラスPageのオブジェクトを返させましょう。 このクラスには、ビュー名、データ、ページタイトル、 およびサイトレイアウトのファイル名が含まれます:

/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に値を設定することでページタイトルも指定されます。 つまり、$this->titleには、 クラスPageのコンストラクタに渡すタイトルが含まれます。

レイアウトについても考慮点があります。 ご存知の通り、私たちのフレームワークはファイル default.phpからのレイアウトを使用します。 実際には、各アクションは別のレイアウトを持つこともできます。 そのためには、アクション自体でプロパティlayoutに 別のレイアウト名を設定する必要があります。

これを実現する方法:私たちの親コントローラはプロパティlayoutを持ち、 デフォルト値は'default.php'です。 これがデフォルトのレイアウトになります。 しかし、ユーザーコントローラのアクションがプロパティlayoutの値を オーバーライドすると、レイアウトも別のものになります。

Задание 1

私のクラスControllerのコードをコピーし、 ファイル/core/Controller.phpに配置してください。

Задание 2

私のクラスPageのコードをコピーし、 ファイル/core/Page.phpに配置してください。