@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. Где допущена ошибка? Может есть способы более качественно идентифицировать гостя?
  • Вопрос задан
  • 3123 просмотра
Пригласить эксперта
Ответы на вопрос 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, чтобы избежать накрутку. Также дополнительно подстраховался куками. Куки как основное "хранилище" не совсем подходят.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы