0

モデルを使用するコントローラーを呼び出すルータークラスを持つカスタムMVCPHPフレームワークがあり、コントローラーがビューなどを表示します。

私の問題は、変数がコントローラーとビューの間で意味的に渡されるようにする方法を技術的に理解できないことです。私は手っ取り早い修正を行うことができましたが、私が欲しいのはコントローラー用にこれです:

class IndexController extends Controller{
    var $name = "John"; // instance variable
}

そして、ビューのためにこれを持っています:

<p> <?=$name?> </p>

私の質問はこれです:

  1. ビューがコントローラーからインスタンス変数にアクセスできるようにするController->render()関数などを作成するにはどうすればよいですか?と、
  2. $data['view']['name'] = "John";私が作成する新しいコントローラーに対して、デフォルトで10行のコードを記述したり、そのような厄介なことをしたりせずに、これを行うにはどうすればよいですか。これをやりたいので、できるだけ乾かします。

ありがとう。

編集:FabioCostaのソリューション

理解できるかどうかはわかりませんが、これまでのところ、ベースコントローラーは次のようになっています。

<?php
    class Controller{
        public function __get($key){
            if(isset($this->$$key)) return $this->$$key;
        }
    }
?>

私のベースビュークラスは次のようになります。

<?php
    class View{
         public $controller;
         public function render(){
         $this->controller = $this;
    }
?>

そして私はこのようにルーターから初期化します:

<?php
    $controller = new IndexController();
    $view = new IndexView();
    $view->render();
?>

しかし、これは機能せず、私は何か間違ったことをしていることを知っています。

4

2 に答える 2

3

ビューをインスタンス化するコントローラーを渡して、__ getマジックメソッドを使用してみませんか?

そのようです:

  public function __get($key){

      if(isset($this->$key)) return $this->$key;
  }

これが実際の例View.phpです:

class View{
   protected $_controller;
   public function __construct(Controller $controller){
        $this->_controller=$controller;
   }
   public function render(){
        echo '<h1>Hello '.$this->_controller->name.'</h1>';
   }
}

Controller.php

class Controller{
    protected $name='fabio';
    protected $_myView;

    public function __get($key){

        if(isset($this->$key)) return $this->$key;
   }
    public function __construct(){
        $this->_myView=new View($this);
    }

    public function indexAction(){
        $this->_myView->render();
    }
}

そしてルーター:

$c=new Controller();
$c->indexAction();
于 2012-06-14T12:10:29.383 に答える
2
  1. コントローラは、出力のレンダリングを担当するべきではありません。これは、viewインスタンスが実行する必要があることです。レンダリングはコントローラーの外部で行う必要があります。

  2. ビューはモデルレイヤーからのデータを要求する必要があります。次に、受け取った情報に基づいて、適切なテンプレートを選択し、データを割り当てて、このテンプレート(または場合によってはテンプレートのグループ)をレンダリングします。

また、ルーターはコントローラーもビューも初期化しないでください。コントローラーは、要求の処理のみを担当する必要があります。

于 2012-06-14T12:33:32.960 に答える