efdf 发表于 2015-8-25 11:38:54

php mvc开发系列教程第三节 Controller 类实现

  通过上两节我们知道 程序通过单一入口文件的route类决定了 唯一的moudle, conttoller, action,并在最后执行了



$route->run();

  

   



   /**
      * 执行相应的 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();
         }
       }


  
  当相关'Controller'文件存在时执行




include "$filePath";
$controller_tp = $this->_conttoller.'Controller';
$controller = new $controller_tp;


上述三行代码的意思是,根据确定好的 conttoller 包含相应文件,并实例化相应的conttoller。
      
   



$acion_tmp = $this->_action.'Action';
    $controller->$acion_tmp();

根据相应的Action 执行相应的action


所有的Controller 类都集成一个公用的Controller 类,本节课我们就来分析一下公共的Controller 类



<?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
   */
    publicfunction 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.'/body/'.$array.'/'.$array;
    }
    /*
   * 析构函数,显示页面
   */
    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);
       }
    }
}
?>



首先看
   



protected function __destruct()
    {
       $this->tpl->_tpl_vars['otherTpl'] || $this->diplayTpl();
    }

这是所有Controller 类 生命周期结束时候要执行的函数(搜索一下php魔术方法 查看详情)
本框架利用这时候解析模板,这样的好处是,当Controller中相关执行完相关数据处理,后自动执行相关的模板(View);而不用每次在程序最后调用模板




protected function __set($name,$value)
    {
       if(strtolower(substr($name,0,5)) == "html_" || strtolower(substr($name,0,4)) == "tpl_")
       {
         $this->assign(substr($name,5),$value);
       }
    }


这个函数简化了程序向模板传递变量的方法,以smarty为例,在程序中需要执行 $tpl->assign(‘key’,$value);
来向模板中注册变量,而此函数中简化了此方法 ,只需 $this->html_key=$value;来实现相同的作用.(利用开发环境的提示功能,在前面声明



public $html_;
    public $tpl_;


更加简化了向模板注册变量
页: [1]
查看完整版本: php mvc开发系列教程第三节 Controller 类实现