コード例 #1
0
ファイル: App.php プロジェクト: minowu/smartthink
 /**
  * 执行controller->action
  *
  * @return void
  */
 public static function exec()
 {
     // Controller name 安全过滤
     if (!preg_match('/^[A-Za-z](\\w)*$/', CONTROLLER_NAME)) {
         $module = false;
     } else {
         $module = Import::controller(GROUP_NAME, CONTROLLER_NAME);
     }
     // 执行空控制器
     try {
         if (!$module) {
             $module = Import::controller(GROUP_NAME, 'Empty');
             if (!$module) {
                 throw new Exception("Controller不存在,\"" . CONTROLLER_NAME . "\"");
             }
         }
     } catch (Exception $error) {
         Debug::output($error);
     }
     // 获取控制器操作名
     $action = ACTION_NAME;
     // 定义模板名称
     Config::set('TEMPLATE_NAME', THEME_PATH . CONTROLLER_NAME . '/' . $action . '.html');
     try {
         // Action name 安全过滤
         if (!preg_match('/^[A-Za-z](\\w)*$/', $action)) {
             throw new ReflectionException();
         }
         // 对当前控制器的方法执行操作映射
         $method = new ReflectionMethod($module, $action);
         // public方法
         if ($method->isPublic()) {
             // 映射执行
             $class = new ReflectionClass($module);
             // 前置操作
             if ($class->hasMethod('_before_' . $action)) {
                 $before = $class->getMethod('_before_' . $action);
                 // public并执行
                 if ($before->isPublic()) {
                     $before->invoke($module);
                 }
             }
             // URL参数绑定检测
             if (Config::get('URL_PARAMS_BIND') && $method->getNumberOfParameters() > 0) {
                 switch ($_SERVER['REQUEST_METHOD']) {
                     case 'POST':
                         $vars = $_POST;
                         break;
                     case 'PUT':
                         parse_str(file_get_contents('php://input'), $vars);
                         break;
                     default:
                         $vars = $_GET;
                 }
                 $params = $method->getParameters();
                 foreach ($params as $param) {
                     $name = $param->getName();
                     if (isset($vars[$name])) {
                         $args[] = $vars[$name];
                     } elseif ($param->isDefaultValueAvailable()) {
                         $args[] = $param->getDefaultValue();
                     } else {
                         Debug::throw_exception(L('_PARAM_ERROR_') . ':' . $name);
                     }
                 }
                 $method->invokeArgs($module, $args);
             } else {
                 $method->invoke($module);
             }
             // 后置操作
             if ($class->hasMethod('_after_' . $action)) {
                 $after = $class->getMethod('_after_' . $action);
                 // public并执行
                 if ($after->isPublic()) {
                     $after->invoke($module);
                 }
             }
         } else {
             throw new ReflectionException();
         }
     } catch (ReflectionException $e) {
         // 方法调用发生异常后 引导到__call方法处理
         $method = new ReflectionMethod($module, '__call');
         $method->invokeArgs($module, array($action, ''));
     }
 }
コード例 #2
0
ファイル: functions.php プロジェクト: minowu/smartthink
/**
 * 远程调用模块的操作方法 URL 参数格式 [项目://][分组/]模块/操作
 *
 * @param string $url 调用地址
 * @param string|array $vars 调用参数 支持字符串和数组 
 * @param string $layer 要调用的控制层名称
 *
 * @return mixed
 */
function R($url, $vars = array(), $layer = '')
{
    // 分析路径
    $info = pathinfo($url);
    $action = $info['basename'];
    $module = $info['dirname'];
    // 载入Controller
    $class = Import::controller(GROUP_NAME, $module);
    // 判断是否存在并执行
    if ($class) {
        if (is_string($vars)) {
            parse_str($vars, $vars);
        }
        return call_user_func_array(array(&$class, $action . C('ACTION_SUFFIX')), $vars);
    } else {
        return false;
    }
}