示例#1
0
 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']);
     }
 }
示例#2
0
 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, '']);
     }
 }