asp.net mvc时对php mvc发生兴趣 看了看Zend Framework(下简称ZF) 可以对比理解mvc对一个比较核心的函数render很是迷惑了一阵 记录下明晰过程 通常在我们利用ZF实现php的mvc时,最关键的地方当然是Controller类的各种action方法,在action方法中,我们确定及输出内容. 在类 abstract class Zend_Controller_Action 中的dispatch方法你可以发现这一行 $this->$action(); 那么如何确定及输出内容呢,就是进行render了,不过这个render却是有好几个的,下面列出这几个情形 1<?php 2class IndexController extends Zend_Controller_Action 3{ 4 public function contactAction() 5 { 6 //$this->render("index"); 7 //$this->render(); 8 //$this->renderScript("sidebar.phtml"); 9 10 11 //$this->_helper->viewRenderer("sidebar"); 12 13 //$this->view->render("sidebar.phtml"); 14 //$this->view("sidebar"); 15 16 } 17} 18?> 总结下来,似乎就是这三中render了(欢迎补充) 1.自身render 先看第一种 //$this->render("index"); //$this->render(); //$this->renderScript("sidebar.phtml"); 这是直接使用Zend_Controller_Action类的render方法 第一句是render了另一个action所对应的视图(看清了 是render那个action对应的视图 而不是执行那个action!) 第二句式render本action对应的视图,这个有什么意义呢(因为很多情形你看不到这个写法的),这个下面再说. 第三句是render特定的视图文件,这里你可能认为前两个方法实际是调用了这个renderScript,其实不是如此. 下面就阐述一下.顺便解释第二句的原因. Zend_Controller_Action类的render方法中其实是有两个分支的 如下render函数代码 1 public function render($action = null,$name = null,$noController = false) 2 { 3 if (!$this->getInvokeArg('noViewRenderer') && $this->_helper->hasHelper('viewRenderer')) { 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 } 可以看到一种情形是利用(代理)了视图助手类(viewRenderer)的render方法 另一种是禁用助手时的情形 就得亲自上阵了,这也就是render()出现的原因,你禁用了视图助手后要输出本action对应视图内容可以使用render()来完成。 2.通过视图助手viewRenderer 上面说起了视图助手,那我们来看action中的第二个片段,正是借助视图助手来进行 //$this->_helper->viewRenderer("sidebar"); 实际上这里这句话并不是render内容,而是指定了要render哪个视图,参考Zend_Controller_Action_Helper_ViewRenderer类的这个函数 1 public function direct($action = null,$noController = null) 2 { 3 $this->setRender($action,$noController); 4 } 那么输出呢 是怎么输出的? 可以在$this->_helper->viewRenderer("sidebar"); 后直接调用$this->render();即可. 但是实际上你完全不用调用,只写那一句就行. 你不写render的时候,视图助手会来替你完成.在Zend_Controller_Action类中的dispatch方法中有这么一句 $this->_helper->notifyPostDispatch(); _helper是什么? 是一个Zend_Controller_Action_HelperBroker类,其中有这个方法 1 public function notifyPostDispatch() 2 { 3 foreach (self::getStack() as $helper) { 4 $helper->postDispatch(); 5 } 6 } 可以看到调用了其中各个助手的postDispatch(); 而viewRenderer正是其中的一个助手,其postDispatch方法如下 1 public function postDispatch() 2 { 3 if ($this->_shouldRender()) { 4 $this->render(); 5 } 6 } 正是在这里视图助手帮你进行了render,如果你自己render了,聪明的视图助手会知晓的,可以查看下在_shouldRender()中的这个 $this->getRequest()->isDispatched(),及Zend_Controller_Front 类中dispatch方法的这句话:$this->_request->setDispatched(true); (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|