Yii ActiveRecord中的beforeFind()和缓存

时间:2018-09-10 15:12:59

标签: activerecord yii redis

在某些模型类中,我想实现缓存。我想这样做:

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());
}

不好,琐碎,导致很多分支。

1 个答案:

答案 0 :(得分:1)

您不应为此使用beforeFind()。除了实施中的技术问题外,您可能还会得到许多副作用,并且因此很难调试错误。那是因为缓存可能已过期,并且许多内部Yii逻辑可能依赖于假设,即findByAttributes()(和其他方法)总是从数据库中获取新数据。您也将无法忽略缓存并直接从数据库获取模型。


通常,您有2个选择:

1。使用CActiveRecord::cache()

$model = UsersModel::model()->cache(60)->findByAttributes([...])

这将查询缓存结果60秒。

2。自定义助手

您可以添加自定义方法,以简化使用缓存的活动记录的过程:

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([...]);