Laravel 9:访问Show路由时重定向至Edit路由的实现问题
解决Laravel 9中资源路由show路径重定向到edit的问题
你遇到的问题核心是路由匹配顺序和针对性路由定义的问题,之前的Route::redirect没生效大概率是因为放在了资源路由之后,Laravel没机会匹配到它。下面给你两种可行的解决方式:
方式一:逐个资源定义重定向路由
在你的资源路由之前,单独为每个资源的show路径写重定向逻辑,这样能优先匹配到请求:
// 先定义currencies的show路径重定向 Route::get('currencies/{currency}', function ($id) { return redirect()->route('currencies.edit', $id); }); // 再定义items的show路径重定向 Route::get('items/{item}', function ($id) { return redirect()->route('items.edit', $id); }); // 你的原有资源路由(放在重定向路由之后) Route::resources([ 'currencies' => 'CurrencyController', 'items' => 'ItemController', ], [ 'except' => ['show'] ]);
如果你用了路由模型绑定(比如控制器edit方法接收模型实例),可以改成更严谨的写法,自动验证资源是否存在:
// 引入模型类 use App\Models\Currency; use App\Models\Item; Route::get('currencies/{currency}', function (Currency $currency) { return redirect()->route('currencies.edit', $currency); }); Route::get('items/{item}', function (Item $item) { return redirect()->route('items.edit', $item); });
这种写法下,如果用户输入的id不存在,会直接返回404,不会跳转到不存在的edit页面。
方式二:正则批量匹配重定向
如果资源较多,不想逐个写路由,可以用正则匹配批量处理,同时限制只匹配指定资源:
Route::get('{resource}/{id}', function ($resource, $id) { // 只允许我们定义的资源进行重定向,避免干扰其他路由 $validResources = ['currencies', 'items']; if (!in_array($resource, $validResources)) { abort(404); } // 拼接对应的edit路由名称并跳转 return redirect()->route("{$resource}.edit", $id); })->where('resource', 'currencies|items'); // 正则限制resource只能是这两个值 // 原有资源路由 Route::resources([ 'currencies' => 'CurrencyController', 'items' => 'ItemController', ], [ 'except' => ['show'] ]);
关键注意点
- 所有重定向路由必须放在资源路由之前,因为Laravel是按路由定义顺序匹配的,先定义的路由会优先被匹配。
- 如果你之前用
Route::redirect('items/{id}', 'items/{id}/edit')没生效,本质也是顺序问题,把它移到资源路由前面就能正常工作,比如:
这里加Route::redirect('items/{id}', 'items/{id}/edit', 301); Route::redirect('currencies/{id}', 'currencies/{id}/edit', 301); Route::resources(...);301是指定永久重定向,对SEO更友好,不加的话默认是302临时重定向。
内容的提问来源于stack exchange,提问作者MJ Khan
相关产品推荐
相关产品推荐

