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交互,并返回结果。