📌  相关文章
📜  "handleMatchedRoute", "class": "Illuminate\\Routing\\AbstractRouteCollection (1)

📅  最后修改于: 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 变量保存了正确处理结果,供进一步处理或输出。