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
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, $name = null, $noController = null)
2 {
3 $this->setRender($action, $name, $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);
- 共2页:
- 上一页
- 1
- 2
- 下一页

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),