Laravel 10 如何创建美观URL替换带查询参数的路由?
Laravel 自定义美观路由替代查询参数方案
针对你需要替换带查询参数的URL(domain.com/posts?status=trashed)为更美观URL的需求,以下提供两种可行方案,基于你已有的Route::resource路由进行扩展:
方案一:domain.com/posts/status/trashed 形式
这种方式适合后续扩展其他状态(如published、draft等),路由结构更具扩展性。
1. 添加自定义路由
注意必须将自定义路由放在resource路由之前,避免被resource的默认路由覆盖:
// 自定义状态路由,支持传递status参数 Route::get('posts/status/{status}', [PostController::class, 'index'])->name('posts.status'); // 原有的资源路由 Route::resource('posts', PostController::class);
2. 修改控制器逻辑
复用index方法,根据传入的status参数处理查询逻辑:
use Illuminate\Http\Request; use App\Models\Post; public function index(Request $request, $status = null) { $query = Post::query(); // 处理软删除文章的查询 if ($status === 'trashed') { $query->onlyTrashed(); } // 可扩展其他状态,例如: // elseif ($status === 'published') { // $query->where('status', 'published'); // } $posts = $query->get(); return view('posts.index', compact('posts')); }
如果不想复用index方法,也可以单独创建trashed方法:
路由调整:
Route::get('posts/status/trashed', [PostController::class, 'trashed'])->name('posts.trashed'); Route::resource('posts', PostController::class);
控制器新增方法:
public function trashed() { $posts = Post::onlyTrashed()->get(); // 可复用原index视图,或单独创建trashed专属视图 return view('posts.index', compact('posts')); }
方案二:domain.com/posts-trashed 形式
这种方式更简洁,适合仅需要展示软删除文章的场景。
1. 添加自定义路由
同样放在resource路由之前:
Route::get('posts-trashed', [PostController::class, 'trashed'])->name('posts.trashed'); Route::resource('posts', PostController::class);
2. 控制器方法
和方案一中的trashed方法一致:
public function trashed() { $posts = Post::onlyTrashed()->get(); return view('posts.index', compact('posts')); }
内容的提问来源于stack exchange,提问作者Nhân Nguyễn Duy
相关产品推荐
相关产品推荐

