Brife probe into Yii
浅谈Yii

@tonyzheng
微博: frontnode
QQ: 2080432723
开源地址: github.com/frontnode
Web开发,流程改进,最佳实践,性能优化
-
Yii框架的起源
-
一个浏览器请求的处理过程
- 模型层
- 视图层
-
组件
- 过滤器
-
命令行程序
Yii框架的起源
美籍华人"qiang"于2008年1月开始开发Yii框架(他原来是Prado框架的核心开发成员之一,维护该框架超过3年),Yii框架的设计思想主要来源于(Prado,Ruby on Rails, jQuery, Symfony)
Yii是一个基于组件、用于开发大型Web应用的高性能PHP框架。它将Web编程中的可重用性发挥到极致,能够显著加速开发进程。Yii(读作"易")代表简单(easy)、高效(efficient)、可扩展(extensible)
Yii安装
下载地址 http://www.yiiframework.com/download/
解压后进入framework文件夹,输入命令yiic webapp <DIR>,即在<DIR>目录下生成了网站的框架结构,再将刚才的framework文件夹也移入<DIR>内
一个浏览器请求的处理过程
所有请求 => index.php => create application => 解析url => controller => filters => action => view 或者 ajax返回结果
模型层
模型分类
Yii模型是CModel或其子类的实例。模型用于保持数据以及与其相关的业务逻辑。Yii实现两种类型的模型:表单模型和Active Record
表单模型: 是CFormModel的子类。表单模型用于从用户表单获取数据、进行验证
ActiveRecord: 活动记录是ORM的一种实现方式,主要用于对应关系型数据库里的数据和关系。Yii中的AR类实现必须继承于CActiveRecord。表对应类,对象对应行,列对应属性。
CFormModel
验证规则
return array(
// username and password are required
array('username, password', 'required'),
// rememberMe needs to be a boolean
array('rememberMe', 'boolean'),
// password needs to be authenticated
array('password', 'authenticate'),
);
属性
public $username;
public $password;
public $rememberMe;
private $_identity;
属性标签
return array(
'rememberMe'=>'Remember me next time',
);
HTML表单
1. 原生表单
2. CActiveForm生成表单
查询
findAll() 查出所有的结果集
find() 查询出单条结果集
findAllByAttributes() 按属性查找所有结果集
findByAttributes() 按属性查找单条结果集
findAllBySql() 按原始sql查找所有结果集
findBySql() 按照原始Sql查找单个结果集
findAllByPk() 按pk查找所有结果集
findByPk() 按pk查找所有结果集
新增add()
save()
删除delete()
delelteAll()
deleteAllByAttriutes()
deleteByPk()
更新
update()
updateAll()
updateByPk()
updateCounters()
统计
count()
countByAttributes()
countBySql()
其它
getErrors()
getError()延迟加载与渴求式加载
延迟加载:获取一个AR实例中的关联属性,此属性以前没有被访问过,则一个关联查询将其初始化,它将两个表关联并使用当前AR实例的主键过滤
//获取ID为10的帖子
$post = Post()::model()->findByPk(10);
//获取帖子的作者(author):此处将执行一个关联查询
$author = $post->author;
渴求式加载:获取主AR实例的同时获取关联的AR实例
$criteria = new CDbCriteria;
$criteria->with = array(
'author.username'
);
$posts = Post::model()->findAll($criteria);
关联查询
BELONGS_TO: 如果表A和B之间的关系是一对多,则表B属于表A
HAS_MANY: 如果表A和B之间的关系是一对多,则A有多个HAS_ONE:这是HAS_MANY的一个特例,A最多有一个B
MANY_MANY: 对应于数据库中的多对多关系
过滤器与Action
-
过滤器是控制器的一个成员函数,以filter开头,比如function filterSpend(),那么这个过滤器的名字就是spend
- 可被配置在控制器动作之前或是之后执行
- 一个过滤器作用于多个Action,一个Action可以配置多个过滤器,配置很方便
public function filters()
{
return array(
//这3个Action必须是Ajax请求'ajax + log cache db',// 除了actionLog以外的其它所有Action都需要统计运行时间'spend -log'
);
}
过滤器作用
-
统计:统计各个action每天被访问的次数,统计部分action的耗时
- 访问控制:指定某些action的必须是Ajax访问,指定某些action访问需要的权限或者角色
视图层
视图层就是生成浏览器需要的html代码(中间可能包含js和css)
目前使用模板引擎smarty
Yii中将视图的生成分为3步
content(各个页面不同) => Layout(页面的header和footer) => 添加js,css脚本
小物件
小物件的用法: <?php $this->widget('path.to.widgetclass');?>,它会生成对应的html代码和需要的css以及js。Yii自带了20个左右的常用widget,开源社区目前也贡献了100多个widget。
命令行
所有的命令行程序都继承自CConsoleCommand
配置console.php中需要使用的组件
到/<dir>/protected目录下启动程序 yiic <command_name>
Yii
By frontnode
Yii
Learn how to develop a web application with Yii
- 2,174