11

私の現在の実装:

class SomeController extends AppController
{
    function someaction()
    {   
        $d['text'] = "ahoy!";
        $this->render("someactionView", $d);
    }
}

そしてでAppController

function render($file, $data = "")
{
    require "views/" . $file . ".php";
}

そして、$dataビューファイルで利用可能になります。これは正しい実装ですか?この実装に誤謬はありますか?

4

3 に答える 3

13

そして、$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私はデモンストレーションの目的でそれを呼び出します。

于 2013-09-24T14:08:21.680 に答える
3

IMOrender()メソッドはコントローラーではなくビューに属します。コードは次のようになります。

コントローラ:

class SomeController extends AppController
{
    function someaction()
    {   
        $d['text'] = "ahoy!";
        $view = new SomeActionView();
        $view->assign('data', $d);
        echo $view->render();
    }
}

基本クラスを表示:

class View
{

    protected $data;

    function render($template) {
        ob_start();
        // you can access $this->data in template
        require "views/" . $template . ".php";
        $str = ob_get_contents();
        ob_end_clean();
        return $str;
    }


    function assign($key, $val) {
        $this->data[$key] = $val;
    }
}

View クラスを拡張する

class SomeActionView extends View
{

    public function render($template = 'someActionTemplate') {
        return parent::render($template);
    }

}
于 2013-09-22T23:38:03.523 に答える
2

これは正しい実装ですか?この実装に誤謬はありますか?

短い答え:いいえ、いくつか。

まず第一に、あなたが持っているものはビューではありません。それはただの愚かなphp テンプレートです。MVC のビューは、アプリケーションの UI ロジックを含むインスタンスです。モデル レイヤーから情報を取得し、受け取った情報に基づいて応答を作成します。この応答は、単純なテキスト、JSON ドキュメント、複数のテンプレートから組み立てられた HTML ページ、または単純な HTTP ヘッダーにすることができます。

コントローラーに関しては、モデルレイヤーの状態と(まれに)現在のビューを変更するだけのタスクです。コントローラーは、ビューを初期化したり、テンプレートを設定したりしません

于 2013-09-23T00:56:19.373 に答える