【ThinkPHP】搞清楚Dispatcher这个类,URL路由就可以随心所欲

一般域名的风格有几种

这是后台访问的方式

www.xxx.com/index.php?m=admin&c=index&a=index&id=123&type=2

www.xxx.com/index.php/admin/index/index/id/123/type/2

www.xxx.com/admin/index/index?id=123&type=2

www.xxx.com/admin/index/index/id/123/type/2

当然有些人喜欢用其他入口文件,比如admin.php那就变成这样子

www.xxx.com/admin.php?m=admin&c=index&a=index&id=123&type=2

这是前台访问方式

www.xxx.com/index.php?m=home&c=index&a=index&id=123&type=2

www.xxx.com/index.php/home/index/index/id/123/type/2

www.xxx.com/home/index/index?id=123&type=2

www.xxx.com/home/index/index/id/123/type/2

tp默认模块就是home所以可以省略掉

(但是访问其他模块的还是要记得带上模块名,除非你用在其他入口文件去访问并且设置了绑定默认模块这样才能省略掉对应的模块名)

www.xxx.com/index/index/id/123

要开启伪静态URL模式,并且能自动识别路径信息path_info是否有模块路径,有就去模块下,没有就去默认模块下,这部分的逻辑全都写在了 ThinkDispatcher.class.php 下面

关键是这一段

$paths      =   explode($depr,__INFO__,2);

$allowList  =   C('MODULE_ALLOW_LIST'); // 允许的模块列表

$module     =   preg_replace('/\.' . __EXT__ . '$/i', '',$paths[0]);

如果没有允许模块数组的话,path_info第一个就是模块。
如果有,并且path_info第一个在数组里的话那么它就是模块,
否则path_info第一个就不是模块,那么用默认模块代替。

if( empty($allowList) || (is_array($allowList) && in_array_case($module, $allowList))){
    var_dump(empty($allowList));exit();
    $_GET[$varModule]       =   $module;
    $_SERVER['PATH_INFO']   =   isset($paths[1])?$paths[1]:'';
}

也就是说配置中设置了'MODULE_ALLOW_LIST' => array('Home', 'Admin'),

这样TP框架才知道去找哪些模块

这些都应该设置一下

'URL_CASE_INSENSITIVE' => TRUE,    //URL地址不区分大小写

'URL_MODEL' =>  1,    // URL访问模式,可选参数0、1、2、3,代表以下四种模式:// 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE  模式); 3 (兼容模式)  默认为PATHINFO 模式

URL要想省略入口文件index.php,必须有重定向文件.htaccess

  1. 服务器没有.htaccess重定向的话,www.xxx.com 会直接访问 www.xxx.com/index.php ,但是访问www.xxx.com/admin 会访问失败
  2. 服务器有.htaccess重定向的话,www.xxx.com/admin 就会访问 www.xxx.com/index.php/admin ,这样就有了path_info 路径信息
  3. 有的服务器没有这个** $_SERVER['PATH_INFO']** 怎么办?thinkphp的Dispatcher类会自动判断全局变量 $_SERVER 下的其他变量值
'URL_PATHINFO_FETCH'    =>  'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', // 用于兼容判断PATH_INFO 参数的SERVER替代变量列表,然后赋值给 $_SERVER['PATH_INFO'] ,这样你就有路径信息了
  1. 然后TP框架才能去分析路由信息

我来吐槽

*

*