需求最近由于业务功能需要,需要根据请求路径匹配路由(如admin/auth/menu/46/edit)和请求方法(比如GET)记录在数据库Instance中,拿到路由实例之后再做一些其他的事情。解析其实就是路由的核心功能(将一类请求映射到一个回调类型的变量)。框架本身的功能,源码搜索由以下代码块实现://Illuminate/Routing/RouteCollection.phppublicfunctionmatch(Request$request){//1.获取路由集合$routes=$this->get($请求->getMethod());//2.匹配路由$route=$this->matchAgainstRoutes($routes,$request);返回$this->handleMatchedRoute($request,$route);}//Illuminate/Routing/AbstractRouteCollection.phpprotectedfunctionmatchAgainstRoutes(array$routes,$request,$includingMethod=true){[$fallbacks,$routes]=collect($routes)->partition(function($route){return$route->isFallback;});return$routes->merge($fallbacks)->first(function(Route$route)use($request,$includingMethod){//3.遍历匹配return$route->matches($request,$includingMethod);});}//Illuminate/Routing/Route.php公共函数matches(Request$request,$includingMethod=true){$this->compileRoute();foreach($this->getValidators()as$validator){//4.遍历validator验证匹配if(!$includingMethod&&$validatorinstanceofMethodValidator){continue;}if(!$validator->matches($this,$request)){返回false;}}returntrue;}code大概的逻辑是:遍历路由集合,将当前请求丢给UriValidator、MethodValidator、SchemeValidator、HostValidator四个验证器一一验证是否匹配。validator主要是校验匹配请求对象的pathInfo、method、scheme、host信息,所以只需要修改当前请求对象的信息丢给上面的matches方法就可以实现我需要的功能了。由于是同一个项目实现,所以scheme和host与当前请求一致,没有修改。但是pathInfo和method是两个私有属性,没有找到写权限对应的方法。所以实现一个能够写属性的宏方法就足够了。最终代码如下:{$property}=$value;返回$这个;};}/***配置路由*/publicfunctionmatchRoute():callable{returnfunction($includingMethod=true){//1.获取路由集合/*@var\Illuminate\Routing\RouteCollection$routeCollection*/$routeCollection=应用程序(路由器::类)->getRoutes();/**@var\Illuminate\Http\Request$this*/$routes=is_null($th是->方法())?$routeCollection->getRoutes():Arr::get($routeCollection->getRoutesByMethod(),$this->method(),[]);[$fallbacks,$routes]=collect($routes)->partition(function($route){return$route->isFallback;});return$routes->merge($fallbacks)->first(function(Route$route)use($includingMethod){//2.遍历配对return$route->matches($this,$includingMethod);});};}}注册请求宏//App\Providers\AppServiceProviderpublicfunctionregister(){Request::mixin($this->app->make(RequestMacro::class));}使用示例$route=request()->propertyAware('pathInfo',\Illuminate\Support\Str::start('admin/auth/menu/46/edit','/'))->propertyAware('method','GET')->matchRoute();dump($route);原链接https://www.guanguans.cn
