码迷,mamicode.com
首页 > Web开发 > 详细

Thinkphp路由源码分析

时间:2016-04-30 08:53:33      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

   摘要:把$_SERVER[‘PATH_INFO‘]字符串按照配置的URL_PATHINFO_DEPR进行切分,区分出模块/控制器/方法 

  在lnmp环境下部署tp项目时,按照网上某资料nginx的配置文件修改了三个参数:PATH_INFO,SCRIPT_NAME,SCRIPT_FILENAME,系统已经可以正常运行。但是为什么不修改request_uri等其他参数呢?是不是这些参数没影响tp的路由策略?(注意:通过rewrite方式访问时,request_uri没有index.php这一部分)

  带着这些疑问,我分析了tp的源码,发现在路由解析这一部分主要依赖$_SERVER[‘PATH_INFO‘]参数,另外两个参数在其他地方用到了,暂且不谈!从入口文件一直跟踪到Dispatcher::dispatch方法

/index.php==>/ThinkPHP/ThinkPHP.php==>/ThinkPHP/Library/Think/Think.clas.php/(run)==>ThinkPHP/Library/Think/App.class.php(init)==>

ThinkPHP/Library/Think/Dispatcher.class.php(dispatch)

  下面是一些重点分析:

/*********************   获取控制器  *****************************/
define(‘__INFO__‘, trim($_SERVER[‘PATH_INFO‘], ‘/‘));//!!$_SERVER[‘PATH_INFO‘]出现了
// URL后缀
define(‘__EXT__‘, strtolower(pathinfo($_SERVER[‘PATH_INFO‘], PATHINFO_EXTENSION)));
$_SERVER[‘PATH_INFO‘] = __INFO__;
if (!defined(‘BIND_MODULE‘) && (!C(‘URL_ROUTER_ON‘) || !Route::check())) {
    if (__INFO__ && C(‘MULTI_MODULE‘)) { // 获取模块名
        $paths = explode($depr, __INFO__, 2);
        $allowList = C(‘MODULE_ALLOW_LIST‘); // 允许的模块列表
        $module = preg_replace(‘/\.‘ . __EXT__ . ‘$/i‘, ‘‘, $paths[0]);
        if (empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))) {
            $_GET[$varModule] = $module;                //!!!重新設置$_GET[‘m‘]=module_name
            $_SERVER[‘PATH_INFO‘] = isset($paths[1]) ? $paths[1] : ‘‘;//!!!此时的$_SERVER[‘PATH_INFO‘]已经去掉了控制器所在的那一部分
        }
    }
}
/****************** 获取控制器和动作 ************************/
$depr   =   C(‘URL_PATHINFO_DEPR‘);
$paths = explode($depr,trim($_SERVER[‘PATH_INFO‘],$depr));
if(!defined(‘BIND_CONTROLLER‘)) {// 获取控制器
if(C(‘CONTROLLER_LEVEL‘)>1){// 控制器层次
$_GET[$varController] = implode(‘/‘,array_slice($paths,0,C(‘CONTROLLER_LEVEL‘)));
$paths = array_slice($paths, C(‘CONTROLLER_LEVEL‘));
}else{
$_GET[$varController] = array_shift($paths);//!!!获取控制器
}
}
// 获取操作
if(!defined(‘BIND_ACTION‘)){
$_GET[$varAction] = array_shift($paths);//!!!获取方法
}
// 获取控制器和操作名
define(‘CONTROLLER_NAME‘, defined(‘BIND_CONTROLLER‘)? BIND_CONTROLLER : self::getController($varController,$urlCase));
define(‘ACTION_NAME‘, defined(‘BIND_ACTION‘)? BIND_ACTION : self::getAction($varAction,$urlCase));

Thinkphp路由源码分析

标签:

原文地址:http://www.cnblogs.com/xueleixi/p/5448067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!