为了将以下方法用作API方法,除了会话外还能使用什么?

时间:2019-05-27 12:33:09

标签: php laravel api laravel-session

我有一个带有laravel后端和Vue前端的测验应用程序。我正在为该应用程序开发API。但是,我遇到的问题是我需要一个API端点:从“问题”表返回一个问题-但它需要:

  1. 每次调用该方法时都会随机返回一个问题
  2. 不是用户已经看过的问题(除非所有问题都被看到)

到目前为止,我一直在使用shuffle方法对问题集合进行随机化,并依靠Sessions存储未见问题的ID。

但是,由于API调用是无状态的,因此会话将无法工作。我想知道如何解决这个问题?

public function random(Module $module, $category){
    // Get question ids in randomised order (for a given module + category)
    $questions =  Question::CategoryForModule(1, $module->id)->shuffle()->pluck('id');

    // Name and Get unseenQuestions
    $sessionName = 'unseenQuestions_' . $category .  strval($module->id); //unseenQuestions_anatomy_2

    if (session()->has($sessionName)) {
        $unseenQuestions = session()->get($sessionName);

    } else {
        $unseenQuestions = collect($questions);

    }
    // Pop new Question
    $newQuestionID = $unseenQuestions->shift();;

    // Store unseenQuestions OR remove unseenQuestions (if it has no items);
    if ($unseenQuestions->count() == 0) {
        session()->forget($sessionName);
    } else {
        session()->put($sessionName, $unseenQuestions);
    }

    return new QuestionResource(Question::find($newQuestionID));
}

1 个答案:

答案 0 :(得分:0)

您可以采用以下方法之一

  • 对您的API调用进行身份验证:每个用户都有一个令牌,可以对调用进行身份验证。然后,每当您从数据库中提取问题时,用户就将问题存储为seen(在数据库中)
  • 与您的API一起发送一系列seen个问题。应避免使用这种恕我直言的方法,因为它是可利用的,并且您委托客户端决定是否看到问题。

我会选择第一个选项。