Laravel 之路由匹配
前言
在阅读这篇文章之前,我希望你阅读了老司机带你实现 Laravel 之管道和老司机带你实现 Laravel 路由注册功能,还有老司机带你深入理解 Laravel 中间件(全局中间件),它们是阅读这篇文章的基础。
流程分析
废话不多说,咱们直接分析Laravel代码,上次我们分析Laravel全局的全局中间件,代码如下所示:
全局中间件运行完之后,会调用dispatchToRouter
方法返回的回调方法,我们看一下这个方法:
当前类Illuminate\Foundation\Http\Kernel
的$router
属性是Illuminate\Routing\Router
类的对象,下面我们看Illuminate\Routing\Router
类的dispatch
方法,如下:
继续调用dispatchToRoute
方法,如下:
我们今天的重点是findRoute
方法,也就是寻找路由。
Router
类的routes
属性是一个Illuminate\Routing\RouteCollection
类的实例,我们注册的所有路由都存储在这个类的实例中,下面我们进入到的Illuminate\Routing\RouteCollection
类的match
方法中,如下:
在下面的讲解中,我们以get请求为例,上面首先调用当前对象的get
方法,这个方法返回注册的所有的get请求路由,接下来调用matchAgainstRoutes
方法,这个方法有必要说一下:
在讲上面的代码之前,我要提到Laravel的回退路由,这是啥呢?Laravel官方的文档:Fallback Routes,我先截图如下:
关于回退路由的解释我上面说过了。回到matchAgainstRoutes
方法中,这个方法分为2部分,第一部分把所有的get路由分为2个容器,第一个容器只包含回退路由,第二个容器包含除去回退路由的所有get路由。第二部分把上面的2个容器合并,注意了此时的回退路由在所有get路由的的最后面。合并完之后遍历容器中的每一个路由,找到第一个符合规则的路由,上面的first
方法的每一个参数都是我们注册的路由对象,Laravel中的每一个路由对象都是Illuminate\Routing\Route
类的实例,下面我们进入到这个方法中:
首先调用compileRoute
方法,该方法如下:
这个方法会返回一个\Symfony\Component\Routing\CompiledRoute
类的对象,我们先来看一下Illuminate\Routing\RouteCompile
类的compile方法:
在上面的代码中,Laravel本身做的事情非常少,提取可选参数,并把可选参数,路由参数定义等信息传递给\Symfony\Component\Routing\CompiledRoute
类,剩下的事情就不管了,由于Laravel这里调用的是第三方组件Symfony
的代码,所以我们在这里暂不分析,你只需要知道这些就行(以后再给大家仔细分析),好了,经过上面的这些流程,我们返回到Illuminate\Routing\Route
类的matches
方法中,执行如下代码:
方法getValidators
返回了一个由Illuminate\Routing\Matching\ValidatorInterface
接口实例组成的实例数组:
我们任意分析一个,就以为例Illuminate\Routing\Matching\MethodValidator
类为例:
它的matches方法检测当前请求的方法是不是合法的请求方法,回到matches
方法中,如果所有的ValidatorInterface
返回为true,matches
方法才会返回true,否则为false。
其它的ValidatorInterface
都是一样的,不再详述。
总结
经过上面简要的分析,对于你弄懂Laravel的路由匹配已经足够了,祝您学习愉快。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: