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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:11