前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Laravel源码解析之路由的使用和示例详解

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

作者头像
子润先生
修改于 2021-07-13 03:44:47
修改于 2021-07-13 03:44:47
9840
举报

前言

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

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

入口

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

注册

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

protected function mapApiRoutes()

{

Route::prefix('api')

->middleware('api')

->namespace($this->namespace) // 设置所处命名空间

->group(base_path('routes/api.php')); //所得路由文件绝对路径

}

首先require是不可缺少的。因路由文件中没有命名空间。 IlluminateRoutingRouter 下方法

protected function loadRoutes($routes)

{

if ($routes instanceof Closure) {

$routes($this);

} else {

$router = $this;

require $routes;

}

}

随后通过路由找到指定方法,依旧是 IlluminateRoutingRouter 内有你所使用的所有路由相关方法,例如get、post、put、patch等等,他们都调用了统一的方法 addRoute

public function addRoute($methods, $uri, $action)

{

return $this->routes->add($this->createRoute($methods, $uri, $action));

}

之后通过 IlluminateRoutingRouteCollection addToCollections 方法添加到集合中

protected function addToCollections($route)

{

$domainAndUri = $route->getDomain().$route->uri();

foreach ($route->methods() as $method) {

$this->routes[$method][$domainAndUri] = $route;

}

$this->allRoutes[$method.$domainAndUri] = $route;

}

添加后的结果如下图所示

实例化

依旧通过反射加载路由指定的控制器,这个时候build的参数$concrete = AppApiControllersXxxController

public function build($concrete)

{

/

/// If the concrete type is actually a Closure, we will just execute it and

// hand back the results of the functions, which allows functions to be

// used as resolvers for more fine-tuned resolution of these objects.

if ($concrete instanceof Closure) {

return $concrete($this, $this->getLastParameterOverride());

}

$reflector = new ReflectionClass($concrete);

// If the type is not instantiable, the developer is attempting to resolve

// an abstract type such as an Interface of Abstract Class and there is

// no binding registered for the abstractions so we need to bail out.

if (! $reflector->isInstantiable()) {

return $this->notInstantiable($concrete);

}

$this->buildStack[] = $concrete;

$constructor = $reflector->getConstructor();

// If there are no constructors, that means there are no dependencies then

// we can just resolve the instances of the objects right away, without

// resolving any other types or dependencies out of these containers.

if (is_null($constructor)) {

array_pop($this->buildStack);

return new $concrete;

}

$dependencies = $constructor->getParameters();

// Once we have all the constructor's parameters we can create each of the

// dependency instances and then /

/use the reflection instances to make a

// new instance of this class, injecting the created dependencies in.

$instances = $this->resolveDependencies(

$dependencies

);

array_pop($this->buildStack);

return $reflector->newInstanceArgs($instances);

}

这时将返回控制器的实例,下面将通过url访问指定方法,一般控制器都会继承父类 IlluminateRoutingController ,laravel为其设置了别名 BaseControlle

public function dispatch(Route $route, $controller, $method)

{

$parameters = $this->resolveClassMethodDependencies(

$route->parametersWithoutNulls(), $controller, $method

);

if (method_exists($controller, 'callAction')) {

return $controller->callAction($method, $parameters);

}

return $controller->{$method}(...array_values($parameters));

}

Laravel通过controller继承的callAction去调用子类的指定方法,也就是我们希望调用的自定义方法。

public function callAction($method, $parameters)

{

return call_user_func_array([$this, $method], $parameters);

}

