前言
本文主要给大家介绍的是关于Laravel路由模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
备注:本文是基于Laravel 5.4版本的路由模块代码进行分析书写;
模块组成
下图展示了路由模块中各个文件的关系,并进行简要说明;

剖析
服务提供者
看Laravel模块,首先找ServiceProvider文件,这是模块与IOC容器交互的入口,从这个文件,可以看出该模块提供向系统提供了哪些服务;
public function register() {
// 注册路由管理,提供路由注册,路由匹配的功能
$this->registerRouter();
// 注册 Url 生成器实例
$this->registerUrlGenerator();
// 注册跳转器
$this->registerRedirector();
// 绑定 PSR-7 请求实现到 ServerRequestInterface 接口
$this->registerPsrRequest();
// 绑定 PSR-7 Response 实现到 ResponseInterface 接口
$this->registerPsrResponse();
// 注册 ReponseFactory,提供各式各样的 Response,比如视图响应、Json响应、Jsonp响应、文件下载等
$this->registerResponseFactory();
}
路由管理
“路由管理”服务有以下元素需要了解:
['uses' => 'FooController@method', 'as' => 'name']这样的字符串;对于不同的表现形式,路由在执行时会调用不同的处理;注册流程
在项目启动后,会执行所有ServiceProvider的loadRoutes方法,也就是调用map方法,一般情况下map方法如下
public function map(Router $router){
require __DIR__.'/routes.php';
}
这时候,项目就会执行很多Route::get、Route::post、Route::group方法;
当遇到Route::group方法时,会实例化一个RouteGroup对象,put进Router管理类的路由组栈头部;而后当执行get、post这类具体的注册路由方法时,会把当前路由组栈中所有组的属性合并进新路由中,将新路由存储在RouteCollection这个大盒子里;当Route::group的Closure执行完毕时,会把头部的RouteGroup实例pull出去;
当执行Route::resource时,Router管理类会调用ResourceRegister类来完成批量注册路由;
对于 Router::get这类注册方法,Illuminate\Foudation\helpers提供了简写;
Router::get 简化成 get,Router::post 简化成 post,Router::put 简化成 put,Router::patch 简化成 patch,Router::delete 简化成 delete,Router::resource简化成 resource,至此,RouteCollection大盒子就存放了所有要注册的路由;
request 请求匹配流程
首先,request请求会经过Foundation/Http/Kernel的handle方法,在这个方法中,请求会执行以下语句
$this->router->dispatch($request)
这里的$this->router,就是Router管理类;dispatch方法如下
public function dispatch(Request $request) {
$this->currentRequest = $request;
return $this->dispatchToRoute($request);
}
public function dispatchToRoute(Request $request) {
// 根据请求的 url 找到匹配的路由
$route = $this->findRoute($request);
// 将路由绑定到请求上
$request->setRouteResolver(function () use ($route) {
return $route;
}
// 触发 RouteMatched 事件
$this->events->dispatch(new Events\RouteMatched($route, $request));
// 通过 Pipeline 流水线执行路由上绑定的中间件及对应的方法
$response = $this->runRouteWithinStack($route, $request);
// 根据 request 请求设置 response 的响应头
return $this->prepareResponse($request, $response);
}
1、根据请求找匹配的路由
laravel ORM 只开启created_at的几种方法总结下面小编就为大家分享一篇laravel ORM 只开启created_at的几种方法总结,具有很好的参考价值,希望对大家有所帮助。一
通过源码解析Laravel的依赖注入这篇文章主要给大家介绍了如何通过源码解析Laravel的依赖注入的相关资料,文中通过示例代码介绍的非常详细,对大
Laravel中unique和exists验证规则的优化详解这篇文章主要给大家介绍了关于Laravel中unique和exists验证规则的优化的相关资料,文中通过示例代码介绍的非常详细,
Laravel 5.5基于内置的Auth模块实现前后台登陆详解最近在使用laravel5.5,利用其实现了一个功能,下面分享给大家,这篇文章主要给大家介绍了关于Laravel 5.5基于内置的
源码分析 Laravel 重复执行同一个队列任务的原因laravel 的队列服务对各种不同的后台队列服务提供了统一的 API,下面这篇文章通过源码分析给大家介绍了关于 Larave
关于 Laravel Redis 多个进程同时取队列问题详解这篇文章主要给大家介绍了关于 Laravel Redis 多个进程同时取队列问题的相关资料,文中通过示例代码介绍的非常详细