当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP教程:UCenter的MVC架构

PHP
在PHP中利用XML技术构造远程服务(上)
PHP的FTP学习(二)[转自奥索]
提问的智慧(2)
一个很方便的 XML 类!!原创的噢
DOMXML函数笔记
提问的智慧
PHP安装问题
PHP概述.
Oracle Faq(Oracle的字符集问题)
Oracle Faq(如何在ORACLE中更改表的列名和顺序 )
Oracle Faq(Oracle TAF的配置)
ftp类(example.php)
php中文件上传的安全问题
多文件上载系统完整版
文件上传类
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
第1次亲密接触PHP5(1)
Oracle 常见问题解答
PHP也可以當成Shell Script
用PHP读注册表

PHP教程:UCenter的MVC架构


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 120 ::
收藏到网摘: n/a

UCenter是采用很经典的MVC架构

UCenter采用index.php单点入口

01.$m = getgpc('m'); //判断加载哪一个Model
02.$a = getgpc('a'); //判断加载哪一个Control
03.$release = getgpc('release');
04.if(empty($m) && empty($a)) { //如果直接访问则跳转到管理界面
05.header('Location: admin.php');
06.exit;
07.}
08.  
09.//版本判断
10.if(empty($release)) {
11.define('RELEASE_ROOT', "release/20080429/");
12.} elseif(intval($release) != UC_SERVER_RELEASE) {
13.define('RELEASE_ROOT', "release/$release/");
14.} else {
15.define('RELEASE_ROOT', '');
16.}
17.//加载基类,基类中定义了很多的方法,所有控制器类都继承于该基类
18.if(file_exists(UC_ROOT.RELEASE_ROOT.'model/base.php')) {
19.require UC_ROOT.RELEASE_ROOT.'model/base.php';
20.} else {
21.require UC_ROOT.'model/base.php';
22.}
23.//判断是否加载的是指定的model
24.if(in_array($m, array('app', 'frame', 'user', 'pm', 'pm_client', 'tag', 'feed', 'friend', 'domain', 'credit', 'mail', 'version'))) {
25.if(file_exists(UC_ROOT.RELEASE_ROOT."control/$m.php")) {
26.include UC_ROOT.RELEASE_ROOT."control/$m.php";
27.} else {
28.include UC_ROOT."control/$m.php";
29.}
30.$classname = $m.'control';  //构造control类,如$m=user时control就为usercontrol
31.$control = new $classname();
32.$method = 'on'.$a;          //构造方法名
33.  
34.if(method_exists($control, $method) && $a{0} != '_') {  //如果方法存在且不是私有方法则执行该方法
35.$data = $control->$method();
36.echo is_array($data) ? $control->serialize($data, 1) : $data;
37.exit;
38.} elseif(method_exists($control, '_call')) {  //否则执行重载
39.$data = $control->_call('on'.$a, '');
40.echo is_array($data) ? $control->serialize($data, 1) : $data;
41.exit;
42.} else {
43.exit('Action not found!');
44.}
45.} else {
46.exit('Module not found!');
47.}

假定我们检测用户登录,那么对应的接口址就为:
xxx/index.php?m=user&a=login
这样,就会初始化usercontrol并调用onlogin方法,看看usercontrol的onlogin()

01.//部分代码,有所删减
02.class usercontrol extends base {
03.function __construct() {
04.$this->usercontrol();
05.}
06.function usercontrol() {
07.parent::__construct();    //执行基类构造函数
08.$this->load('user');   //加载user model,base类的load方法首先从$_ENV环境变量中查找是否已设置$_ENV['user'],若未设置,则加载model/user.php,然后实例化该类并写入环境变量中,也就是此时,user model已经实例化了。
09.}
10.function onlogin() {
11.$this->init_input();  //调用基类init_input()方法
12.$isuid = $this->input('isuid');  //从基类中获取isuid
13.$username = $this->input('username');  //获取用户名
14.$password = $this->input('password');   //获取密码
15.$checkques = $this->input('checkques');  //获取是否回答提示问题 
16.$questionid = $this->input('questionid'); //获取提示问题ID
17.$answer = $this->input('answer');  //获取回答
18.if($isuid) {   //判断是用UID登录还是用用户名登录
19.$user = $_ENV['user']->get_user_by_uid($username);  //调用/model/user.php中的get_user_by_id方法从数据库中获取该用户的实例
20.} else {
21.$user = $_ENV['user']->get_user_by_username($username);
22.}
23.  
24.$passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);
25.//判断各种可能的结果
26.if(empty($user)) {
27.$status = -1;
28.} elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
29.$status = -2;
30.} elseif($checkques && $user['secques'] != '' && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {
31.$status = -3;
32.} else {
33.$status = $user['uid'];
34.}
35.$merge = $status != -1 && !$isuid && $_ENV['user']->check_mergeuser($username) ? 1 : 0;
36.return array($status, $user['username'], $password, $user['email'], $merge);
37.}

model层直接与数据库交互,control层与model层交互,得到结果,返回给view。
如果我们要扩展自己的方法该怎么办?
首先,增加model类,定义我们所需要的方法,直接与DB进行交互。
其次,增加control类,并继承自base,定义on{xxxx}方法,与相对的model交互,并返回结果。