/** * 执行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, '')); } }
/** * 远程调用模块的操作方法 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; } }