致谢

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

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Laravel源码解析之路由的使用
我的解析文章并非深层次多领域的解析攻略。但是参考着开发文档看此类文章会让你在日常开发中更上一层楼。
CrazyCodes
2019/11/07
9210
Laravel源码解析之路由的使用
Laravel源码解析之反射的使用
PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法、成员,而反射类则是拆封类中的所有方法、成员变量,并包括私有方法等。就如“解刨”一样,我们可以调用任何关键字修饰的方法、成员。当然在正常业务中是建议不使用,比较反射类已经摒弃了封装的概念。
CrazyCodes
2019/11/07
7330
Laravel源码解析之反射的使用
Laravel5.3之Container源码解析
说明:本文主要学习Laravel中Container的源码,主要学习Container的绑定和解析过程,和解析过程中的依赖解决。分享自己的研究心得,希望对别人有所帮助。实际上Container的绑定主要有三种方式:bind(),singleton(),instance(),且singleton()只是一种'shared' = true的bind(),这些已经在Laravel学习笔记之IoC Container实例化源码解析聊过,其实现方法并不复杂。当Service通过Service Provider绑定到Container中后,当需要该Service时,是需要Container帮助自动解析make()。OK,下面聊聊自动解析过程,研究下Container是如何在自动解析Service时解决该Service的依赖问题的。
botkenni
2019/09/02
1.5K0
Laravel5.3之Container源码解析
【Laravel系列6.3】框架启动与服务容器源码
了解了服务容器的原理,要处理的问题,以及 Laravel 中如何使用服务容器以及服务提供者之后,我们就进入到了源码的学习中。其实服务容器的源码还是比较好理解的,毕竟我们已经自己实现过一个简单的服务容器了。在这里,我们也顺便看一下 Laravel 框架启动时的容器加载情况。
硬核项目经理
2023/03/03
2K0
【Laravel系列6.3】框架启动与服务容器源码
PHP实现简单的模板引擎功能示例
本文实例讲述了PHP实现简单的模板引擎功能。分享给大家供大家参考,具体如下: php web开发中广泛采取mvc的设计模式,controller传递给view层的数据,必须通过模板引擎才能解析出来。实现一个简单的仅仅包含if,foreach标签,解析$foo变量的模板引擎。 编写template模板类和compiler编译类。代码如下:
用户2323866
2021/07/05
1.2K0
Laravel源码笔记(一)程序结构与生命周期
说起PHP框架,就不得不提大名鼎鼎的Lavarel。作为一个“专为Web艺术家而创造”的框架,其优雅、简洁的开发体验吸引了一大批Web开发者,并成为PHP社区中使用最为广泛的全栈框架之一。虽然随着golang、nodejs等server化后台语言的大行其道,让传统的fast-cgi模式框架日渐式微,但Lavarel中采用的组件化开发、依赖注入、横向代理等设计思想,依然值得我们学习与借鉴。笔者在阅读Laravel框架源码的过程,总结了一些自己的理解与体会同大家分享。
asterDY
2020/03/20
2.5K0
Laravel源码笔记(一)程序结构与生命周期
Laravel的容器的工作原理
使用Laravel有一段时间了,终于抽点了时间看了一下其laravel实现的IOC控制反转的概念,确实很有意思。
老高的技术博客
2022/12/28
7050
深入剖析 Laravel 服务容器
之前在 深度挖掘 Laravel 生命周期 一文中,我们有去探究 Laravel 究竟是如何接收 HTTP 请求,又是如何生成响应并最终呈现给用户的工作原理。
柳公子
2018/09/17
9.1K0
Laravel源码分析之Route
路由是外界访问Laravel应用程序的通路或者说路由定义了Laravel的应用程序向外界提供服务的具体方式:通过指定的URI、HTTP请求方法以及路由参数(可选)才能正确访问到路由定义的处理程序。无论URI对应的处理程序是一个简单的闭包还是说是控制器方法没有对应的路由外界都访问不到他们,今天我们就来看看Laravel是如何来设计和实现路由的。
KevinYan
2019/10/13
2.3K0
深入浅出 Laravel 路由执行原理
可以说几乎所有的框架都会涉及到「路由」的处理,简单一点讲就将用户请求的 url 分配到对应的处理程序。
柳公子
2018/09/17
7K0
Laravel学习教程之路由模块
前言 本文主要给大家介绍的是关于Laravel路由模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 备注:本文是基于Laravel 5.4版本的路由模块代码进行分析书写; 模块组成
用户2323866
2021/06/30
8720
Laravel源码解析之控制器
控制器能够将相关的请求处理逻辑组成一个单独的类, 通过前面的路由和中间件两个章节我们多次强调Laravel应用的请求在进入应用后首现会通过Http Kernel里定义的基本中间件
KevinYan
2019/10/13
9700
来!狂撸一款PHP现代化框架 (路由的设计)
上一篇的标题改了一下,以一、二、三为章节对读者来说是种困扰,现在的标题是依照项目进度来编写的。上篇文章地址为 https://segmentfault.com/a/1190000017278828
CrazyCodes
2019/11/07
5730
来!狂撸一款PHP现代化框架 (路由的设计)
Laravel源码笔记(二)路由
路由是web服务不可或缺的一部分,一个好的web框架必须具备一整套灵活且丰富的路由系统。Laravel自然也不例外,通过配置文件中一两行代码就可以实现一个具有完整的参数、属性及约束的路由,甚至可以免去写专门的controller。如此强大的功能是如何实现的呢?下面仍然从laravel框架的启动过程出发,探究一下源码中是如何一步步实现路由服务的。
asterDY
2020/04/13
7.6K1
Laravel源码笔记(二)路由
Laravel之容器1. 背景2. DI3. 依赖反转4. Laravel中的容器参考
顾名思义,容器即存放东西的地方,里面存放的可以是文本、数值,甚至是对象、接口、回调函数。
zhuanxu
2018/08/23
4890
Laravel之容器1. 背景2. DI3. 依赖反转4. Laravel中的容器参考
Laravel5.3之IoC Container实例化源码解析
说明:本文主要学习Laravel容器的实例化过程,主要包括Register Base Bindings, Register Base Service Providers , Register Core Container Aliases and Set the Base Path等四个过程。同时并把自己的一点研究心得分享出来,希望对别人有所帮助。
botkenni
2022/01/10
2K0
相关推荐
Laravel源码解析之路由的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档