| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: liu21st <liu21st@gmail.com>
- // +----------------------------------------------------------------------
- namespace Think;
- /**
- * ThinkPHP 应用程序类 执行应用过程管理
- */
- class App
- {
- /**
- * 应用程序初始化
- * @access public
- * @return void
- */
- public static function init()
- {
- // 日志目录转换为绝对路径 默认情况下存储到公共模块下面
- C('LOG_PATH', realpath(LOG_PATH) . '/Common/');
- // 定义当前请求的系统常量
- define('NOW_TIME', $_SERVER['REQUEST_TIME']);
- define('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
- define('IS_GET', REQUEST_METHOD == 'GET' ? true : false);
- define('IS_POST', REQUEST_METHOD == 'POST' ? true : false);
- define('IS_PUT', REQUEST_METHOD == 'PUT' ? true : false);
- define('IS_DELETE', REQUEST_METHOD == 'DELETE' ? true : false);
- // URL调度
- Dispatcher::dispatch();
- if (C('REQUEST_VARS_FILTER')) {
- // 全局安全过滤
- array_walk_recursive($_GET, 'think_filter');
- array_walk_recursive($_POST, 'think_filter');
- array_walk_recursive($_REQUEST, 'think_filter');
- }
- 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);
- // TMPL_EXCEPTION_FILE 改为绝对地址
- C('TMPL_EXCEPTION_FILE', realpath(C('TMPL_EXCEPTION_FILE')));
- return;
- }
- /**
- * 执行应用程序
- * @access public
- * @return void
- */
- public static function exec()
- {
- if (!preg_match('/^[A-Za-z](\/|\w)*$/', CONTROLLER_NAME)) {
- // 安全检测
- $module = false;
- } else {
- //创建控制器实例
- $module = controller(CONTROLLER_NAME);
- }
- if (!$module) {
- // 是否定义Empty控制器
- $module = A('Empty');
- if (!$module) {
- E(L('_CONTROLLER_NOT_EXIST_') . ':' . CONTROLLER_NAME);
- }
- }
- // 获取当前操作名 支持动态路由
- $action = ACTION_NAME . C('ACTION_SUFFIX');
- try {
- if (!preg_match('/^[A-Za-z](\w)*$/', $action)) {
- // 非法操作
- throw new \ReflectionException();
- }
- //执行当前操作
- $method = new \ReflectionMethod($module, $action);
- if ($method->isPublic() && !$method->isStatic()) {
- $class = new \ReflectionClass($module);
- // URL参数绑定检测
- if ($method->getNumberOfParameters() > 0 && C('URL_PARAMS_BIND')) {
- switch ($_SERVER['REQUEST_METHOD']) {
- case 'POST':
- $vars = array_merge($_GET, $_POST);
- break;
- case 'PUT':
- parse_str(file_get_contents('php://input'), $vars);
- break;
- default:
- $vars = $_GET;
- }
- $params = $method->getParameters();
- $paramsBindType = C('URL_PARAMS_BIND_TYPE');
- foreach ($params as $param) {
- $name = $param->getName();
- if (1 == $paramsBindType && !empty($vars)) {
- $args[] = array_shift($vars);
- } elseif (0 == $paramsBindType && isset($vars[$name])) {
- $args[] = $vars[$name];
- } elseif ($param->isDefaultValueAvailable()) {
- $args[] = $param->getDefaultValue();
- } else {
- E(L('_PARAM_ERROR_') . ':' . $name);
- }
- }
- // 开启绑定参数过滤机制
- if (C('URL_PARAMS_SAFE')) {
- $filters = C('URL_PARAMS_FILTER') ?: C('DEFAULT_FILTER');
- if ($filters) {
- $filters = explode(',', $filters);
- foreach ($filters as $filter) {
- $args = array_map_recursive($filter, $args); // 参数过滤
- }
- }
- }
- array_walk_recursive($args, 'think_filter');
- $method->invokeArgs($module, $args);
- } else {
- $method->invoke($module);
- }
- } else {
- // 操作方法不是Public 抛出异常
- throw new \ReflectionException();
- }
- } catch (\ReflectionException $e) {
- // 方法调用发生异常后 引导到__call方法处理
- $method = new \ReflectionMethod($module, '__call');
- $method->invokeArgs($module, array($action, ''));
- }
- return;
- }
- /**
- * 运行应用实例 入口文件使用的快捷方法
- * @access public
- * @return void
- */
- public static function run()
- {
- App::init();
- // Session初始化
- if (!IS_CLI) {
- session(C('SESSION_OPTIONS'));
- }
- // 记录应用初始化时间
- G('initTime');
- App::exec();
- return;
- }
- }
|