Dispatcher.class.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. /**
  12. * ThinkPHP内置的Dispatcher类 用于精简模式
  13. * 完成URL解析、路由和调度
  14. * @category Think
  15. * @package Think
  16. * @subpackage Util
  17. * @author liu21st <liu21st@gmail.com>
  18. * @version $Id: Dispatcher.class.php 2702 2012-02-02 12:35:01Z liu21st $
  19. */
  20. class Dispatcher {
  21. /**
  22. * URL映射到控制器
  23. * @access public
  24. * @return void
  25. */
  26. static public function dispatch() {
  27. $urlMode = C('URL_MODEL');
  28. if($urlMode == URL_COMPAT || !empty($_GET[C('VAR_PATHINFO')])){
  29. // 兼容模式判断
  30. define('PHP_FILE',_PHP_FILE_.'?'.C('VAR_PATHINFO').'=');
  31. $_SERVER['PATH_INFO'] = $_GET[C('VAR_PATHINFO')];
  32. unset($_GET[C('VAR_PATHINFO')]);
  33. }elseif($urlMode == URL_REWRITE ) {
  34. //当前项目地址
  35. $url = dirname(_PHP_FILE_);
  36. if($url == '/' || $url == '\\')
  37. $url = '';
  38. define('PHP_FILE',$url);
  39. }else {
  40. //当前项目地址
  41. define('PHP_FILE',_PHP_FILE_);
  42. }
  43. // 分析PATHINFO信息
  44. tag('path_info');
  45. // 分析PATHINFO信息
  46. $depr = C('URL_PATHINFO_DEPR');
  47. if(!empty($_SERVER['PATH_INFO'])) {
  48. if(C('URL_HTML_SUFFIX') && !empty($_SERVER['PATH_INFO'])) {
  49. $_SERVER['PATH_INFO'] = preg_replace('/\.'.trim(C('URL_HTML_SUFFIX'),'.').'$/', '', $_SERVER['PATH_INFO']);
  50. }
  51. if(!self::routerCheck()){ // 检测路由规则 如果没有则按默认规则调度URL
  52. $paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
  53. $var = array();
  54. if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP')])){
  55. $var[C('VAR_GROUP')] = in_array(strtolower($paths[0]),explode(',',strtolower(C('APP_GROUP_LIST'))))? array_shift($paths) : '';
  56. }
  57. if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
  58. $var[C('VAR_MODULE')] = array_shift($paths);
  59. }
  60. $var[C('VAR_ACTION')] = array_shift($paths);
  61. // 解析剩余的URL参数
  62. $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
  63. $_GET = array_merge($var,$_GET);
  64. }
  65. }
  66. // 获取分组 模块和操作名称
  67. if (C('APP_GROUP_LIST')) {
  68. define('GROUP_NAME', self::getGroup(C('VAR_GROUP')));
  69. }
  70. define('MODULE_NAME',self::getModule(C('VAR_MODULE')));
  71. define('ACTION_NAME',self::getAction(C('VAR_ACTION')));
  72. // URL常量
  73. define('__SELF__',$_SERVER['REQUEST_URI']);
  74. // 当前项目地址
  75. define('__APP__',PHP_FILE);
  76. // 当前模块和分组地址
  77. $module = defined('P_MODULE_NAME')?P_MODULE_NAME:MODULE_NAME;
  78. if(defined('GROUP_NAME')) {
  79. $group = C('URL_CASE_INSENSITIVE') ?strtolower(GROUP_NAME):GROUP_NAME;
  80. define('__GROUP__', GROUP_NAME == C('DEFAULT_GROUP') ?__APP__ : __APP__.'/'.$group);
  81. define('__URL__', __GROUP__.$depr.$module);
  82. }else{
  83. define('__URL__',__APP__.'/'.$module);
  84. }
  85. // 当前操作地址
  86. define('__ACTION__',__URL__.$depr.ACTION_NAME);
  87. //保证$_REQUEST正常取值
  88. $_REQUEST = array_merge($_POST,$_GET);
  89. }
  90. /**
  91. * 路由检测
  92. * @access public
  93. * @return void
  94. */
  95. static public function routerCheck() {
  96. $return = false;
  97. // 路由检测标签
  98. tag('route_check',$return);
  99. return $return;
  100. }
  101. /**
  102. * 获得实际的模块名称
  103. * @access private
  104. * @return string
  105. */
  106. static private function getModule($var) {
  107. $module = (!empty($_GET[$var])? $_GET[$var]:C('DEFAULT_MODULE'));
  108. unset($_GET[$var]);
  109. if(C('URL_CASE_INSENSITIVE')) {
  110. // URL地址不区分大小写
  111. define('P_MODULE_NAME',strtolower($module));
  112. // 智能识别方式 index.php/user_type/index/ 识别到 UserTypeAction 模块
  113. $module = ucfirst(parse_name(P_MODULE_NAME,1));
  114. }
  115. return $module;
  116. }
  117. /**
  118. * 获得实际的操作名称
  119. * @access private
  120. * @return string
  121. */
  122. static private function getAction($var) {
  123. $action = !empty($_POST[$var]) ?
  124. $_POST[$var] :
  125. (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_ACTION'));
  126. unset($_POST[$var],$_GET[$var]);
  127. define('P_ACTION_NAME',$action);
  128. return C('URL_CASE_INSENSITIVE')?strtolower($action):$action;
  129. }
  130. /**
  131. * 获得实际的分组名称
  132. * @access private
  133. * @return string
  134. */
  135. static private function getGroup($var) {
  136. $group = (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_GROUP'));
  137. unset($_GET[$var]);
  138. return ucfirst(strtolower($group));
  139. }
  140. }