Laravel学习教程之路由模块
前言本文主要给大家介绍的是关于Laravel路由模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 备注:本文是基于Laravel 5.4版本的路由模块代码进行分析书写; 模块组成下图展示了路由模块中各个文件的关系,并进行简要说明; 剖析服务提供者看Laravel模块,首先找ServiceProvider文件,这是模块与IOC容器交互的入口,从这个文件,可以看出该模块提供向系统提供了哪些服务; registerRouter();
// 注册 Url 生成器实例
$this->registerUrlGenerator();
// 注册跳转器
$this->registerRedirector();
// 绑定 PSR-7 请求实现到 ServerRequestInterface 接口
$this->registerPsrRequest();
// 绑定 PSR-7 Response 实现到 ResponseInterface 接口
$this->registerPsrResponse();
// 注册 ReponseFactory,提供各式各样的 Response,比如视图响应、Json响应、Jsonp响应、文件下载等
$this->registerResponseFactory();
}
路由管理“路由管理”服务有以下元素需要了解:
注册流程在项目启动后,会执行所有ServiceProvider的loadRoutes方法,也就是调用map方法,一般情况下map方法如下 这时候,项目就会执行很多 当遇到Route::group方法时,会实例化一个RouteGroup对象,put进Router管理类的路由组栈头部;而后当执行get、post这类具体的注册路由方法时,会把当前路由组栈中所有组的属性合并进新路由中,将新路由存储在RouteCollection这个大盒子里;当Route::group的Closure执行完毕时,会把头部的RouteGroup实例pull出去; 当执行Route::resource时,Router管理类会调用ResourceRegister类来完成批量注册路由; 对于 Router::get这类注册方法,IlluminateFoudationhelpers提供了简写;
至此,RouteCollection大盒子就存放了所有要注册的路由; request 请求匹配流程首先,request请求会经过Foundation/Http/Kernel的handle方法,在这个方法中,请求会执行以下语句 router->dispatch($request)
这里的 currentRequest = $request;
return $this->dispatchToRoute($request);
}
public function dispatchToRoute(Request $request) { 1、根据请求找匹配的路由`RouteCollection`根据请求的`http`动作缩小要匹配的路由范围;在筛选出来的这些路由中依次遍历,找出第一个符合验证的路由(需要进行较验的验证在`Route`中的`getValidators`方法中声明); 2、将路由绑定到请求上3、触发RouteMatched事件初始化的`Laravel`项目没有对`RouteMatched`路由匹配事件进行任何的监听器绑定,如有需要,可以自定义监听器,在模块的`EventServiceProvider`中注册该事件监听;这样一旦请求匹配上某个路由,就可以执行自定义方法了; 4、通过 Pipeline 流水线执行路由上绑定的中间件及对应的方法在`runRouteWithinStack`方法中,系统会判断是否需要执行中间件,如果`IOC`容器中设置了`middleware.disable`的值为`true`,则需要执行的中间件数组为空;否则会找到所有的中间件,并按照`middlewarePriority`对必要的一些中间件进行排序调整;然后执行 5、根据 request 请求设置 response 的响应头项目中会用到的一些方法
Url 生成器Url 生成器是什么?举个例子, $url->to('foo/bar'); // 输出 http://www.foo.com/foo/bar
像这种基于当前请求,生成指定路径的Url; 这部分功能由两个文件完成,一个是UrlGenerator.php,另一个是RouteUrlGenerator.php;UrlGenerator.php处理根据路径名生成Url,RouteUrlGenerator.php处理根据路由生成Url; 列一些常用的使用: 根据路径名生成使用to方法,第一个参数为路径,第二个参数是数组,implode后会接着路径名,第三个参数决定用不用https to('foo/bar')
// 路径名是 foo/bar,当前请求的根路径为 http://www.foo.com,第三个参数决定 scheme 是 https,所以输出是 https://www.foo.com/foo/bar
$url->to('foo/bar',[],true)
// 路径名是 foo/bar,第二个参数 是补充路径名,implode 后是 /baz/boom
// 第三个参数决定 scheme 是 https,所以输出是 https://www.foo.com/foo/bar/baz/boom
$url->to('foo/bar',['baz','boom'],true)
// 路径名是 foo/bar,查询参数是 ?foo=bar ,补充路径是 /baz,所以输出是 https://www.foo.com/foo/bar/baz?foo=bar
$url->to('foo/bar?foo=bar',['baz'],true)
根据路由的 as 名生成使用route方法,第一个参数为指定路由的 as 名,第二个参数是参数数组,第三个参数决定是否显示根目录(默认为 true) 'foo']);
$routes->add($route);
// 输出 'http://www.foo.com/foo/bar // 第三个参数为 false,表示不显示根目录,于是输出 /foo/bar // 路由中的 url 本身不带参数,则第二参数中所有关联数组都将作为查询参数 'bar']);
$routes->add($route);
// 路由上的 url 带参数,根据参数名找值;剩余多余的为查询参数; // 路由上的 url 带参数,找不到对应的参数值,则按顺序作值;剩余多余的为查询参数; 根据路由的 action 名生成使用action方法,第一个参数为指定路由的 action 名,第二个参数是参数数组,第三个参数决定是否显示根目录(默认为 true) 'foo@bar']);
$routes->add($route);
// 输出 http://www.foo.com/foo/bam 'InvokableActionStub']);
$routes->add($route);
// 输出 http://www.foo.com/foo/invoke 设置全局默认参数defaults(['locale' => 'en']);
$route = new Route(['GET'],'foo',['as' => 'defaults','domain' => '{locale}.example.com',function() {}]); // 路由 url 有参数,但没有传参数值,则会找全局默认参数值;输出 http://en.example.com/foo 设置全局命名空间这样调用的时候,不用在 action 上省略这部分命名空间 setRootControllerNamespace('namespace');
// 配置添加路由 // 输出 http://www.foo.com/foo/bar; action 的值省略 namespace 这个命名空间 // 配置添加路由 // 输出 http://www.foo.com/something/else; action 的最前面加了 跳转器跳转器内部提供了以下跳转; home通过调用 back通过调用 第三个参数表示,如果没有前一次访问请求,访问哪个页面,具体源码如下: to($fallback);
} else {
return $this->to('/');
}
refresh通过调用 to通过调用 这里的 path 路径是不包含根目录的,例如(foo/bar); 第四个参数表示是否使用https; away通过调用 这里的 path 路径是包含根目录的,例如(http://xx.com/foo/bar); secure通过调用 其本质是调用了to方法 to($path,$status,$headers,true);
route通过调用 action通过调用 guest跳到指定的路径页的同时,将当前url存放至session中,键名为url.intended; intended跳转至session中键名为url.intended的值所对应的Url;如果不存在,则跳转至第一个参数所传的值; 响应工厂(ResponseFactory)ResponseFactory文件提供了两部分 API,分别是与响应类型相关和与跳转相关; 响应
视图响应view('hello',$data,200);
Jsop响应json(['name' => 'Abigail','state' => 'CA']);
Jsonp响应json(['name' => 'Abigail','state' => 'CA'])->withCallback($request->input('callback'));
文件响应直接在浏览器显示文件,而不是下载,例如图片或PDF;file方法第一参数为文件路径,第二参数选填为头信息数组; file($pathToFile,$headers);
文件下载download方法第一参数为文件路径,第二参数选填为文件名,第三参数选填为头信息数组; download($pathToFile,$name,$headers);
跳转这里的跳转方法,其实调用的还是跳转器中的方法,不过是在暴露更多的接口,方便调用与使用;
总结以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |