如何在Laravel中基于Cookie实现文章10小时内不可重复点赞功能
实现逻辑说明
- Cookie中存储的
like字段采用逗号分隔的文章ID字符串格式,方便存取多条已点赞文章的记录 - 核心校验流程:
- 读取Cookie中已点赞的文章ID列表
- 校验当前请求的文章ID是否在列表中
- 不存在则执行点赞+新增Cookie记录,存在则直接返回不做操作
完整代码示例
// 1. 从请求中获取当前要点赞的文章ID,可根据你实际的参数名调整 $articleId = request()->input('article_id'); // 2. 读取已点赞Cookie记录 $likes = Request::cookie('like'); // 3. 转为已点赞文章ID数组,Cookie不存在时默认空数组 $likedArticles = !empty($likes) ? explode(',', $likes) : []; $minutes = 600; // 4. 校验是否已点赞 if (!in_array($articleId, $likedArticles)) { // 未点赞:执行点赞操作,对应文章like字段+1,替换为你自己的模型类名即可 \App\Models\Article::where('id', $articleId)->increment('like'); // 把当前文章ID加入已点赞列表 $likedArticles[] = $articleId; // 转成逗号分隔字符串准备写入Cookie $newLikesStr = implode(',', $likedArticles); // 5. 设置新Cookie,两种常用写法选其一即可 // 写法1:用Cookie队列,后续任意响应都会自动带上该Cookie \Cookie::queue('like', $newLikesStr, $minutes); // 写法2:直接返回响应的场景,用withCookie绑定 // return response()->json(['code' => 0, 'msg' => '点赞成功'])->withCookie(cookie('like', $newLikesStr, $minutes)); } else { // 已点赞:直接返回提示,不更新Cookie有效期 // return response()->json(['code' => 1, 'msg' => '您已经点赞过该文章,10小时后可再次点赞']); }
注意事项
- 基于Cookie的点赞限制属于前端可控的限制方案,用户清空Cookie、切换浏览器/无痕模式可绕过,对防刷要求高的场景需要配合IP、用户账号等维度做多层校验
- Cookie单条存储上限约4KB,按每个文章ID占5位计算可存储近千条点赞记录,10小时有效期内完全够用
- 如果你的项目开启了Laravel默认的Cookie加密,无需额外处理,框架会自动完成加解密逻辑
内容的提问来源于stack exchange,提问作者user16993770
相关产品推荐
相关产品推荐

