Laravel中基于admin_id删除Blog的问题排查与修复
问题排查&修复方案
存在的错误点
- 全局拼写错误:请求类名
DeeleteBlogRequest多写了一个e,正确应为DeleteBlogRequest,所有引用该类的地方都要同步修改 - 参数传递错误:
DeleteBlogAction调用DeleteBlogTask::run()时传入了完整的请求对象,但是DeleteBlogTask::run()声明接收的是博客ID参数 - 逻辑冗余错误:
DeleteBlogTask中已经通过ID查询到了博客实例,不需要再重复查询赋值admin_id,原有赋值语句的where条件传入模型对象,完全不符合语法逻辑 - 异常场景无处理:管理员ID校验不通过时没有抛出异常,接口直接返回204无内容,用户无法感知权限不足错误
- 删除逻辑错误:如果
$repository是博客模型实例,调用delete($id)不会生效,模型的delete()方法不需要传主键参数,直接调用实例的delete()方法即可
修复后代码
1. 修正请求类名 & 文件名
将DeeleteBlogrequest.php重命名为DeleteBlogRequest.php,类名同步修改:
public function rules(): array { return [ 'id' => 'required|integer' // 补充整数校验更严谨 ]; }
2. 修正BlogsContainer.php
// 先修正请求类拼写 public function deleteBlog(DeleteBlogRequest $request){ app(DeleteBlogAction::class)->run($request); return $this->noContent(); }
3. 修正DeleteBlogAction.php
// 先修正请求类拼写 public function run(DeleteBlogRequest $request) { // 从请求中取出ID传递给Task,而非传递整个请求对象 return app(DeleteBlogTask::class)->run($request->input('id')); }
4. 修正DeleteBlogTask.php
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; class DeleteBlogTask extends Task { protected BlogsModel $repository; public function __construct(BlogsModel $repository) { $this->repository = $repository; } public function run($id) { // 直接查询博客实例 $blog = $this->repository->findOrFail($id); // 获取当前登录管理员ID $token = JWTAuth::getToken(); $details = JWTAuth::getPayload($token)->toArray(); $adminId = $details["sub"]; // 校验权限,不通过直接抛出403异常 if($adminId !== $blog->admin_id){ throw new AccessDeniedHttpException('你没有权限删除该博客'); } // 直接调用实例删除方法 return $blog->delete(); } }
内容的提问来源于stack exchange,提问作者Devops Training
相关产品推荐
相关产品推荐

