PHPにおける独自MVCフレームワークのコントローラ
ご存知の通り、私たちのフレームワークのすべてのコントローラは、
データをビューに送信するために呼び出す必要があるメソッド
renderを持っています。
このメソッドは、私たちのユーザー定義コントローラが、
コアにある親クラスControllerから継承します。
このクラスを作成しましょう:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
ご覧の通り、メソッドrenderはパラメータとして
ビュー名と表示用データを受け取ります。
このメソッドに、コントローラアクションのデータ表示に関する情報を含む
特別なクラスPageのオブジェクトを返させましょう。
このクラスには、ビュー名、データ、ページタイトル、
およびサイトレイアウトのファイル名が含まれます:
<?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のコードは
次のようになります:
<?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の値を
オーバーライドすると、レイアウトも別のものになります。
私のクラスControllerのコードをコピーし、
ファイル/core/Controller.phpに配置してください。
私のクラスPageのコードをコピーし、
ファイル/core/Page.phpに配置してください。