手机版

Laravel源码解析之路由的使用和示例详解

时间:2021-08-29 来源:互联网 编辑:宝哥软件园 浏览:

前言

我的解析文章并非深层次多领域的解析攻略。但是参考着开发文档看此类文章会让你在日常开发中更上一层楼。

废话不多说,我们开始本章的讲解。

入口

Laravel启动后,会先加载服务提供者、中间件等组件,在查找路由之前因为我们使用的是门面,所以先要查到途径的实体类。

注册

第一步当然还是通过服务提供者,因为这是laravel启动的关键,在RouteServiceProvider内加载路由文件。

受保护的函数mapapi routes(){ route :3360前缀(' API ')-中间件(“API”)-命名空间($this-namespace) //设置所处命名空间-group(base _ path(' routes/API。PHP’);//所得路由文件绝对路径}首先需要是不可缺少的。因路由文件中没有命名空间点亮\路由\路由器下方法

受保护的函数load routes($ routes){ if($ routes of Closure){ $ routes($ this);} else { $ router=$ this需要$航线;}}随后通过路由找到指定方法,依旧是点亮\路由\路由器内有你所使用的所有路由相关方法,例如获取、发布、投放、修补等等,他们都调用了统一的方法增加走线

公共函数addRoute($methods,$uri,$ action){ return $ this-routes-add($ this-createRoute($ methods,$uri,$ action));}之后通过点亮\路由\路由选择添加到集合方法添加到集合中

受保护函数addto collections($ route){ $ domain andri=$ route-getDomain().$ route-uri();foreach($ route-methods())as $ method){ $ this-routes[$ method][$ domainAndUri]=$ route;} $this-allRoutes[$method .$ domain andri]=$ route;}添加后的结果如下图所示

实例化

依旧通过反射加载路由指定的控制器,这个时候建设的参数$ concrete=App \ Api \ controller \ XxxController

公共功能建筑(混凝土){//如果具体类型实际上是一个结束,我们将只执行它并//交还函数的结果,这允许函数//用作解析器,以便对这些对象进行更精细的解析if($ Closure的具体实例){ return $ concrete($ this,$ this-GetLastParameteroverride());} $ reflector=new ReflectionClass($ concrete);//如果类型不可实例化,开发人员试图解析//抽象类型,例如抽象类的接口,并且没有为抽象注册//绑定,因此我们需要退出如果(!$ reflector-is instant able()){ return $ this-notinstant able($ concrete);} $ this-BuildStack[]=$ concrete;$ constructor=$ reflector-getConstructor();//如果没有构造函数,这意味着没有依赖关系,那么//我们可以直接解析对象的实例,而不用//解析这些容器之外的任何其他类型或依赖关系if(is _ null($ constructor)){ array _ pop($ this-BuildStack);返回新的$ concrete } $ dependencies=$ constructor-GetParameters();//一旦我们有了所有构造函数的参数,我们就可以创建每一个//依赖实例,然后使用反射实例创建这个类的//新实例,将创建的依赖注入$ instance=$ this-解析的依赖项($ dependencies);array _ pop($ this-BuildStack);返回$ reflector-新实例args($ instance);}这时将返回控制器的实例,下面将通过全球资源定位器(统一资源定位符)访问指定方法,一般控制器都会继承父类照明\路由\控制器,左为其设置了别名基本控制器

公共函数分派(Route $route,$controller,$ method){ $ parameters=$ this-resolveclasmethod依赖项($ Route-parameters swithoutnulls(),$controller,$ method);if (method_exists($controller,' callAction '){ return $ controller-callAction($ method,$ parameters);}返回$controller-{$method}(.array _ values($ parameters));}Laravel通过控制器继承的调用去调用子类的指定方法,也就是我们希望调用的自定义方法。

公共函数调用action($ method,$ parameters){ return call _ user _ func _ array([$ this,$method],$ parameters);}致谢

感谢你看到这里,本篇文章源码解析靠个人理解。如有出入请拍砖。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:Laravel源码解析之路由的使用和示例详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。