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