laravel 应用层执行过程源码分析

Laravel 是优雅的 PHP Web 开发框架。具有高效、简洁、富于表达力等优点。采用 MVC 设计,是崇尚开发效率的全栈框架。是最受关注的 PHP 框架。

所以 laravel 框架本身的设计思想我认为值得我们每个 phper 去学习,这里我通过一个手写的简易版框架去认识和了解 laravel 在应用层执行的过程。主要包含的内容有:容器、应用框架、内核、契约、入口文件、服务提供者、路由、请求、门面、控制器及辅助函数。文章结尾附上执行流程的图片供大家参考。


容器:执行依赖注入和管理依赖的工具


主要做了2件事情:

  1. 【绑定】对象、实例(共享实例)、接口(接口到实现)、闭包4个抽象和具体类到容器数组中
  2. 【解析】已绑定的抽象(通过反射机制实现解析具体类中的依赖注入),即创建实例

整一个框架里面就围绕这个容器提供依赖的,所以相当于一个心脏,也是 laravel 的一个心脏。这里贴出源码,后面就不贴了。


应用程序


主要也是做2件事:在构造函数中注册基本绑定和注册基本服务

  1. 构造函数中【注册基本绑定】到容器共享实例数组中:绑定自身到app 抽象;绑定自身到从容器类抽象
  2. 构造函数中【注册基本服务】到容器绑定数组中:包含但不限于:路由对象、请求对象、日志契约接口到文件日志实现类、文件日志服务对象、mysql日志服务对象…


内核


  1. 内核类通过构造函数将依赖(应用框架(容器))注入
  2. 并在构造函数中解析路由对象到内核的属性中
  3. 将请求对象传入到路由对象(在构造函数中解析路由对象到内核的属性中)的请求分发方法中


契约:契约是一组接口,每一个契约都有框架提供的相应的实现


容器契约
内核契约
服务提供者契约
– 日志契约


入口文件


主要做了5件事,执行顺序也是按照下面执行,当然可以调整,只不过为了更好理解我就这么排了

  1. 实例化应用框架
  2. 通过路由门面类的静态方法执行路由配置。具体执行流程查看门面相应的内容即可
  3. 绑定内核契约的接口到实现
  4. 解析内核契约对象接口(即获取实现契约接口的具体实现类的实例化对象)
  5. 调用请求对象设置请求地址到请求对象的属性中,并将请求对象返回的方法
  6. 将请求对象传入到内核的处理请求方法中


服务提供者


这里主要介绍的是服务的概念。设计思路与 laravel 关于服务提供者实现的不一样,对这块感兴趣的朋友可以看下源码或者留言一起讨论。

文件日志服务类:实现契约接口的约束方法
mysql 日志服务类:实现契约接口的约束方法


路由对象


主要做了3件事

  1. 将路由配置项添加到路由对象的路由表中
  2. 请求分发方法执行查找路由表的方法
  3. 执行匹配到请求的路由,即执行控制器下的方法或者立即执行闭包。示例中介绍执行控制器的方法流程,这样才更能掌握服务提供者和辅助函数的概念


请求对象


设置请求地址到请求对象的属性中,并将请求对象返回


门面:通过定义门面的抽象类,「静态代理」应用的服务容器中可用的底层类


门面的抽象类

  1. 调用具体对象(路由、请求…)的门面类, 执行__callStatic() 魔术方法动态的调用静态对象
  2. 获取继承该抽象门面类的门面对象名称
  3. 通过获取门面名称从容器已绑定的类库中解析出门面要静态代理的基类,并返回
  4. 传入可变参数,并动态执行该具体对象的方法


控制器


  1. 执行控制器的方法的相应业务。
  2. 这里示例提供有数据库连接的服务,配合应用服务容器辅助函数并调用服务方法即可


辅助函数


应用服务容器辅助函数:根据参数判断直接返回服务容器或者解析出相应抽象的实例


执行流程


执行的顺序以 「阿拉伯数字.」 做为顺序阅读

源码地址

https://github.com/leeprince/my_pattern/tree/master/my_minilaravel

这框架只是为让大家一起了解和熟悉 laravel 在应用层的加载过程。当然 laravel 框架本身还有很多核心的架构,比如服务提供者、管道、中间件有时间我再补上

欢迎大家留言一起讨论~