修正App类一处错误

This commit is contained in:
ThinkPHP
2013-04-20 16:25:52 +08:00
parent ef8434da54
commit ef82de8fa5

View File

@@ -1,233 +1,232 @@
<?php <?php
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | TOPThink [ WE CAN DO IT JUST THINK ] // | TOPThink [ WE CAN DO IT JUST THINK ]
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | Copyright (c) 2011 http://topthink.com All rights reserved. // | Copyright (c) 2011 http://topthink.com All rights reserved.
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com> // | Author: liu21st <liu21st@gmail.com>
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
namespace Think; namespace Think;
/** /**
* ThinkApp 应用管理 * ThinkApp 应用管理
* @author liu21st <liu21st@gmail.com> * @author liu21st <liu21st@gmail.com>
*/ */
class App { class App {
static private $config = []; static private $config = [];
/** /**
* 执行应用程序 * 执行应用程序
* @access public * @access public
* @return void * @return void
*/ */
static public function run() { static public function run() {
// 监听app_init // 监听app_init
Tag::listen('app_init'); Tag::listen('app_init');
// 加载全局初始化文件 // 加载全局初始化文件
if(is_file( APP_PATH . 'init' . EXT)) { if(is_file( APP_PATH . 'init' . EXT)) {
include APP_PATH . 'init' . EXT; include APP_PATH . 'init' . EXT;
$config = Config::get(); $config = Config::get();
}else{ }else{
// 检测项目(或模块)配置文件 // 检测项目(或模块)配置文件
if(is_file(APP_PATH . 'config' . EXT)) { if(is_file(APP_PATH . 'config' . EXT)) {
$config = Config::set(include APP_PATH . 'config' . EXT); $config = Config::set(include APP_PATH . 'config' . EXT);
} }
// 加载别名文件 // 加载别名文件
if(is_file(APP_PATH . 'alias' . EXT)) { if(is_file(APP_PATH . 'alias' . EXT)) {
Loader::addMap(include APP_PATH . 'alias' . EXT); Loader::addMap(include APP_PATH . 'alias' . EXT);
} }
// 加载公共文件 // 加载公共文件
if(is_file( APP_PATH . 'common' . EXT)) { if(is_file( APP_PATH . 'common' . EXT)) {
include APP_PATH . 'common' . EXT; include APP_PATH . 'common' . EXT;
} }
if(is_file(APP_PATH . 'tags' . EXT)) { if(is_file(APP_PATH . 'tags' . EXT)) {
// 行为扩展文件 // 行为扩展文件
Tag::import(include APP_PATH . 'tags' . EXT); Tag::import(include APP_PATH . 'tags' . EXT);
} }
} }
// 应用URL调度 // 应用URL调度
self::dispatch($config); self::dispatch($config);
// 执行操作 // 执行操作
$instance = Loader::controller(CONTROLLER_NAME); $instance = Loader::controller(CONTROLLER_NAME);
if(!$instance) { if(!$instance) {
E('[ ' . MODULE_NAME . '\\Controller\\' . parse_name(CONTROLLER_NAME, 1) . 'Controller ] not exists', 404); E('[ ' . MODULE_NAME . '\\Controller\\' . parse_name(CONTROLLER_NAME, 1) . 'Controller ] not exists', 404);
} }
// 获取当前操作名 // 获取当前操作名
$action = ACTION_NAME . $config['action_suffix']; $action = ACTION_NAME . $config['action_suffix'];
try{ try{
// 操作方法开始监听 // 操作方法开始监听
$call = [$instance, $action]; $call = [$instance, $action];
Tag::listen('action_begin', $call); Tag::listen('action_begin', $call);
if(!preg_match('/^[A-Za-z](\w)*$/', $action)){ if(!preg_match('/^[A-Za-z](\w)*$/', $action)){
// 非法操作 // 非法操作
throw new \ReflectionException(); throw new \ReflectionException();
} }
//执行当前操作 //执行当前操作
$method = new \ReflectionMethod($instance, $action); $method = new \ReflectionMethod($instance, $action);
if($method->isPublic()) { if($method->isPublic()) {
// URL参数绑定检测 // URL参数绑定检测
if($config['url_params_bind'] && $method->getNumberOfParameters() > 0){ if($config['url_params_bind'] && $method->getNumberOfParameters() > 0){
switch($_SERVER['REQUEST_METHOD']) { switch($_SERVER['REQUEST_METHOD']) {
case 'POST': case 'POST':
$vars = array_merge($_GET, $_POST); $vars = array_merge($_GET, $_POST);
break; break;
case 'PUT': case 'PUT':
parse_str(file_get_contents('php://input'), $vars); parse_str(file_get_contents('php://input'), $vars);
break; break;
default: default:
$vars = $_GET; $vars = $_GET;
} }
$params = $method->getParameters(); $params = $method->getParameters();
foreach ($params as $param){ foreach ($params as $param){
$name = $param->getName(); $name = $param->getName();
if(isset($vars[$name])) { if(isset($vars[$name])) {
$args[] = $vars[$name]; $args[] = $vars[$name];
}elseif($param->isDefaultValueAvailable()){ }elseif($param->isDefaultValueAvailable()){
$args[] = $param->getDefaultValue(); $args[] = $param->getDefaultValue();
}else{ }else{
E('_PARAM_ERROR_:' . $name); E('_PARAM_ERROR_:' . $name);
} }
} }
$method->invokeArgs($instance, $args); $method->invokeArgs($instance, $args);
}else{ }else{
$method->invoke($instance); $method->invoke($instance);
} }
// 操作方法执行完成监听 // 操作方法执行完成监听
Tag::listen('action_end', $call); Tag::listen('action_end', $call);
}else{ }else{
// 操作方法不是Public 抛出异常 // 操作方法不是Public 抛出异常
throw new \ReflectionException(); throw new \ReflectionException();
} }
} catch (\ReflectionException $e) { } catch (\ReflectionException $e) {
// 操作不存在 // 操作不存在
if(method_exists($instance, '_empty')) { if(method_exists($instance, '_empty')) {
$method = new \ReflectionMethod($instance, '_empty'); $method = new \ReflectionMethod($instance, '_empty');
$method->invokeArgs($instance, [$action, '']); $method->invokeArgs($instance, [$action, '']);
}else{ }else{
E('[ ' . (new \ReflectionClass($instance))->getName() . ':' . $action . ' ] not exists ', 404); E('[ ' . (new \ReflectionClass($instance))->getName() . ':' . $action . ' ] not exists ', 404);
} }
} }
// 监听app_end // 监听app_end
Tag::listen('app_end'); Tag::listen('app_end');
return ; return ;
} }
/** /**
* URL调度 * URL调度
* @access public * @access public
* @return void * @return void
*/ */
static public function dispatch($config) { static public function dispatch($config) {
$var_m = $config['var_module']; $var_m = $config['var_module'];
$var_c = $config['var_controller']; $var_c = $config['var_controller'];
$var_a = $config['var_action']; $var_a = $config['var_action'];
$var_p = $config['var_pathinfo']; $var_p = $config['var_pathinfo'];
if(isset($_GET[$var_p])) { // 判断URL里面是否有兼容模式参数 if(isset($_GET[$var_p])) { // 判断URL里面是否有兼容模式参数
$_SERVER['PATH_INFO'] = $_GET[$var_p]; $_SERVER['PATH_INFO'] = $_GET[$var_p];
unset($_GET[$var_p]); unset($_GET[$var_p]);
}elseif(IS_CLI){ // CLI模式下 index.php module/controller/action/params/... }elseif(IS_CLI){ // CLI模式下 index.php module/controller/action/params/...
$_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : '';
} }
// 检测子域名部署 // 检测子域名部署
if(!IS_CLI) { if(!IS_CLI) {
Route::checkDomain(); Route::checkDomain();
} }
// 监听path_info // 监听path_info
Tag::listen('path_info'); Tag::listen('path_info');
// 分析PATHINFO信息 // 分析PATHINFO信息
if(!isset($_SERVER['PATH_INFO']) && $_SERVER['SCRIPT_NAME'] != $_SERVER['PHP_SELF']) { if(!isset($_SERVER['PATH_INFO']) && $_SERVER['SCRIPT_NAME'] != $_SERVER['PHP_SELF']) {
$types = explode(',', $config['pathinfo_fetch']); $types = explode(',', $config['pathinfo_fetch']);
foreach ($types as $type){ foreach ($types as $type){
if(0 === strpos($type, ':')) {// 支持函数判断 if(0 === strpos($type, ':')) {// 支持函数判断
$_SERVER['PATH_INFO'] = call_user_func(substr($type,1)); $_SERVER['PATH_INFO'] = call_user_func(substr($type,1));
break; break;
}elseif(!empty($_SERVER[$type])) { }elseif(!empty($_SERVER[$type])) {
$_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ?
substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type];
break; break;
} }
} }
} }
// 定位模块 // 定位模块
if(empty($_SERVER['PATH_INFO'])) { if(empty($_SERVER['PATH_INFO'])) {
$_SERVER['PATH_INFO'] = ''; $_SERVER['PATH_INFO'] = '';
} }
// URL后缀 // URL后缀
define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'],PATHINFO_EXTENSION))); define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'],PATHINFO_EXTENSION)));
$_SERVER['PATH_INFO'] = trim(preg_replace('/\.(' . trim($config['url_html_suffix'], '.') . ')$/i', '', $_SERVER['PATH_INFO']), '/'); $_SERVER['PATH_INFO'] = trim(preg_replace('/\.(' . trim($config['url_html_suffix'], '.') . ')$/i', '', $_SERVER['PATH_INFO']), '/');
if($_SERVER['PATH_INFO']) { if($_SERVER['PATH_INFO']) {
$paths = explode($config['pathinfo_depr'], $_SERVER['PATH_INFO']); $paths = explode($config['pathinfo_depr'], $_SERVER['PATH_INFO']);
// 获取URL中的模块名 // 获取URL中的模块名
if($config['require_module'] && !isset($_GET[$var_m])) { if($config['require_module'] && !isset($_GET[$var_m])) {
$_GET[$var_m] = array_shift($paths); $_GET[$var_m] = array_shift($paths);
$_SERVER['PATH_INFO'] = implode('/', $paths); $_SERVER['PATH_INFO'] = implode('/', $paths);
} }
} }
// 获取模块名称 // 获取模块名称
define('MODULE_NAME', ucwords(strtolower(isset($_GET[$var_m]) ? $_GET[$var_m] : $config['default_module']))); define('MODULE_NAME', ucwords(strtolower(isset($_GET[$var_m]) ? $_GET[$var_m] : $config['default_module'])));
// 模块初始化 // 模块初始化
if(MODULE_NAME && is_dir( APP_PATH . MODULE_NAME )) { if(MODULE_NAME && is_dir( APP_PATH . MODULE_NAME )) {
define('MODULE_PATH', APP_PATH . MODULE_NAME . '/'); define('MODULE_PATH', APP_PATH . MODULE_NAME . '/');
Tag::listen('app_begin'); Tag::listen('app_begin');
// 加载模块初始化文件 // 加载模块初始化文件
if(is_file( MODULE_PATH . 'init' . EXT )) { if(is_file( MODULE_PATH . 'init' . EXT )) {
include MODULE_PATH . 'init' . EXT; include MODULE_PATH . 'init' . EXT;
$config = Config::get(); $config = Config::get();
}else{ }else{
// 检测项目(或模块)配置文件 // 检测项目(或模块)配置文件
if(is_file(MODULE_PATH . 'config' . EXT)) { if(is_file(MODULE_PATH . 'config' . EXT)) {
$config = Config::set(include MODULE_PATH . 'config' . EXT); $config = Config::set(include MODULE_PATH . 'config' . EXT);
} }
if($config['app_status'] && is_file(MODULE_PATH . $config['app_status'] . EXT)) { if($config['app_status'] && is_file(MODULE_PATH . $config['app_status'] . EXT)) {
// 加载对应的项目配置文件 // 加载对应的项目配置文件
$config = Config::set(include MODULE_PATH . $config['app_status'] . EXT); $config = Config::set(include MODULE_PATH . $config['app_status'] . EXT);
} }
// 加载别名文件 // 加载别名文件
if(is_file(MODULE_PATH . 'alias' . EXT)) { if(is_file(MODULE_PATH . 'alias' . EXT)) {
Loader::addMap(include MODULE_PATH . 'alias' . EXT); Loader::addMap(include MODULE_PATH . 'alias' . EXT);
} }
// 加载公共文件 // 加载公共文件
if(is_file( MODULE_PATH . 'common' . EXT)) { if(is_file( MODULE_PATH . 'common' . EXT)) {
include MODULE_PATH . 'common' . EXT; include MODULE_PATH . 'common' . EXT;
} }
if(is_file(MODULE_PATH . 'tags' . EXT)) { if(is_file(MODULE_PATH . 'tags' . EXT)) {
// 行为扩展文件 // 行为扩展文件
Tag::import(include MODULE_PATH . 'tags' . EXT); Tag::import(include MODULE_PATH . 'tags' . EXT);
} }
} }
$var_c = $config['var_controller']; $var_c = $config['var_controller'];
$var_a = $config['var_action']; $var_a = $config['var_action'];
}else{ }else{
// 判断favicon.ico // 判断favicon.ico
if('favicon.ico' == strtolower(MODULE_NAME)){ if('favicon.ico' == strtolower(MODULE_NAME)){
exit; exit;
} }
E('module not exists :' . MODULE_NAME);
throw new Exception('module not exists :' . MODULE_NAME, 404); }
} // 路由检测和控制器、操作解析
// 路由检测和控制器、操作解析 Route::check($_SERVER['PATH_INFO']);
Route::check($_SERVER['PATH_INFO']);
// 获取控制器名
// 获取控制器名 define('CONTROLLER_NAME', strtolower(isset($_GET[$var_c]) ? $_GET[$var_c] : $config['default_controller']));
define('CONTROLLER_NAME', strtolower(isset($_GET[$var_c]) ? $_GET[$var_c] : $config['default_controller']));
// 获取操作名
// 获取操作名 define('ACTION_NAME', strtolower(isset($_GET[$var_a]) ? $_GET[$var_a] : $config['default_action']));
define('ACTION_NAME', strtolower(isset($_GET[$var_a]) ? $_GET[$var_a] : $config['default_action']));
unset($_GET[$var_a], $_GET[$var_c], $_GET[$var_m]);
unset($_GET[$var_a], $_GET[$var_c], $_GET[$var_m]); //保证$_REQUEST正常取值
//保证$_REQUEST正常取值 $_REQUEST = array_merge($_POST, $_GET);
$_REQUEST = array_merge($_POST, $_GET); }
} }
}