程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP入門知識 >> PHP教程:UCenter的MVC架構

PHP教程:UCenter的MVC架構

編輯:PHP入門知識

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交互,並返回結果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved