如何仅在用户为管理员时为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
相关产品推荐
相关产品推荐

