• 【转】UCenter的MVC架构


    UCenter是采用很经典的MVC架构

    UCenter采用index.php单点入口

    $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!'); 
    } 

    假定我们检测用户登录,那么对应的接口址就为:
    xxx/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方法从数据库中获取该用户的实例 
            } 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{xxxx}方法,与相对的model交互,并返回结果。

  • 相关阅读:
    Thinkphp6笔记十八:默认分页2
    Thinkphp6笔记十八:默认分页1
    Thinkphp6笔记十七:模板标签使用
    Thinkphp6笔记十六:IP黑名单
    Thinkphp6笔记十五:模板路径自定义配置
    Thinkphp6笔记十四:Redis配置
    Thinkphp6笔记十三:验证器(模型验证)
    Thinkphp6笔记十三:验证器(场景验证)
    Thinkphp6笔记十三:验证器(控制器验证)
    Thinkphp6笔记十二:多数据库配置
  • 原文地址:https://www.cnblogs.com/liuweitoo/p/2606234.html
Copyright © 2020-2023  润新知