我如何在Laravel中创建一个安全的upvote / downvote系统,例如reddits,甚至是无法用假ajax请求加载的堆栈溢出。 (对不起,如果我不知道该术语)。
我有3张桌子:
**User**
id
**Post**
id
**Vote**
id
user_id
post_id
vote (int)
我的一般想法是,当单击“ upvote”或“ downvote”按钮时,使用JQuery使用具有post_id和表决的POST数据来触发AJAX,其中1代表upvote,-1代表downvote。这将通过VotesController @ vote路线选择。表决方法将检查用户是否已通过身份验证,检查是否有来自同一用户和同一帖子的表决,以及表决是否存在:更改(下降),否则将添加(上升)。
继承人我的伪码
function vote()
{
//Checks if user is logged in
if(Auth::check()){
//checks if ajax request
if (Request::ajax())
{
//get my data
$post = Input::post('post');
$vote = Input::post('vote');
$user = Auth::user()->id;
//checks if user voted
$vote = querythatisnotyetcoded
//if row exists
if($vote->count() > 0){
//change row AKA DOWNVOTE
Vote->vote = $vote // however you change values
}
else{
//add new row AKA UPVOTE
Vote::create([
'user_id' => $user,
'post_id' => $post,
'vote' => $vote
]);
}
}
else{
return "No Ajax Request";
}
}
else{
return "Not logged in";
}
}
请让我知道该逻辑是否安全。
*编辑:不知道为什么我的代码是半褐色的(已修复!)
最佳答案
这样的事情应该可以解决问题。
function vote()
{
if (Auth::check()) {
if (Request::ajax())
{
$post = Input::post('post');
$vote = Input::post('vote');
$user = Auth::user()->id;
// Grab the vote if it already exists.
$entry = Vote::where('user_id', $user)->where('post_id', $post)->first();
if ($entry->count())
{
$entry->vote = $vote;
$entry->save();
}
else
{
$entry = new Vote;
$entry->user_id = $user;
$entry->post_id = $post;
$entry->save();
}
}
else
{
return "Not an AJAX request.";
}
}
else
{
return "User not logged in.";
}
}