App.class.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /**
  3. * 洛阳赤炎鹰网络科技有限公司
  4. * https://www.cyyvip.com
  5. * Copyright (c) 2022 赤店商城 All rights reserved.
  6. */
  7. // +----------------------------------------------------------------------
  8. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  9. // +----------------------------------------------------------------------
  10. // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
  11. // +----------------------------------------------------------------------
  12. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  13. // +----------------------------------------------------------------------
  14. // | Author: liu21st <liu21st@gmail.com>
  15. // +----------------------------------------------------------------------
  16. namespace Think;
  17. /**
  18. * ThinkPHP API模式 应用程序类
  19. */
  20. class App {
  21. /**
  22. * 应用程序初始化
  23. * @access public
  24. * @return void
  25. */
  26. static public function init() {
  27. // 定义当前请求的系统常量
  28. define('NOW_TIME', $_SERVER['REQUEST_TIME']);
  29. define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']);
  30. define('IS_GET', REQUEST_METHOD =='GET' ? true : false);
  31. define('IS_POST', REQUEST_METHOD =='POST' ? true : false);
  32. define('IS_PUT', REQUEST_METHOD =='PUT' ? true : false);
  33. define('IS_DELETE', REQUEST_METHOD =='DELETE' ? true : false);
  34. 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);
  35. // URL调度
  36. Dispatcher::dispatch();
  37. if(C('REQUEST_VARS_FILTER')){
  38. // 全局安全过滤
  39. array_walk_recursive($_GET, 'think_filter');
  40. array_walk_recursive($_POST, 'think_filter');
  41. array_walk_recursive($_REQUEST, 'think_filter');
  42. }
  43. // 日志目录转换为绝对路径
  44. C('LOG_PATH',realpath(LOG_PATH).'/');
  45. // TMPL_EXCEPTION_FILE 改为绝对地址
  46. C('TMPL_EXCEPTION_FILE',realpath(C('TMPL_EXCEPTION_FILE')));
  47. return ;
  48. }
  49. /**
  50. * 执行应用程序
  51. * @access public
  52. * @return void
  53. */
  54. static public function exec() {
  55. if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ // 安全检测
  56. $module = false;
  57. }else{
  58. //创建控制器实例
  59. $module = A(CONTROLLER_NAME);
  60. }
  61. if(!$module) {
  62. // 是否定义Empty控制器
  63. $module = A('Empty');
  64. if(!$module){
  65. E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME);
  66. }
  67. }
  68. // 获取当前操作名 支持动态路由
  69. $action = ACTION_NAME;
  70. try{
  71. if(!preg_match('/^[A-Za-z](\w)*$/',$action)){
  72. // 非法操作
  73. throw new \ReflectionException();
  74. }
  75. //执行当前操作
  76. $method = new \ReflectionMethod($module, $action);
  77. if($method->isPublic() && !$method->isStatic()) {
  78. $class = new \ReflectionClass($module);
  79. // URL参数绑定检测
  80. if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
  81. switch($_SERVER['REQUEST_METHOD']) {
  82. case 'POST':
  83. $vars = array_merge($_GET,$_POST);
  84. break;
  85. case 'PUT':
  86. parse_str(file_get_contents('php://input'), $vars);
  87. break;
  88. default:
  89. $vars = $_GET;
  90. }
  91. $params = $method->getParameters();
  92. $paramsBindType = C('URL_PARAMS_BIND_TYPE');
  93. foreach ($params as $param){
  94. $name = $param->getName();
  95. if( 1 == $paramsBindType && !empty($vars) ){
  96. $args[] = array_shift($vars);
  97. }elseif( 0 == $paramsBindType && isset($vars[$name])){
  98. $args[] = $vars[$name];
  99. }elseif($param->isDefaultValueAvailable()){
  100. $args[] = $param->getDefaultValue();
  101. }else{
  102. E(L('_PARAM_ERROR_').':'.$name);
  103. }
  104. }
  105. array_walk_recursive($args,'think_filter');
  106. $method->invokeArgs($module,$args);
  107. }else{
  108. $method->invoke($module);
  109. }
  110. }else{
  111. // 操作方法不是Public 抛出异常
  112. throw new \ReflectionException();
  113. }
  114. } catch (\ReflectionException $e) {
  115. // 方法调用发生异常后 引导到__call方法处理
  116. $method = new \ReflectionMethod($module,'__call');
  117. $method->invokeArgs($module,array($action,''));
  118. }
  119. return ;
  120. }
  121. /**
  122. * 运行应用实例 入口文件使用的快捷方法
  123. * @access public
  124. * @return void
  125. */
  126. static public function run() {
  127. App::init();
  128. // Session初始化
  129. if(!IS_CLI){
  130. session(C('SESSION_OPTIONS'));
  131. }
  132. // 记录应用初始化时间
  133. G('initTime');
  134. App::exec();
  135. return ;
  136. }
  137. }