在某些模型类中,我想实现缓存。我想这样做:
UsersModel::model()->findByAttributes([...])
在该类中,我想重写方法beforeFind()
以便首先将请求发送到缓存服务器,但是似乎该方法不需要任何其他参数,也没有具有属性的对象。
在顶级代码中添加其他条件/检查,例如:
$response = Yii::app()->cache->get('userUserLogin');
if(empty($response) == true) {
//fetch data from db and set to cache
$userModel = UsersModel::model->findByAttributes([...])
Yii::app()->cache->set('user' . $userModel->username, $userModel->getAttributes());
}
不好,琐碎,导致很多分支。
答案 0 :(得分:1)
您不应为此使用beforeFind()
。除了实施中的技术问题外,您可能还会得到许多副作用,并且因此很难调试错误。那是因为缓存可能已过期,并且许多内部Yii逻辑可能依赖于假设,即findByAttributes()
(和其他方法)总是从数据库中获取新数据。您也将无法忽略缓存并直接从数据库获取模型。
通常,您有2个选择:
CActiveRecord::cache()
$model = UsersModel::model()->cache(60)->findByAttributes([...])
这将查询缓存结果60秒。
您可以添加自定义方法,以简化使用缓存的活动记录的过程:
public static function findByAttributesFromCache($attributes = []) {
$result = Yii::app()->cache->get(json_encode($attributes));
if ($result === false) {
//fetch data from db and set to cache
$result = static::model()->findByAttributes($attributes);
Yii::app()->cache->set(json_encode($attributes), $result, 60);
}
return $result;
}
您可以将这种方法添加到特征中,并在多个模型中重复使用。然后,您只需要:
$userModel = UsersModel::findByAttributesFromCache([...]);