PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » 入门和基础知识 » MVC with PHP
本页主题: MVC with PHP 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

自由的龙

该用户目前不在线
级别: 中级程序员
精华: 1
发帖: 1264
威望: 1267 点
金钱: 12660 PYMB
贡献值: 0 点
在线时间:0(小时)
注册时间:2006-04-16
最后登录:2006-06-27

MVC with PHP


先来看看在application.class.php中是如何建立controller实例的:
<?php
/**
  * 执行函数
  *
  * 此类唯一对外的一个接口
  **/
  public function run()
  {
    $this->parsePath();
    $this->checkSecurity($this->module, $this->action);
  1. $controller = new $this->controllerClassName();
  2. $controller->{$this->action}();
    $this->writeLog($this->module, $this->action);
  }
?>
Application这个类在实例后唯一可进行调用的一个函数,它根据用户的URL请求来分析得出所需要的Controller类名,然后实例化这个类(上面标1的地方),再调用从URL中获取的动作名称(上面标2的地方),

这个举一个简单的例子:
  URL: http://localhost/?module=news&action=showList
  Application通过分析这个URL重到controllerClassName=news, action=showList,然后它将在包含处理这个controller类的文件名(在Application->getControllerFile()中进行),然后实例化News这个
controller类(标1的地方), 随后调用它的动作showList(标2的地方).
  来看看newsController.php中的内容:
=============================================================


CODE:[Copy to clipboard]<?php
  /**
  * FileName: newsController.php
  * Introduce: 新闻控制类
  *
  * @author: 大师兄
  * @Email: teacherli@163.com
  * @version $Id$
  * @copyright 2004-10-26
  **/
  include_once ("./controller/comm/controller.class.php");
  include_once ("./model/news/newsModel.php");
 
  class NewsController extends Controller
  {
    private $model;
   
    /**
    * 构造函数
    *
    **/
    public function __construct()
    {
        parent::__construct();
        $this->model = new NewsModel();
        $this->setSmartyTemplate_dir("./view/news");
    }  
   
    /**
    * 显示新闻列表
    *
    **/
    public function showList()
    {  
      1. $newsList = & $this->model->getList();

      2. $this->smarty->assign("newsList", $newsList);
      3. unset($newsList);

      4. $this->smarty->display("newsList.html");
    }  
  }
  ?>
==============================================================
首先,NewsController类继承自公共类Controller,在类进行初始化时产生一个NewsModel类,这个类是一个model类,由这个类负责新闻模块所有的对数据库的交互. parent::__construct()调用父类的构造函数,完成对view的控制类Smarty的初始化.$this->setSmartyTemplate_dir("./view/news")将模板目录定位在./view/news目录.

  然后看我们上面的例子,请求URL为http://localhost/?module=news&action=showList,表示要调用
showList这个动作,看NewsController类的showList()成员函数:
  1. $newsList = & $this->model->getList(): $this->model在NewsController初始化时建立,这一句要使用$this->model从数据库里提取出一个新闻列表,这个列表当然就是Smarty在操作循环块时需要的二维数组了,在NewsModel类中,它是采用ADODB回传的一个二维数组.
  2. $this->smarty->assign("newsList", $newsList): 熟悉吧,smarty中循环块的程序控制
  3. unset($newsList):考虑到效率问题,对于这些临时变量在使用完成后即时将它unset。
  4. $this->smarty->display("newsList.html"):使用smarty来显示view.

  大家看明白了吗?实际上controller类要做的事情就是这样:1.调用model从数据库取出记录 2.操

作Smarty显示view。
  再来看看NewsController的父类Controller类的源码:
===========================================================


CODE:[Copy to clipboard]<?php
  /**
  * FileName: controller.class.php
  * Introduce: Base class of controller
  *
  * @author: 李晓军
  * @Email: teacherli@163.com
  * @version $Id$
  * @copyright 2004-10-26
  **/

  include_once ("./comm/smarty/Smarty.class.php");
  include_once ("./comm/config.inc.php");

  abstract class Controller
  {
    private $smarty;
 
    /**
    * 系统构建函数
    * 初始化Smarty
    **/
    function __construct()
    {
        $this ->smarty = new Smarty();
   
        $this->smarty->template_dir   =   "./view/templates";
        $this->smarty->compile_dir   =   "./view/templates_c";
        $this->smarty->cache_dir     =   "./view/cache";
        $this->smarty->cache_lifetime =   60 * 60 * 24;
        $this->smarty->caching       =   false;
        $this->smarty->left_delimiter = "<{";
        $this->smarty->right_delimiter = "}>";
    }
   
    /**
    * 设置smarty模板路径
    *
    * @param string $template
    **/
    public function setSmartyTemplate_dir($template)
    {
        $this->smarty->template_dir = $template;
    }
   
    /**
    * 设置smarty是否进行缓存
    *
    * @param boolean $cache
    **/
    public function setSmartyCache($cache = false)
    {
        $this->smarty->cache = $cache;
    }
   
    /**
    * 设置smarty缓存时间
    *
    * @param string $cacheLifetime
    **/
    public function setSmartyCacheTime($cacheLifetime)
    {
        $this->smarty->cache_lifetime = $cacheLifetime;
    }
   
    /**
    * 动作被执行后一个短暂的提示
    *
    * @param string $module 重新定向到的模块名称
    * @param string $action 重新定向的动作名称
    * @param string $params 参数名称
    * @param string $message 提示信息
    **/
    public function redirect($module, $action, $params="", $message="动作已经被成功执

行")
    {
        $time = WAIT_FOR_TIME;
        $params = ("" == $params) ? "" : "&$params";
        $URL = "?module=" . $module . "&action=" . $action . $params;
       
        //重新定Smarty模板目录至公用目录
        $this->setSmartyTemplate_dir("./view/templates");
        $this->smarty->assign("URL", $URL); //重定向的目录
        $this->smarty->assign("message", $message); //提示信息
        $this->smarty->assign("time", $time);
        $this->smarty->display("wait.html");
    }
   
    /**
    * 调用本类不存在的方法时进行的处理
    *
    * @param string $name
    * @param string $parameter
    **/
    public function __call($name, $parameter)
    {
        throw new ActionNotAllowException("对不起,你所请求的动作 <b>$name</b> 没有定义

...<br>");
    }
   
    /**
    * 析构函数
    *
    **/
    public function __destruct()
    {
        unset($this->smarty);
    }
  }
?>
==============================================
Controller是一个抽象类,也就是说它不可以直接使用new 来产生一个实例对象,在类的构造函数里产生一个Smarty类,并对其进行基本的设置。其它的几个函数是对Smarty对象进行设置的成员函数, 这里来看看这两个函数:

public function redirect($module, $action, $params="", $message="动作已经被成功执行"):
这是一个重新定向成员函数,它的作用是当我们对模块进行一些操作后给出的提示页面,然后经过设置好的时间自动重新定向到另一个位置,例如我们要对新闻进行一些删除,删除成功后我们要给用户返回这样一个页面,告诉用户操作已经成功,请待n秒后自动返回....这在论坛中是很常见的,这里我也引用了这样的策略。

public function __call($name, $parameter):
  当类调用类没有声明的函数时使用这个函数进行处理,这可是个好东东,有了它,可以使用对程序

的控制更加简单了,大家可以试试这个方法....

  好了,Controller 部分就谈到这里了。
顶端 Posted: 2006-04-16 16:15 | [楼 主]
PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » 入门和基础知识

时:01-09 02:03 Copyright © 2006 phpwhy.com 权
ICP05060669

曳息 -