そして、$data
ビューファイルで利用可能になります。これは正しい実装ですか?この実装に誤謬はありますか?
基本的に、ほとんどのフレームワークと同じように実装します。それにはいくつかの問題があります:
- コントローラーは入力を受け取り、出力を送信します (これは単一責任の原則を破っています)
- ビューは HTML と密接に結合されています。このため、同じビューを XML や JSON などの別のものに再利用することはできません。
- メソッドで行う場合は
require "views/" . $file . ".php";
、render()
再び緊密に結合します。ビューの位置を変更するとどうなりますか? 次に、メソッドを少し書き直す必要があります。このアプローチは、単に再利用能力を殺すだけです。
基本的な知識を更新するには:
コントローラー (エディターとも呼ばれます)
単一の目的のみを果たします。モデルの状態を変更します。つまり$_POST
、$_GET
、$_FILES
、からの入力を受け取る必要があります$_COOKIE
。コントローラーでは、変数の割り当てのみを行う必要があり、それ以上は何もしません。
class Controller
{
public function indexAction()
{
$this->view->setVar('age', $this->request->getPostParam('age'));
$this->view->setVar('user', $this->request->getPostParam('user'));
//...
}
}
意見
ビューはモデルに直接アクセスできます。ビューをより再利用可能で保守しやすくするには、必要なものを関数パラメーターとして (またはセッターを介して) 渡すことをお勧めします。
class View
{
public function render($templateFile, array $vars = array())
{
ob_start();
extract($vars);
require($templateFile);
return ob_get_clean();
}
}
ビューをどのように初期化する必要があり、変数をどのように渡す必要がありますか?
まず第一に、ビューは MVC トライアドの外でインスタンス化する必要があります。コントローラーはビューまたはモデルのいずれかに書き込むため、コントローラーを介して変数をビューに渡します。
$model = new Model();
$view = new View($model);
$controller = new Controller($view);
// This will assign variables to view
$controller->indexAction();
echo $view->render();
注: 現実世界のシナリオでは、モデルはクラスではなく、抽象化レイヤーです。Model
私はデモンストレーションの目的でそれを呼び出します。