@Frapsy

Как лучше хранить временную информацию в Yii2?

У постов есть рейтинг. Поднять рейтинг поста может не только пользователь, но и гость. Необходимо сделать так, чтобы поднять рейтинг можно было только 1 раз в сутки. Если это пользователь, поднятие рейтинга контролируется с помощью БД, но как быть с гостями? Первое, что приходит в голову, это использовать куки, в контроллере делаю так:
if(!Yii::$app->request->isAjax)
    return json_encode(['status'=>'err_3']);

// если гость

if(!isset(Yii::$app->request->cookies['like_' . $id])) { // $id - ид поста
    Yii::$app->response->cookies->add(new \yii\web\Cookie([
        'name'=>'like_' . $id,
        'value'=>1,
        'expire'=>86400,
    ]));
    // повышаем рейтинг и возвращаем 'ok'
}


Проблема заключается в том, что isset(Yii::$app->request->cookies['like_' . $id]) постоянно возвращает false. Где допущена ошибка? Может есть способы более качественно идентифицировать гостя?
  • Вопрос задан
  • 3118 просмотров
Пригласить эксперта
Ответы на вопрос 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ну как минимум не храните подобное в куках.
Ответ написан
Folour
@Folour
а path одинаков?
Ответ написан
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
храни эти данные в кеше, например redis, выставляй таймаут сутки, значение втоматём удалится через 24 часа, тебе даже делать ничего не надо будет, просто проверяй есть ли оно в базе редиса.
Ответ написан
Комментировать
@AlexGx
Yii2 developer, business analytics
Я бы хранил инфу по гостю в бд (или кеше), возможно формат таблицы бд прийдется расширить (добавить флаг гостя, или в user_id записывать 0 в случае гостя) с привязкой к браузеру и IP, чтобы избежать накрутку. Также дополнительно подстраховался куками. Куки как основное "хранилище" не совсем подходят.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы