beforeFind () в Yii ActiveRecord и кеш - PullRequest
       4

beforeFind () в Yii ActiveRecord и кеш

0 голосов
/ 10 сентября 2018

В некоторых модельных классах я хочу реализовать кеш.И я хотел сделать это следующим образом:

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 голосов
/ 11 сентября 2018

Вы не должны использовать 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([...]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...