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

如何仅在用户为管理员时为Laravel路由添加withTrashed()?

实现仅管理员可使用withTrashed()的Laravel路由方案

首先要明确:路由是在应用启动阶段注册的,此时还未处理用户请求,无法直接通过Auth::user()判断当前用户权限。所以不能直接在路由定义时动态添加withTrashed(),可以通过以下两种思路实现需求:

方法一:拆分路由+控制器内权限判断

1. 注册基础资源路由

先给所有登录用户注册普通的资源路由:

Route::middleware('auth')->resource('post', 'PostController');

2. 单独注册管理员专属的软删除操作路由

为管理员额外添加restore和forceDelete这类软删除相关路由,并通过中间件限制仅管理员访问:

// 假设你已实现验证管理员的中间件「admin」
Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('post/{post}/restore', 'PostController@restore')->name('post.restore');
    Route::delete('post/{post}/force-delete', 'PostController@forceDelete')->name('post.forceDelete');
});

3. 控制器内控制查询范围

在控制器的show、edit等需要查询模型的方法里,根据用户权限决定是否包含软删除数据:

public function show($id)
{
    $query = Post::query();
    if (Auth::user()->isAdmin()) {
        $query->withTrashed();
    }
    $post = $query->findOrFail($id);
    
    // 后续业务逻辑
    return view('posts.show', compact('post'));
}

方法二:利用中间件控制模型查询作用域

1. 注册统一的资源路由

Route::middleware(['auth', 'check.admin.trashed'])->resource('post', 'PostController');

2. 创建自定义中间件

生成中间件CheckAdminTrashed:

php artisan make:middleware CheckAdminTrashed

在中间件的handle方法中添加逻辑:

public function handle(Request $request, Closure $next)
{
    if (Auth::user()->isAdmin()) {
        Post::withTrashed();
    }
    return $next($request);
}

记得在app/Http/Kernel.php中注册该中间件:

protected $routeMiddleware = [
    // 其他中间件
    'check.admin.trashed' => \App\Http\Middleware\CheckAdminTrashed::class,
];

3. 控制器方法无需额外修改

此时控制器的show、index等方法会自动根据用户权限决定是否包含软删除数据,管理员访问时会自动加载软删除的帖子。

注意事项

  • 若使用Laravel 8+的路由语法(类名引用),只需替换控制器类名即可,逻辑完全一致。
  • 管理员中间件admin需自行实现,核心是判断Auth::user()->isAdmin()是否为true。

内容的提问来源于stack exchange,提问作者M.A.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:38:31