📅  最后修改于: 2023-12-03 15:29:06.896000             🧑  作者: Mango
handleMatchedRoute
方法介绍handleMatchedRoute
是 Laravel 框架中的一个方法,其定义在 Illuminate\Routing\AbstractRouteCollection
类中。该方法的功能是处理已匹配的路由,将路由绑定到相应的控制器动作上执行。
protected function handleMatchedRoute($route, $request)
$route
:被匹配到的路由对象。$request
:HTTP 请求对象。该方法没有显式的返回值,但会执行路由对应的控制器方法,并返回其执行结果。
在应用程序启动时,Laravel 会将所有定义的路由都存储在一个路由集合中,路由集合会统一管理所有请求所匹配到的路由,以及路由所绑定的控制器动作。当有一个请求到达时,Laravel 会通过路由集合和请求中的 URI
,找到对应的路由,并执行其所绑定的控制器动作。
具体地,当某个路由与当前的请求 URI
匹配成功后,Laravel 会创建一个匹配到的路由对象,并将其交给 handleMatchedRoute
方法来处理。该方法的主要任务是将路由绑定到相应的控制器动作上执行。
handleMatchedRoute
方法首先会从路由对象中取出绑定的控制器和方法名,然后使用反射机制通过依赖注入获取到控制器对象,并执行指定的方法。同时,该方法还负责在控制器方法执行前后,执行一些前置和后置中间件。
最后,该方法会将控制器方法执行的结果返回给调用方,供进一步处理。
protected function handleMatchedRoute($route, $request)
以上是 handleMatchedRoute
方法的原型定义。该方法用于处理已匹配的路由,将路由绑定到相应的控制器动作上执行。
在具体实现中,该方法会从 $route
参数中获取路由绑定的控制器和方法名,并使用反射机制获取到控制器对象。然后将控制器对象的方法名称作为参数传入,通过 Laravel 的容器机制对依赖进行自动注入。
最后,该方法会执行控制器方法,并将执行结果返回。同时,该方法还会负责在控制器方法执行前后,执行一些前置和后置中间件,以确保请求的正确处理。
// 执行指定路由对应的控制器动作
$controller = $this->getController($route->getActionName());
$closure = function () use ($route, $controller, $request) {
return $controller(...array_values($this->resolveMethodDependencies(
$route->parametersWithoutNulls(), $controller, $route->getActionMethod()
)));
};
$response = $this->prepareResponse(
$request, $this->runRouteWithinStack($route, $request, $closure)
);
在上述代码片段中,$controller
变量保存了控制器对象,通过 ->getActionName()
方法获取到路由绑定的控制器名和方法名。$closure
是一个闭包函数,调用控制器方法,并将执行结果返回。
在执行控制器方法之前,$closure
函数会先调用 $this->resolveMethodDependencies()
方法,对依赖进行自动注入。然后执行控制器方法,并返回结果。
最后,$response
变量保存了正确处理结果,供进一步处理或输出。