YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

8/31/2015来源:PHP技巧人气:3832

YII框架源码分析(百度php大牛创作-原版-无广告无水印)

YII框架源码分析

百度联盟事业部——黄银锋

目 录

1、引言 3

1.1、Yii简介 3

1.2、本文内容与结构 3

2、组件化与模块化 4

2.1、框架加载和运行流程 4

2.2、YiiBase静态类 5

2.3、组件 6

2.4、模块 9

2.5、App应用 10

2.6、WebApp应用 11

3、系统组件 13

3.1、日志路由组件 13

3.2、Url管理组件 15

3.3、异常处理组件 17

3.4、Cache组件 17

3.5、角访问控制组件 19

3.6、全局状态组件 21

4、控制器层 23

4.1、Action 23

4.2、Filter 24

4.3、Action与Filter的执行流程 26

4.4、访问控制过滤器 27

5、模型层 30

5.1、DAO层 30

5.1.1、数据库连接组件 30

5.1.2、事务对象 31

5.1.3、Command对象 31

5.2、元数据与Command构造器 32

5.2.1、表结构查询 32

5.2.2、查询条件对象 33

5.2.1、Command构造器 33

5.3、ORM(ActiveRecord) 34

5.3.1、表的元数据信息 34

5.3.2、单表ORM 34

5.3.3、多表ORM 36

5.3.4、CModel与CValidator 37

6、视图层 38

6.1、视图渲染流程 38

6.2、Widget 39

6.3、客户端脚本组件 40

1、引言

1.1、Yii简介

Yii的作者是美籍华人“薛强”,他原是PRado核心开发成员之一。2008年薛强另起炉灶,开发了Yii框架,于2008年12月3日发布了Yii1.0版本。

Yii是目前比较优秀的PHP框架之一,它的支持的特性包括:MVC、DAO/ActiveRecord、I18N/L10N、caching、Ajax支持、用户认证和基于角色的访问控制、脚手架、输入验证、部件、事件、主题化以及Web服务等。

Yii的很多思想参考了其它一些比较优秀的Web框架(我们写东西时是不是也喜欢参考别人的?有木有?嘿嘿,都喜欢站在别人的肩膀上干活!),下面是一个简短的列表:

框架名称

参考思想

Prado

基于组件和事件驱动编程模式、数据库抽象

层、模块化的应用架构、国际化和本地化等

RubyonRails

配置思想、基于ActiveRecord的ORM

jQuery

集成了jQuery

Symfony

过滤设计和插件架构

Joomla

模块化设计和信息翻译方案

1.2、本文内容与结构

本文对Yii1.1.8版本的源代码进行了深入的分析,本文的内容与结构为:组件化与模块化:对Yii的基于组件和事件驱动编程模式的基础类(CComponent)进行分

析;对组件化和模块化的工作原理进行分析;对WebApp应用创建Controller流程等进行分析。

系统组件:对Yii框架自带的重要组件进行分析,主要包括:日志路由组件、Url管理组件、异常处理组件、Cache组件、基于角色的访问控制组件等。

控制器层:控制器主要包含Action和Filter,对Action与Filter的工作原理进行分析。模型层:对DAO层、元数据和Command构造器、ORM的原理进行分析

视图层:对视图层的渲染过程、Widget和客户端脚本组件等进行分析

本文档中的错误或不妥之处在所难免,殷切希望本文档的读者给予批评指正!

2、组件化与模块化

2.1、框架加载和运行流程

start

加载YiiBase.php1、安装autoload方法,为类的实例化做准备2、获得框架所有类的路径(Yii1.1.8共208类)

根据ActionId创建Action对象1、从成员函数中寻找Action2、从ActionMap中寻找Action

加载request组件

(Get,Post,Cookie)

创建Action 否异是否成功? 常

创建WebApp实例1、初始化别名:application、webroot、ext2、安装异常处理句柄,抛异常时交给异常处理组件来处理3、配置核心组件:urlManager、errorHandler、session、db等4、根据配置信息来配置组件、子模块、WebApp成员属性等5、加载preload组件:log组件、request组件等

运行WebApp

1、触发onBeginRequest事件

加载Url管理组件根据配置信息分析url,解析出路由:route=ControllerId/ActionId

根据ControllerId创建控制器1、从ControllerMap中寻找2、从子模块中寻找3、从ControllerPath中寻找

创建控制器 抛是否成功?否异

根据filters()配置,创建出当前Action的所有Filter对象

运行Filter1的preFilter方法运行Filter2的preFilter方法

检查Get参抛数与Action否异的参数是否常

一致

运行Action

Partialrender

渲染出核心部分的html

Layoutrender

渲染出整体的html