广

PHP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    明晰php Zend Framework中的render

    2018-04-03 21:30:49 次阅读 稿源:互联网
    零七广告

    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, $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);

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告