序
本文主要介绍Laravel路由模块的相关内容,可以分享给大家参考学习。下面就不多说了。我们来看看详细的介绍。
注:本文基于Laravel版的路由模块代码。
模块组成
下图显示了路由模块中每个文件的关系,并给出了简要说明。
分析
互联网服务商
查看Laravel模块,首先查找ServiceProvider文件,这是模块与IOC容器交互的入口。从这个文件中,我们可以看到模块为系统提供了哪些服务;
public function register(){//register route management,提供路由注册和路由匹配的功能$ this-register router();//Register Url生成器实例$ this-Register URl生成器();//Register jumper $ this-Register redirector();//将实现$ this-registerepsrrequest()的PSR-7请求绑定到ServerRequestInterface接口;//将PSR-7响应绑定到响应接口$ this-registerepsrrresponse();//注册ReponseFactory并提供各种response,如视图响应、Json响应、Jsonp响应、文件下载等。$ this-RegisterresponseFactory();}路由管理
路由管理服务需要了解以下要素:
路线:路线;将记录Url、Http Action、Action(路由要执行的特定对象,可能是Closure或Controller中的方法)、路由参数和路由参数的约束;路线集合:用于存储所有路线对象的“盒子”的路线集合;路由组:路由组;仅在路线注册期间临时使用;存储一批路由共有的一些属性,包括域、前缀、as、中间件、名称空间和位置;资源:资源路由;资源路由是一组路由的总称,包括列表、创建、存储、显示、编辑、更新索引销毁。同时,只调用或除方法或参数外,只能生成部分路由;操作:路由要执行的对象;有两个表达式,一个是Closure函数,另一个是像['uses'=' [email protected]',' as'=' name']这样的字符串。对于不同的表现形式,路由在执行时会调用不同的处理;注册过程
项目启动后,将执行所有ServiceProvider的loadRoutes方法,即调用map方法。通常,映射方法如下
公共函数映射(Router $router){ require __DIR__。/routes . PHP ';}此时,项目将执行许多Route:get、Route:post和Route:group方法;
当遇到Route:group方法时,RouteGroup对象将被实例化并放入Router管理类的路由组堆栈头;然后,当执行get、post等特定的注册路由方式时,当前路由组栈中所有组的属性将合并到新路由中,新路由将存储在RouteCollection的大框中;当Route:group的闭包完成时,头部的RouteGroup实例将被拉出;
执行Route:resource时,Router管理类会调用ResourceRegister类完成路由的批量注册;
照明基础助手提供注册方法的缩写,如Router:get
Router:get简化为get,Router:post简化为post,Router:put简化为put,Router:patch简化为patch,Router:delete简化为delete,Router:resource简化为resource,到目前为止,RouteCollection框存储了所有需要注册的路由;
请求请求匹配过程
首先,请求请求通过Foundation/Http/Kernel句柄方法,在该方法中,请求执行以下语句
$this-Router-dispatch($request)这里的$this-Router是路由器管理类;调度方法如下
公共函数分派(Request $ Request){ $ this-currentRequest=$ Request;返回$ this-dispatchtorute($ request);}公共函数dispatcher out(request $ request){//根据请求的url查找匹配的路由$ route=$ this-find route($ request);//将路由绑定到request $ request-setroutersolver(function())use($ route){ return $ route;}//触发RouteMatched事件$ this-events-dispatch(新事件 routematched ($ route,$ request));//通过Pipeline管道执行绑定在route和对应方法$ response=$ this-runroutewithinstack($ route,$ request)上的中间件;//根据请求请求,设置响应头return $ this-prepare response($ request,$ response);}1.根据请求找到匹配的路由
“路由选择”根据请求的“http”操作缩小了要匹配的路由范围;依次遍历这些筛选出的路由,找出满足验证的第一条路由(需要验证的验证在“路由”中的getValidators方法中声明);
2.将路由绑定到请求
3.触发路由选择事件
已初始化的“Laravel”项目没有任何路由匹配事件的侦听器绑定。如有必要,您可以自定义侦听器,并在模块的“事件服务提供程序”中注册事件侦听器。这样,一旦请求与某个路由匹配,就可以执行自定义方法;
4.通过管道管道执行绑定在路由上的中间件和相应的方法
在runRouteWithinStack的方法中,系统会判断是否需要执行中间件。如果在“ioc”容器中将middleware.disable的值设置为true,则要执行的中间件数组为空。否则会找到所有的中间件,一些必要的中间件会按照middleware priority’进行排序和调整;然后执行`$route-run()'方法;
5.根据请求请求设置响应的响应头
项目中使用的一些方法
获取路由集app('router')-getRoutes()获取当前请求$ request=app(' router ')-getcurrentrequest()获取当前请求对应的路由$route=$request-route()或$ route=app(' router ')-getCurrentRoute()获取当前路由需要执行的中间件$中间件=app(' router ')-gatherrouteremidle($ route)URL生成器
什么是Url生成器?
例如,
$ URL=new URL generator($ routes=new route collection,$ request=request : create(' http://www . foo.com/');$ URL-to(' foo/bar ');//输出http://www.foo.com/foo/bar生成的网址;基于当前请求的指定路径的;
这部分功能由两个文件完成,一个是UrlGenerator.php,另一个是RouteUrlGenerator.php;UrlGenerator.php进程根据路径名生成网址,RouteUrlGenerator.php进程根据路由生成网址。
列出一些常见用途:
从路径名生成
使用to方法,第一个参数是路径,第二个参数是数组,路径名后面是embed,第三个参数确定是否使用https
//路径名为foo/bar,当前请求的根路径为http://www.foo.com,因此输出为http://www.foo.com/foo/bar $ URL-to(‘foo/bar’)//路径名为foo/bar,当前请求的根路径为http://www.foo.com。第三个参数确定方案是https,所以输出是https://www.foo.com/foo/bar $ URL-to(' foo/bar ',[],true)//路径名是foo/bar,第二个参数是补充路径名。内爆之后是/baz/boom//。第三个参数确定方案是https,所以输出是https://www.foo.com/foo/bar/baz/boom $ URL-to(' Foo/bar ',['baz ',' boom'],true)//路径名是FO Foo=bar,补充路径是/baz,所以输出是https://www.foo.com/foo/bar/baz? Foo=bar $ URL-to(' Foo/bar?Foo=bar ',['baz'],true)是根据路线的as名称生成的
使用route方法,第一个参数是指定路由的as名称,第二个参数是参数数组,第三个参数决定是否显示根目录(默认值为true)
$route=new Route(['GET'],' foo/bar ',[' as '=' foo ']);$ routes-add($ route);//输出http://www .福。com/foo/bar $ URL-route(' foo ');//第三个参数为假的,表示不显示根目录,于是输出/foo/bar$url-route('foo ',[],false)//路由中的全球资源定位器(统一资源定位符)本身不带参数,则第二参数中所有关联数组都将作为查询参数//输出/foo/bar?foo=bar$url-route('foo ',['foo'='bar'],false)$route=new Route(['GET'],' foo/bar/{baz}/breeze/{boom} ',[' as '=' bar ']);$ routes-add($ route);//路由上的全球资源定位器(统一资源定位符)带参数,根据参数名找值;剩余多余的为查询参数;//输出http://www.foo.com/foo/bar/otwell/breeze/taylor?fly=wall$url-route('bar ',['boom'='taylor ',' baz'='otwell ',' fly '=' wall ']);//路由上的全球资源定位器(统一资源定位符)带参数,找不到对应的参数值,则按顺序作值;剩余多余的为查询参数;//输出http://www.foo.com/foo/bar/taylor/breeze/otwell?fly=wall$url-route('bar ',['taylor ',' otwell ',' fly '=' wall ']);根据路由的行为名生成
使用行为方法,第一个参数为指定路由的行为名,第二个参数是参数数组,第三个参数决定是否显示根目录(默认为真)
$route=new Route(['GET'],' foo/bam ',[' controller '='[email protected]']);$ routes-add($ route);//输出http://www .福。com/foo/bam $ URL-操作('电子邮件保护');$route=new Route(['GET'],' foo/invoke ',[' controller '=' invokable action stub ']);$ routes-add($ route);//输出http://www .福。com/foo/invoke $ URL-action(' invokableActionStub ');设置全局默认参数
$ URL-默认值([' locale '=' en ']);$route=new Route(['GET'],' foo ',['as'='defaults ',' domain'='{locale}.example.com ',function(){ }]);//路由全球资源定位器(统一资源定位符)有参数,但没有传参数值,则会找全局默认参数值;输出http://。例子。com/foo $ URL-route('默认值');设置全局命名空间
这样调用的时候,不用在行为上省略这部分命名空间
//设置全局命名空间$ URL-setrootcontrolernamespace('命名空间');//配置添加路由$route=new Route(['GET'],' foo/bar ',[' controller '=' namespace [email protected]']);$ routes-add($ route);$route=new Route(['GET'],' foo/invoke ',[' controller '=' namespace 可调用action stub ']);$ routes-add($ route);//输出http://www.foo.com/foo/bar;行动的值省略命名空间这个命名空间$ URL-操作('[电子邮件保护]');//输出http://www.foo.com/foo/invoke;行动的值省略命名空间这个命名空间$ URL-操作(' invokableActionStub ');//配置添加路由$route=新路由(['GET'],'某物/else ',['controller'='某物[电子邮件保护]']);$ routes-add($ route);//输出http://www.foo.com/something/else;行动的最前面加了``,全局命名空间下调用$ URL-操作(' 某物[电子邮件保护]');跳转器
跳转器内部提供了以下跳转;
家
通过调用应用程序('重定向')-主页()会跳转至根目录下;
公共功能主页($status=302)返回
通过调用应用程序('重定向')-后退()会跳转至上一次访问页面;或者全局帮助函数后退()也可以;
公共函数back($status=302,$headers=[],$ fall=false)第三个参数表示,如果没有前一次访问请求,访问哪个页面,具体源码如下:
if($ URL){返回$ URL;} else if($ fallback){ return $ this-to($ fallback);} else { return $ this-to('/');}刷新
通过调用应用程序('重定向')-刷新()会刷新当前访问页面;
公共函数刷新($status=302,$headers=[])到
通过调用应用程序('重定向')-到('路径)会跳转至指定路径页面;或者全局帮助函数重定向('路径)也可以;
这里的小路路径是不包含根目录的,例如(foo/bar);
公共函数到($path,$status=302,$headers=[],$secure=null)第四个参数表示是否使用https
离开
通过调用应用程序('重定向')-离开('路径)会跳转至指定路径页面;
这里的小路路径是包含根目录的,例如(http://xx。com/foo/bar);
public function away($path,$status=302,$headers=[])安全
您可以通过调用app('redirect')-secure('path ')跳转到指定的路径页;此处的路径路径不包含根目录;
公共函数secure ($ path,$ status=302,$ headers=[])的本质是调用to方法
返回$this-to($path,$status,$headers,true);途径
通过调用app(' redirect ')-route(' route _ as _ name '),根据路由的as名称,跳转到与路由一致的url路径页面;
公共函数路由($route,$parameters=[],$status=302,$headers=[])操作
通过调用app(' redirect ')-action(' route _ action '),根据路由的动作名称,跳转到与路由一致的url路径页面;
公共函数action($action,$parameters=[],$status=302,$headers=[])guest
跳到指定的路径页,将当前的url存储在会话中,关键字名称为URL。
预期的公共函数guest($path,$status=302,$headers=[],$secure=null)
跳转到该Url对应于会话中键名为URL . ideal的值;如果不存在,跳转到第一个参数传递的值;
预期的公共函数($ default='/',$ status=302,$ headers=[],$ secure=null)响应工厂
ResponseFactory文件提供了API的两个部分,分别与响应类型和跳转相关。
作出反应
响应()返回响应工厂实例;
查看响应
response()-view('hello ',$data,200);Jsop响应
response()-JSON([' name '=' Abigail ',' state '=' CA ']);Jsonp响应
response()-JSON([' name '=' Abigail ',' state '=' CA '])-withCallback($ request-input(' callback '));文件响应
直接在浏览器中显示文件,而不是下载,如图片或PDF;file方法的第一个参数是文件路径,第二个参数是可选的头信息数组。
response()-file($pathToFile,$ headers);文件下载
下载方法的第一个参数是文件路径,第二个参数是文件名,第三个参数是头信息数组。
return response()-download($ path tofile,$name,$ headers);跳跃
这里的jump方法实际上是调用了jump中的方法,但是暴露了更多的接口,方便调用和使用;
方法名调用实际上调用哪个方法redirectresponse()-redirectto(.)到方法redirecttoroute响应()-redirecttoroute(.)路由方法redirectToAction响应()-redirectToAction(.)操作方法重定向来宾响应()-重定向来宾(.)来宾方法重定向到趋势响应()-重定向到趋势(.)预期方法总结
以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。