Laravel由执行代码展示protectedfunctionrunRouteWithinStack(Route$route,Request$request){$shouldSkipMiddleware=$this->container->bound('middleware.disable')&&$this->container->make('middleware.disable')===真;$middleware=$shouldSkipMiddleware?[]:$this->gatherRouteMiddleware($route);return(newPipeline($this->container))->send($request)->through($middleware)->then(function($request)使用($route){return$this->prepareResponse($request,$route->run());});}publicfunctionrun(){$this->container=$this->container?:newContainer;try{//控制器形式(Controller@Method)if($this->isControllerAction()){return$this->runController();}//匹名函数格式返回$this->runCallable();}catch(HttpResponseException$e){返回$e->getResponse();}}控制器形式处理受保护函数runController(){return(newControllerDispatcher($this->container))->dispatch($this,$this->getController(),$this->getControllerMethod());}public函数getController(){$class=$this->parseControllerCallback()[0];如果(!$this->controller){$this->controller=$this->container->make($class);}return$this->controller;}受保护函数getControllerMethod(){return$this->parseControllerCallback()[1];}受保护函数parseControllerCallback(){returnStr::parseCallback($this->action['uses']);}publicstaticfunctionparseCallback($callback,$default=null){returnstatic::contains($callback,'@')?explode('@',$callback,2):[$callback,$default];}//Illuminate\Routing\ControllerDispatcherpublic函数__construct(Concontainer$container){$this->container=$container;}publicfunctiondispatch(Route$route,$controller,$method){//控制器参数解析$parameters=$this->resolveClassMethodDependencies($route->parametersWithoutNulls(),$控制器,$方法);如果(method_exists($controller,'callAction')){return$controller->callAction($method,$parameters);}return$controller->{$method}(...array_values($parameters));}publicfunctionparametersWithoutNulls(){//返回从路径或主机名解析出来的过滤后的参数数组,类似['post'=>1,'comment'=>2]returnarray_filter($this->parameters(),function($p){return!is_null($p);});}受保护函数resolveClassMethodDependencies(array$parameters,$instance,$method){//__invoke调用方式if(!method_exists($instance,$method)){return$parameters;}return$this->resolveMethodDependencies($parameters,newReflectionMethod($instance,$method));}//控制器方法可以有自己的类类型参数,不同于路由参数,其他参数只能从路由中获取$实例数=0;$values=array_values($parameters);foreach($reflector->getParameters()as$key=>$parameter){//类方法自身的类类型参数,尝试实例化$instance=$this->transformDependency($parameter,$parameters);如果(!is_null($instance)){$instanceCount++;$结果[]=$实例;}else{//按照类方法的参数顺序存储数据$results[]=isset($values[$key-$instanceCount])?$values[$key-$instanceCount]:$parameter->getDefaultValue();}}return$results;}受保护函数transformDependency(ReflectionParameter$parameter,$parameters){$class=$parameter->getClass();//如果类类型没有被实例化,通过服务容器解析参数的依赖,并实例化if($class&&!$this->alreadyInParameters($class->name,$parameters)){返回$this->container->make($class->name);}}受保护函数alreadyInParameters($class,array$parameters){返回!is_null(Arr::first($parameters,function($value)use($class){return$valueinstanceof$class;}));}publicfunctioncallAction($method,$parameters){returncall_user_func_array([$this,$method],$parameters);}总结:主要是将路由得到的参数依次对应到controller方法的参数上。当然controller方法可以有自己的类类型参数匿名函数处理protectedfunctionrunCallable(){$callable=$this->action['uses'];//同样的处理return$callable(...array_values($this->resolveMethodDependencies($this->parametersWithoutNulls(),newReflectionFunction($this->action['uses']))));}Return就是返回控制器的
