相关的YII类:
CActiveRecord
CActiveRecordBehavior
cache
Active Record
Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术。Yii DAO 可以处理几乎任何数据库相关的任务,不过对于一些基本的CRUD,YII推荐使用Active Record。
CActiveRecord 提供了几个占位符方法,它们可以在子类中被覆盖以自定义其工作流。
beforeValidate 和
beforeSave 和 afterSave: 这两个将在保存 AR 实例之前和之后被调用。
beforeDelete 和 afterDelete: 这两个将在一个 AR 实例被删除之前和之后被调用。
afterConstruct: 这个将在每个使用 new 操作符创建 AR 实例后被调用。
beforeFind: 这个将在一个 AR 查找器被用于执行查询(例如 find(), findAll())之前被调用。 1.0.9 版本开始可用。
afterFind: 这个将在每个 AR 实例作为一个查询结果创建时被调用。
缓存
缓存是用于提升网站性能的一种即简单又有效的途径。通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间。
实现代码
YiicmsActiveRecord.php 继承 CActiveRecord.php
/** * Base class for all active records * @author biner * @since 1.1 * @package Yiicms.log * */ abstract class YiicmsActiveRecord extends CActiveRecord { public function behaviors() { return array( // YII AR的事件行为 'YiicmsActiveRecordBehavior' ); } /** * 获得model的类名 */ public function getModelClass() { $modelclass = get_class($this); return $modelclass; } /** * 获得某行记录的缓存键值 */ public function getCacheKey($pk = '') { $modelclass = $this->getModelClass(); $model_pk = $this->getPrimaryKey(); $pk = $model_pk?$model_pk:$pk; $key = 'resource_'.$modelclass.'_'.$pk; //var_dump($key);die; return $key; } /** * 重写findByPk方法,如果缓存存在数据,则直接读取缓存 * 在YiicmsActiveRecordBehavior中,一旦有数据更新则删除缓存 */ public function findByPk($pk,$condition='',$params=array()) { $key = $this->getCacheKey($pk); //Yii::app()->cache->delete($key); $resource=Yii::app()->cache->get($key); if($resource===false) { $resource=parent::findByPk($pk,$condition,$params); Yii::app()->cache->set($key,$resource); // 因为在缓存中没找到,重新生成 $value // 再缓存一下以备下次使用 // Yii::app()->cache->set($id,$value); } return $resource; } }
YiicmsActiveRecordBehavior.php 继承CActiveRecordBehavior类
/** * Base class for all active records * @author biner * @since 1.1 * @package Yiicms.log * */ class YiicmsActiveRecordBehavior extends CActiveRecordBehavior { private $_oldattributes = array(); public function beforeSave($event) { //删除缓存 $key = $this->Owner->getCacheKey(); Yii::app()->cache->delete($key); $attributes = $this->Owner->getAttributes(); $this->setOldAttributes($attributes); } }
Product.php 继承 YiicmsActiveRecord
/** * 脚手架自动生成的AR修改为继承YiicmsActiveRecord * */ class Product extends YiicmsActiveRecord { //...... //..... }