免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2743 | 回复: 1

php mvc开发系列教程第三节 Controller 类实现 [复制链接]

论坛徽章:
0
发表于 2012-01-07 15:48 |显示全部楼层
php mvc开发系列教程第三节 Controller 类实现







通过上两节我们知道 程序通过单一入口文件的route类决定了 唯一的moudle, conttoller, action,并在最后执行了
  1. $route->run();
  2. 复制代码
复制代码

  1.    /**        * 执行相应的 MCA        *        */       private function run ()       {           $filePath = APPLICATION_PATH.'/controller/'.$this->_moudle.'/'.$this->_conttoller.'.inc.php';           $isNo = 0;           if(file_exists($filePath))           {                  include "$filePath";                  $controller_tp = $this->_conttoller.'Controller';                  $controller = new $controller_tp;                               if (method_exists($controller,$this->_action.'Action'))                  {                     $acion_tmp = $this->_action.'Action';                     $controller->$acion_tmp();                  }else                  {                     $isNo = 1;                  }            }else           {              $isNo = 1;           }                     if ($isNo)           {              $filePath = APPLICATION_PATH.'/controller/default/index.inc.php';              $this->_moudle = $this->_default['module'];              $this->_conttoller = $this->_default['conttoller'];              $this->_action = $this->_default['action'];                                       ($this->_moudle != $this->_default['module']) && include "$filePath";              $controller = new indexController;              $controller->indexAction();           }       }
  2. 复制代码
复制代码
当相关'Controller'文件存在时执行

  1. include "$filePath";$controller_tp = $this->_conttoller.'Controller';$controller = new $controller_tp;
  2. 复制代码
复制代码
上述三行代码的意思是,根据确定好的 conttoller 包含相应文件,并实例化相应的conttoller。

  1. $acion_tmp = $this->_action.'Action';    $controller->$acion_tmp();
  2. 复制代码
复制代码
根据相应的Action 执行相应的action





所有的  Controller 类都集成一个公用的Controller 类,本节课我们就来分析一下公共的Controller 类
  1. <?php/** * 前台公共类 接口 * 实现公共部分代码 */ /** * 本文件只能被index。php包含 */defined("WEB_AUTH") || die("NO_AUTH"); /** * 包含菜单配置文件 */ class Controller{    public $tpl;    public $controller;    public $body;//右边菜单    public $_route ;    public $html_;    public $tpl_;       /*     * 构造函数     */    public function __construct()    {           $this->init();    }     /*     * 初始化变量,顶部菜单和模板     */    protected function init()    {          global $TPL,$route;        $this->tpl  = $TPL;        $this->_route = $route;    }            /**     * 模板变量传第     */    protected function diplayTpl()    {       $this->body   || $this->body = $this->_route->getActionName();       $this->tpl->assign("body",$this->body);             /*设置本控制器的模板目录*/       $this->controller ||$this->controller  =$this->_route->getControllerName();        $this->tpl->assign("controller",$this->controller);       $this->tpl->display($this->layout);       }    /**     * smarty封装类     * @param string $name     * @param string $value     */    public  function assign($name,$value)    {       $this->tpl->assign($name,$value);    }       /**     * 显示另外的模板     * @param string $name     * @param string $value     */    protected function displayOther($file)    {       $this->assign("otherTpl",TRUE);       $this->tpl->display($file);    }      /**     * 显示某个MCA的body模板     * 0=>m 1=>c =>a     */    protected function getMcaBody($array)    {       return   'http://www.cnblogs.com/../'.$array[0].'/body/'.$array[1].'/'.$array[2];    }    /*     * 析构函数,显示页面     */    protected function __destruct()    {         $this->tpl->_tpl_vars['otherTpl'] || $this->diplayTpl();    }    /**     * 中途退出     */    protected function _exit($msg = "")    {       $this->assign("otherTpl",TRUE);       die($msg);    }       /**     * 用 $this->html_var=value放法给变量赋值     * 用 $this->tpl_var=value放法给变量赋值     */    protected function __set($name,$value)    {       if(strtolower(substr($name,0,5)) == "html_" || strtolower(substr($name,0,4)) == "tpl_")       {           $this->assign(substr($name,5),$value);       }    }}?>
  2. 复制代码
复制代码
首先看
  1. protected function __destruct()    {         $this->tpl->_tpl_vars['otherTpl'] || $this->diplayTpl();    }
  2. 复制代码
复制代码
这是所有Controller 类 生命周期结束时候要执行的函数(搜索一下php魔术方法 查看详情)

本框架利用这时候解析模板,这样的好处是,当Controller中相关执行完相关数据处理,后自动执行相关的模板(View);而不用每次在程序最后调用模板
  1. protected function __set($name,$value)    {       if(strtolower(substr($name,0,5)) == "html_" || strtolower(substr($name,0,4)) == "tpl_")       {           $this->assign(substr($name,5),$value);       }    }
  2. 复制代码
复制代码
这个函数简化了程序向模板传递变量的方法,以smarty为例,在程序中需要执行 $tpl->assign(‘key’,$value);

来向模板中注册变量,而此函数中简化了此方法 ,只需 $this->html_key=$value;来实现相同的作用.(利用开发环境的提示功能,在前面声明
  1. public $html_;    public $tpl_;
  2. 复制代码
复制代码
更加简化了向模板注册变量

论坛徽章:
0
发表于 2012-01-07 16:11 |显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP