WebjxCom提示:
PHP教程:UCenter的MVC架构.
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.requireUC_ROOT.RELEASE_ROOT.'model/base.php';
20.}else{
21.requireUC_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.includeUC_ROOT.RELEASE_ROOT."control/$m.php";
27.}else{
28.includeUC_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.echois_array($data)?$control->serialize($data,1):$data;
37.exit;
38.}elseif(method_exists($control,'_call')){//否则执行重载
39.$data=$control->_call('on'.$a,'');
40.echois_array($data)?$control->serialize($data,1):$data;
41.exit;
42.}else{
43.exit('Actionnotfound!');
44.}
45.}else{
46.exit('Modulenotfound!');
47.}
假定我们检测用户登录,那么对应的接口址就为:
xxx/index.php?m=user&a=login
这样,就会初始化usercontrol并调用onlogin方法,看看usercontrol的onlogin()
01.//部分代码,有所删减
02.classusercontrolextendsbase{
03.function__construct(){
04.$this->usercontrol();
05.}
06.functionusercontrol(){
07.parent::__construct();//执行基类构造函数
08.$this->load('user');//加载usermodel,base类的load方法首先从$_ENV环境变量中查找是否已设置$_ENV['user'],若未设置,则加载model/user.php,然后实例化该类并写入环境变量中,也就是此时,usermodel已经实例化了
。 09.}
10.functiononlogin(){
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.returnarray($status,$user['username'],$password,$user['email'],$merge);
37.}
model层直接与数据库交互,control层与model层交互,得到结果,返回给view
。 如果我们要扩展自己的方法该怎么办?
首先,增加model类,定义我们所需要的方法,直接与DB进行交互。
其次,增加control类,并继承自base,定义on{xxxx}方法,与相对的model交互,并返回结果