Yii2框架的启动流程

Yii2虽然是一个以简单著称的框架,但它的启动流程却有点复杂.想要用好这个框架,启动流程必须烂熟于心.尤其当你开发Yii2的扩展(Extension)时,或者将自己已有的扩展运用到Yii2开发的项目中时,你可能会通过composer安装,然后在应用中通过各种手段参与框架的整个流程,这时,了解整个框架的启动流程就很重要.

以下从Yii2框架最核心的六重继承开始介绍,进一步介绍它的构造阶段,最后是框架整个MVC过程run()方法.

0. Yii2中的六重继承

Yii2 的六重继承估计遭受了不只我在内很多人的吐槽.不符合对象的设计标准,单一职责原则首先被无视.其次就是几乎不用接口去限制对象,导致出现了大量的继承和方法重写,导致对象的混乱.大量对原始类的继承,导致全局掌控的欠缺,比如新的对象,都有独立的 DI事件 模块,例如每个 Controller ,虽然 Yii2 对事件管理提供了一个解决方案,实现跨实例干涉,这个我们后续再说.这种缺憾举不胜举.

use yii\web\Application;
use yii\base\Application;
use yii\base\Module;
use yii\di\ServiceLocator;
use yii\base\Component;
use yii\base\BaseObject;

由上而下,这就是Yii2的六重继承,

0x00. yii\web\Application

这个对象负责掌管web应用组件 request , response,user , session , errorHandler 等的入口.

0x01. yii\base\Application

yii\base\Application 更像是 yii\web\Application 的补充,负责管理 view , mailer , userManager 等组件.

0x02. yii\base\Module

可以理解为 yii\base\Module 是用于实现 MVC 的对象, controller , action 的创建都在这里发生.

0x03. yii\di\ServiceLocator

用于管理 component 的实例管理工具,这个对象在之前的文章中提起过,要实现 component 的单例,如果是运行时动态添加的话,需要先 set() , Yii2 将一个 component 分为三部分缓存, 参数 , reflection , 实例本身 ,这可能就是单例必须 set() 的原因吧,因为 set() 的就是参数.

0x04. yii\base\Component

这个命名很容易误导初学者,其实这个对象正是 Yii2 的事件管理者.后续将单独开文详细介绍Yii2的事件管理.

0x05. yii\base\BaseObject

这个对象主要用语法糖 __set()__get() 管理上述对象的属性.

1. 构造阶段

//在站点入口``index.php``中
(new yii\web\Application($config))->run();

(new yii\web\Application($config)) 中,实现了对 Yii2 六重继承对象体的构造,主要包括将 $config 按照规则 配置 入这个对象体中.然后调用 bootstrap() 方法.

配置 的过程中, component 会被以此 set() ,并实例化到 ServiceLocator 提供的变量中.在直接尝试通过六重继承实例获取该 component 时, ServiceLocator 提供了新的语法糖用于直接返回这个 component ,就像直接获取这个实例的 public 变量.

bootstrap() 时,实例化所有的 extension ,如果被实例化对象引用了 yii\base\BootstrapInterface ,还会尝试调用其 bootstrap() 方法.之后会遍历配置项中的 bootstrap 项,以此实例化,并对引用了 yii\base\BootstrapInterface 的对象尝试调用其 bootstrap() 方法.

2. run()阶段

这个阶段,主要是解析路由,处理请求,渲染页面,以及响应请求的阶段.

0x00. 解析路由

0x01. 实例化controller和action

0x02. 运行action

0x03. 渲染页面

0x04. 相应请求

最后更新于 2018-01-07 12:42:01 并被添加「」标签,已有 1 位童鞋阅读过。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章