服务器在线 - 服务器软件 - 网站地图 服务器在线,专注于服务器技术!

当前位置:主页 > 编程脚本 > PHP > 正文

ucenter的mvc架构解析

时间:2015-01-11    来源:服务器在线    投稿:泡泡    点击:

$m = getgpc('m'); //判断加载哪一个Model
$a = getgpc('a'); //判断加载哪一个Control
$release = getgpc('release');
if(empty($m) && empty($a)) { //如果直接访问则跳转到管理界面
header('Location: admin.php');
exit;
}
  
//版本判断
if(empty($release)) {
define('RELEASE_ROOT', "release/20080429/");
} elseif(intval($release) != UC_SERVER_RELEASE) {
define('RELEASE_ROOT', "release/$release/");
} else {
define('RELEASE_ROOT', '');
}
//加载基类,基类中定义了很多的方法,所有控制器类都继承于该基类
if(file_exists(UC_ROOT.RELEASE_ROOT.'model/base.php')) {
require UC_ROOT.RELEASE_ROOT.'model/base.php';
} else {
require UC_ROOT.'model/base.php';
}
//判断是否加载的是指定的model
if(in_array($m, array('app', 'frame', 'user', 'pm', 'pm_client', 'tag', 'feed', 'friend', 'domain', 'credit', 'mail', 'version'))) {
if(file_exists(UC_ROOT.RELEASE_ROOT."control/$m.php")) {
include UC_ROOT.RELEASE_ROOT."control/$m.php";
} else {
include UC_ROOT."control/$m.php";
}
$classname = $m.'control';  //构造control类,如$m=user时control就为usercontrol
$control = new $classname();
$method = 'on'.$a;          //构造方法名
  
if(method_exists($control, $method) && $a{0} != '_') {  //如果方法存在且不是私有方法则执行该方法
$data = $control->$method();
echo is_array($data) ? $control->serialize($data, 1) : $data;
exit;
} elseif(method_exists($control, '_call')) {  //否则执行重载
$data = $control->_call('on'.$a, '');
echo is_array($data) ? $control->serialize($data, 1) : $data;
exit;
} else {
exit('Action not found!');
}
} else {
exit('Module not found!');
}
    假定我们检测用户登录,那么对应的接口址就为:
  ***/index.php?m=user&a=login
这样,就会初始化usercontrol并调用onlogin方法,看看usercontrol的onlogin()
//部分代码,有所删减
class usercontrol extends base {
function __construct() {
$this->usercontrol();
}
function usercontrol() {
parent::__construct();    //执行基类构造函数
$this->load('user');   //加载user model,base类的load方法首先从$_ENV环境变量中查找是否已设置$_ENV['user'],若未设置,则加载model/user.php,然后实例化该类并写入环境变量中,也就是此时,user model已经实例化了。
}
function onlogin() {
$this->init_input();  //调用基类init_input()方法
$isuid = $this->input('isuid');  //从基类中获取isuid
$username = $this->input('username');  //获取用户名
$password = $this->input('password');   //获取密码
$checkques = $this->input('checkques');  //获取是否回答提示问题 
$questionid = $this->input('questionid'); //获取提示问题ID
$answer = $this->input('answer');  //获取回答
if($isuid) {   //判断是用UID登录还是用用户名登录
$user = $_ENV['user']->get_user_by_uid($username);  //调用/model/user.php中的get_user_by_id方法从数据库中获取该用户的实例 20.} else {
$user = $_ENV['user']->get_user_by_username($username);
}
  
$passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);
//判断各种可能的结果
if(empty($user)) {
$status = -1;
} elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
$status = -2;
} elseif($checkques && $user['secques'] != '' && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {
$status = -3;
} else {
$status = $user['uid'];
}
$merge = $status != -1 && !$isuid && $_ENV['user']->check_mergeuser($username) ? 1 : 0;
return array($status, $user['username'], $password, $user['email'], $merge);
}


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

如果您的问题仍未解决,还可以加入服务器在线技术交流QQ群:8017413寻求帮助。


相关内容
最新热点内容
推荐内容