App.class.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2014 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. namespace Think;
  12. /**
  13. * ThinkPHP 应用程序类 执行应用过程管理
  14. */
  15. class App
  16. {
  17. /**
  18. * 应用程序初始化
  19. * @access public
  20. * @return void
  21. */
  22. public static function init()
  23. {
  24. // 日志目录转换为绝对路径 默认情况下存储到公共模块下面
  25. C('LOG_PATH', realpath(LOG_PATH) . '/Common/');
  26. // 定义当前请求的系统常量
  27. define('NOW_TIME', $_SERVER['REQUEST_TIME']);
  28. define('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
  29. define('IS_GET', REQUEST_METHOD == 'GET' ? true : false);
  30. define('IS_POST', REQUEST_METHOD == 'POST' ? true : false);
  31. define('IS_PUT', REQUEST_METHOD == 'PUT' ? true : false);
  32. define('IS_DELETE', REQUEST_METHOD == 'DELETE' ? true : false);
  33. // URL调度
  34. Dispatcher::dispatch();
  35. if (C('REQUEST_VARS_FILTER')) {
  36. // 全局安全过滤
  37. array_walk_recursive($_GET, 'think_filter');
  38. array_walk_recursive($_POST, 'think_filter');
  39. array_walk_recursive($_REQUEST, 'think_filter');
  40. }
  41. // URL调度结束标签
  42. Hook::listen('url_dispatch');
  43. define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false);
  44. // TMPL_EXCEPTION_FILE 改为绝对地址
  45. C('TMPL_EXCEPTION_FILE', realpath(C('TMPL_EXCEPTION_FILE')));
  46. return;
  47. }
  48. /**
  49. * 执行应用程序
  50. * @access public
  51. * @return void
  52. */
  53. public static function exec()
  54. {
  55. if (!preg_match('/^[A-Za-z](\/|\w)*$/', CONTROLLER_NAME)) {
  56. // 安全检测
  57. $module = false;
  58. } elseif (C('ACTION_BIND_CLASS')) {
  59. // 操作绑定到类:模块\Controller\控制器\操作
  60. $layer = C('DEFAULT_C_LAYER');
  61. if (is_dir(MODULE_PATH . $layer . '/' . CONTROLLER_NAME)) {
  62. $namespace = MODULE_NAME . '\\' . $layer . '\\' . CONTROLLER_NAME . '\\';
  63. } else {
  64. // 空控制器
  65. $namespace = MODULE_NAME . '\\' . $layer . '\\_empty\\';
  66. }
  67. $actionName = strtolower(ACTION_NAME);
  68. if (class_exists($namespace . $actionName)) {
  69. $class = $namespace . $actionName;
  70. } elseif (class_exists($namespace . '_empty')) {
  71. // 空操作
  72. $class = $namespace . '_empty';
  73. } else {
  74. E(L('_ERROR_ACTION_') . ':' . ACTION_NAME);
  75. }
  76. $module = new $class;
  77. // 操作绑定到类后 固定执行run入口
  78. $action = 'run';
  79. } else {
  80. //创建控制器实例
  81. $module = controller(CONTROLLER_NAME, CONTROLLER_PATH);
  82. }
  83. if (!$module) {
  84. if ('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) {
  85. header("Content-type:image/png");
  86. exit(base64_decode(App::logo()));
  87. }
  88. // 是否定义Empty控制器
  89. $module = A('Empty');
  90. if (!$module) {
  91. E(L('_CONTROLLER_NOT_EXIST_') . ':' . CONTROLLER_NAME);
  92. }
  93. }
  94. // 获取当前操作名 支持动态路由
  95. if (!isset($action)) {
  96. $action = ACTION_NAME . C('ACTION_SUFFIX');
  97. }
  98. try {
  99. self::invokeAction($module, $action);
  100. } catch (\ReflectionException $e) {
  101. // 方法调用发生异常后 引导到__call方法处理
  102. $method = new \ReflectionMethod($module, '__call');
  103. $method->invokeArgs($module, array($action, ''));
  104. }
  105. return;
  106. }
  107. public static function invokeAction($module, $action)
  108. {
  109. if (!preg_match('/^[A-Za-z](\w)*$/', $action)) {
  110. // 非法操作
  111. throw new \ReflectionException();
  112. }
  113. //执行当前操作
  114. $method = new \ReflectionMethod($module, $action);
  115. if ($method->isPublic() && !$method->isStatic()) {
  116. $class = new \ReflectionClass($module);
  117. // 前置操作
  118. if ($class->hasMethod('_before_' . $action)) {
  119. $before = $class->getMethod('_before_' . $action);
  120. if ($before->isPublic()) {
  121. $before->invoke($module);
  122. }
  123. }
  124. // URL参数绑定检测
  125. if ($method->getNumberOfParameters() > 0 && C('URL_PARAMS_BIND')) {
  126. switch ($_SERVER['REQUEST_METHOD']) {
  127. case 'POST':
  128. $vars = array_merge($_GET, $_POST);
  129. break;
  130. case 'PUT':
  131. parse_str(file_get_contents('php://input'), $vars);
  132. break;
  133. default:
  134. $vars = $_GET;
  135. }
  136. $params = $method->getParameters();
  137. $paramsBindType = C('URL_PARAMS_BIND_TYPE');
  138. foreach ($params as $param) {
  139. $name = $param->getName();
  140. if (1 == $paramsBindType && !empty($vars)) {
  141. $args[] = array_shift($vars);
  142. } elseif (0 == $paramsBindType && isset($vars[$name])) {
  143. $args[] = $vars[$name];
  144. } elseif ($param->isDefaultValueAvailable()) {
  145. $args[] = $param->getDefaultValue();
  146. } else {
  147. E(L('_PARAM_ERROR_') . ':' . $name);
  148. }
  149. }
  150. // 开启绑定参数过滤机制
  151. if (C('URL_PARAMS_FILTER')) {
  152. $filters = C('URL_PARAMS_FILTER_TYPE') ?: C('DEFAULT_FILTER');
  153. if ($filters) {
  154. $filters = explode(',', $filters);
  155. foreach ($filters as $filter) {
  156. $args = array_map_recursive($filter, $args); // 参数过滤
  157. }
  158. }
  159. }
  160. array_walk_recursive($args, 'think_filter');
  161. $method->invokeArgs($module, $args);
  162. } else {
  163. $method->invoke($module);
  164. }
  165. // 后置操作
  166. if ($class->hasMethod('_after_' . $action)) {
  167. $after = $class->getMethod('_after_' . $action);
  168. if ($after->isPublic()) {
  169. $after->invoke($module);
  170. }
  171. }
  172. } else {
  173. // 操作方法不是Public 抛出异常
  174. throw new \ReflectionException();
  175. }
  176. }
  177. /**
  178. * 运行应用实例 入口文件使用的快捷方法
  179. * @access public
  180. * @return void
  181. */
  182. public static function run()
  183. {
  184. // 加载动态应用公共文件和配置
  185. load_ext_file(COMMON_PATH);
  186. // 应用初始化标签
  187. Hook::listen('app_init');
  188. App::init();
  189. // 应用开始标签
  190. Hook::listen('app_begin');
  191. // Session初始化
  192. if (!IS_CLI) {
  193. session(C('SESSION_OPTIONS'));
  194. }
  195. // 记录应用初始化时间
  196. G('initTime');
  197. App::exec();
  198. // 应用结束标签
  199. Hook::listen('app_end');
  200. return;
  201. }
  202. public static function logo()
  203. {
  204. return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/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';
  205. }
  206. }