Laravel 作为PHP最为激进的框架之一,几乎已经成为了PHP开发学习的标杆。Laravel 的底层使用了很多设计模式,比如单例、工厂、建造者、门面、策略、提供者、代理等模式。小马在使用了laravel之后,系统地整理了一下入门知识,在此分享。一文基本涵盖aravel所有的特性,浓缩总结,一文可入门。
一、目录结构
app 业务核心代码 ,自己写的代码主要写在http目录下的controllers目录,当然controllers也可以再分目录
bootstrap 是框架文件
database 数据库迁移和填充文件(注意这里的迁移指的是表结构的变更维护)
public 框架入口和公共资源文件
resources views视图文件
storage 编译后的文件或缓存等文件的保存
vendor composer下载的依赖模块
二、执行流程/生命周期
public/index.php文件载入通过Composer生产的自动加载配置autoload.php ,vendor/autoload.php(加载第三方模块) ,然后从bootstrap/app.php获取并返回应用实例app,创建服务容器(所有服务提供者被注册),Request将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
请求被发送到HTTP内核或Console内核,取决于应用请求类型。这两个内核为所有请求必须经过的中央处理器。
App\Http\Kernel的HTTP内核:
HTTP内核 继承自Illuminate\Foundation\Http\Kernel类,该类定义了一个bootstrappers数组,该数组中的类在请求被执行前运行,bootstrappers配置了错误处理、日志、检测应用环境、其他在请求被处理前需要处理的任务。
HTTP内核还定义请求处理前需要经过HTTP中间件,该中间件处理HTTP会话的读写、判断应用是否处于维护模式,验证CSRF令牌(防止CSRF攻击)等。HTTP内核标签方法handle:获取一个Request,返回一个Response,输入HTTP请求,返回HTTP响应。
三、服务提供者
内核启动会为应用载入服务提供者,服务提供者都被配置在config/app.php配置文件的providers数组中。服务提供者被注册后,boot方法被调用。默认存放在app/Providers目录下。app服务提供者有注册函数,负责将一些自定义的类实例(如领域数据模型)等bind注册进容器(注册树模式),等待调用。服务提供者负责启动框架的所有组件,如数据库、队列、验证器、路由组件等。因他们启动并配置框架提供的所有特性,服务提供者是整个Laravel启动过程中最重要部分。「延迟」提供器:即providers数组中较多服务都是提供的实际服务需要才会加载。服务提供是启动Laravel关键部分:应用实例被创建,服务提供被注册,请求被启动后的应用进行处理。
四、路由
可以理解为URL与程序之间的映射,前面是URL路径形式后面是实际程序地址。路由中的正则表达式是匹配理由用的不是传参校验用的,意思是符合路由正则的URL才转发。
as路由别名的好处:可以用函数return route(‘别名’);生成别名对应的路由URL。
路由群组:可以理解为是给理由加一个前缀。
路由与控制器方法绑定:
五、视图
Return view(‘aa/xx’,[]); aa/xx是模板名称,[]是传参到页面。
六、模型
在APP下直接写class文件继承model即可,调用的话直接在控制器直接实例化调用即可。
七、数据库操作
1、数据库操作之 DB facade(原始查找)
连接DB:在database.php配置连接(配置对应的连接文件.env 文件,在这里改连接账号信息)。
DB facade实现CURD:
2、数据库操作之查询构造器
3、数据库操作之Eloquent ORM
每个表对应一个模型。可以简单理解为ORM。
模型定义文件:
控制器中调用ORM:
八、blade模板引擎
定义父级模板(类似OOP中的父类):
子模版(类似子类)继承这个父级模板布局文件,可以重写父级模板中定义的模块(类似于子类方法重写):
控制器中调用子模板(继承了父模板整个布局内容输出):
九、数据迁移
这里的数据迁移指的是数据库表结构的维护,可以像git管理项目代码一样管理数据库表结构版本协作,支持回滚。
数据库迁移语法文档:up和down代码是相反的操作。
迁移步骤:migration命令创建迁移文件,写入迁移操作代码(表结构变更代码)。PHP命令执行php artisan migrate即可同步所有未同步的表结构。
十、队列使用
十一、中间件
最好将中间件想象为一系列HTTP 请求必须经过才能触发你应用的「层」。每一层都会检查请求(是否符合某些条件),(如果不符合)甚至可以(在请求访问你的应用之前)完全拒绝掉。
中间件和钩子hook的区别:中间件更像过滤器,钩子更像行为事件。
中间件创建步骤:使用命令创建中间件文件,写文件代码,注册中间件。
十二、事件系统
事件监听,观察者模式。
十三、IOC容器
关键词:控制反转(ioc)容器,依赖倒转原则。
依赖倒转原则:
依赖注入和依赖反转的不同,就是反转必须依赖于抽象类,如接口,而不是具体类,如mysql类,mongodb类,但是当抽象接口被注入后不能直接被实例化一个接口,所以必须将接口绑定到一个具体类上。这样app会先去调注册树里映射的具体类实例化。依赖反转对依赖于抽象却能实例化具体类的实现很重要。
IOC容器又称为服务容器,小马看到ioc容器的class内用了注册树模式。注册树模式:先把class绑定进数组,用的时候直接取数组key得到具体class。如 Container::Bind(key, value); container::make(key);
IOC和AOP区别:
一个是控制反转,一个是面向事务,没有任何联系。
在Java中,
IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转。在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决。这个第三方指的就是Spring的容器。IoC另解,依赖注入(Dependency Injection),调用类对被调用类的依赖关系由第三方注入,以移除调用类对被调用类的引用。
aop,面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面(方面)编程。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。 主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改 变这些行为的时候不影响业务逻辑的代码。
IOC具体做了啥?
绑定依赖:
绑定依赖(将A类依赖的具体类B绑定到A类上)/绑定实例/绑定单例
如果没有找到绑定,PHP会使用反射机制来解析实例和依赖(未绑定的实例直接默认用反射机制实例化)。我们来看源码make方法实现。相关文。
反射机制:
IOC容器优缺点:
优点:
1、通过IOC容器,开发人员不需要关注对象是如何创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的热插拔。
2、IOC容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试。
缺点:
1、对象是通过反射机制实例化出来的,因此对系统的性能有一定的影响。
2、创建对象的流程变得复杂。
IOC容器与facade的配合:
服务提供者把类全部都先bind到注册树里,控制器中可以直接调用其facade静态代理(view::make();DB::等),由facade静态代理去找注册树(容器类中对应绑定的class,container::make(‘view’))中的对应的class和方法。
十四、Facade
由上面的配合总结,小马把Facade理解为静态::代理。这个其实就是门面设计模式的应用。
Facade在代码中的使用方式:
Facade下的门面类代码非常简单,主要还是去找容器中绑定的那个class和方法。所以综上,整个框架应该是IOC + 注册树 + facade的配合。
未经允许,请勿转载。
网友评论