asp.net mvc をやっていたときに php mvc に興味を持ち、Zend Framework (以下 ZF) を見てから、mvc を比較して理解できるようになり、しばらくの間、比較的コアな関数の render について混乱しました。明確化プロセスを記録します
通常、ZF を使用して PHP mvc を実装する場合、最も重要な場所はもちろん、コントローラー クラスのさまざまなアクション メソッドで、内容を決定して出力します。これは抽象化されたディスパッチ メソッドで確認できます。 class Zend_Controller_Action 一行 $this->$action();
コンテンツを決定して出力する方法はレンダリングですが、これらの状況は以下にいくつかリストされています
。1
2class IndexController は Zend_Controller_Action を拡張します
3{
4 パブリック関数 contactAction()
5{
6 //$this->render("index");
7 //$this->render();
8 //$this->renderScript("sidebar.phtml");
9
10
11 //$this->_helper->viewRenderer("サイドバー");
12
13 //$this->view->render("sidebar.phtml");
14 //$this->view("サイドバー");
15
16}
17}
18?>
1.セルフレンダリング
まず最初のものを見てみましょう
//$this->render("index");
//$this->render();
//$this->renderScript("sidebar.phtml");
これは Zend_Controller_Action クラスの render メソッドを直接使用しています
最初の文は、別のアクションに対応するビューをレンダリングすることです (アクションを実行することではなく、そのアクションに対応するビューをレンダリングすることであることを明確に理解してください)
2 番目の文は、このアクションに対応するビューをレンダリングします。これが何を意味するのか (多くの場合、この記述は見えないため)、これについては以下で説明します。
3 番目の文は、レンダリング固有のビュー ファイルです。ここでは、最初の 2 つのメソッドが実際にこの renderScript を呼び出していると思われるかもしれませんが、そうではありません。
ちなみに、2番目の文の理由を説明しましょう。
Zend_Controller_Action クラスの render メソッドには実際には 2 つの分岐があります。 render 関数のコードは次のとおりです
。
1 パブリック関数 render($action = null, $name = null, $noController = false)
2{
4 return $this->_helper->viewRenderer->render($action, $name, $noController);
5}
6
7 $view = $this->initView();
8 $script = $this->getViewScript($action, $noController);
9
10 $this->getResponse()->appendBody(
)
11 $view->render($script),
12 $name
13);
14}
1 つの状況として、ビュー アシスタント クラス (viewRenderer) のレンダリング メソッドを使用 (プロキシ) していることがわかります
もう 1 つの状況は、アシスタントを無効にする場合、自分で行う必要があるため、ビュー アシスタントを無効にした後、render() を使用して、このアクションに対応するビュー コンテンツを出力できます。
2. ビューアシスタント viewRenderer を通して
//$this->_helper->viewRenderer("サイドバー");
実はこの文はレンダリング内容ではなく、どのビューをレンダリングするかを指定するもので、Zend_Controller_Action_Helper_ViewRenderer クラスの関数を参照してください。
1 パブリック関数 direct($action = null, $name = null, $noController = null)
2{
4}
では、出力はどうなるでしょうか?
$this->_helper->viewRenderer("sidebar"); の直後に $this->render(); を呼び出すことができます。
しかし、実際にはそれを呼び出す必要はまったくなく、その文を書くだけです。
renderを書かない場合は、ビューアシスタントが代わりにやってくれます
Zend_Controller_Actionクラスのdispatchメソッドにこの文があります。
$this->_helper->notifyPostDispatch();
_helper とは何ですか? このメソッドを持つ Zend_Controller_Action_HelperBroker クラスです
1 パブリック関数notifyPostDispatch()
2{
3 foreach (self::getStack() として $helper) {
5}
6}
各アシスタントの postDispatch();
が呼び出されていることがわかります
そして、viewRendererはそのアシスタントの1つであり、そのpostDispatchメソッドは次のとおりです
1 パブリック関数 postDispatch()
2{
3 if ($this->_ShouldRender()) {
4 $this->render();
5}
6}
ここで、ビュー アシスタントがレンダリングを支援します。自分でレンダリングする場合、スマート ビュー アシスタントは、 _ShouldRender() の $this->getRequest()->isDispatched() を確認できます。 Zend_Controller_Front クラスのディスパッチ メソッドの次の文: $this->_request->setDispatched(true);