Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5120153
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2007-01-03 09:25:22

先来看看在application.class.php中是如何建立controller实例的:
PHP代码:--------------------------------------------------------------------------------
/**
* 执行函数
*
* 此类唯一对外的一个接口
**/
public function run()
{
$this->parsePath();
$this->checkSecurity($this->module, $this->action);
$controller = new $this->controllerClassName();
$controller->{$this->action}();
$this->writeLog($this->module, $this->action);
}

--------------------------------------------------------------------------------

Application这个类在实例后唯一可进行调用的一个函数,它根据用户的URL请求来分析得出所需要的Controller类名,然后实例化这个类(上面标1的地方),再调用从URL中获取的动作名称(上面标2的地方),

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

PHP代码:--------------------------------------------------------------------------------
CODE:
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
() 

 
$newsList = & $this->model->getList
(); 
 
$this->smarty->assign("newsList"$newsList
); 
  unset(
$newsList
); 
 
$this->smarty->display("newsList.html"
); 


?> 



--------------------------------------------------------------------------------

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

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

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

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

PHP代码:--------------------------------------------------------------------------------
CODE:
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(
"对不起,你所请求的动作 $name 没有定义 

...
"
); 


/** 
* 析构函数 

**/ 
public function __destruct
() 

unset(
$this->smarty
); 


?> 



--------------------------------------------------------------------------------

==============================================
Controller是一个抽象类,也就是说它不可以直接使用new 来产生一个实例对象,在类的构造函数里产生一个Smarty类,并对其进行基本的设置。其它的几个函数是对Smarty对象进行设置的成员函数, 这里来看看这两个函数:

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

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

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

好了,Controller 部分就谈到这里了。
阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~