public function exec($key) { //匿名函数 if ($this->route[$key]['callback'] instanceof Closure) { //反射分析闭包 $reflectionFunction = new \ReflectionFunction($this->route[$key]['callback']); $gets = $this->route[$key]['get']; $args = []; foreach ($reflectionFunction->getParameters() as $k => $p) { if (isset($gets[$p->name])) { //如果GET变量中存在则将GET变量值赋予,也就是说GET优先级高 $args[$p->name] = $gets[$p->name]; } else { //如果类型为类时分析类 if ($dependency = $p->getClass()) { $args[$p->name] = App::build($dependency->name); } else { //普通参数时获取默认值 $args[$p->name] = App::resolveNonClass($p); } } } echo $reflectionFunction->invokeArgs($args); } else { //设置控制器与方法 Request::set('get.' . c('http.url_var'), $this->route[$key]['callback']); Controller::run($this->route[$key]['get']); } }
private static function action() { //禁止使用模块检测 if (in_array(MODULE, C('http.deny_module'))) { throw new Exception("模块禁止访问"); } $class = 'app\\' . MODULE . '\\controller\\' . CONTROLLER; //控制器不存在 if (!class_exists($class)) { throw new Exception("{$class} 不存在"); } $controller = App::make($class, true); //执行控制器中间件 Middleware::controller(); //执行动作 try { /** * 参数处理 * 控制器路由方式访问时解析路由参数并注入到控制器方法参数中 */ //反射方法实例 $reflectionMethod = new \ReflectionMethod($class, ACTION); $args = []; foreach ($reflectionMethod->getParameters() as $k => $p) { if (isset(self::$routeArgs[$p->name])) { //如果GET变量中存在则将GET变量值赋予,也就是说GET优先级高 $args[$p->name] = self::$routeArgs[$p->name]; } else { //如果类型为类时分析类 if ($dependency = $p->getClass()) { $args[$p->name] = App::build($dependency->name); } else { //普通参数时获取默认值 $args[$p->name] = App::resolveNonClass($p); } } } //执行控制器方法 $result = $reflectionMethod->invokeArgs($controller, $args); if (IS_AJAX && is_array($result)) { ajax($result); } else { echo $result; } } catch (ReflectionException $e) { $action = new ReflectionMethod($controller, '__call'); $action->invokeArgs($controller, [ACTION, '']); } }