You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:54:00