为何Laravel路由模型绑定访问存在的记录却返回404错误?
Laravel路由模型绑定返回404问题排查
以下是几种可能的原因及解决办法:
访问路径不匹配
你定义的路由是/posts/archived/{post},但你访问的是/posts/1——路径缺少了/archived分段,正确的访问地址应为/posts/archived/1,先确认访问路径和路由定义完全一致。模型启用软删除,目标记录已被软删除
如果Post模型使用了SoftDeletestrait,默认路由模型绑定只会查询未被软删除的记录。若目标记录是已归档(软删除)状态,需调整查询逻辑:- 方式1:在
Post模型中添加全局作用域(适用于所有路由需要包含软删除记录的场景)protected static function booted() { static::addGlobalScope('withTrashed', function ($query) { $query->withTrashed(); }); } - 方式2:自定义当前路由的模型绑定(仅针对该路由生效)
Route::get('/posts/archived/{post}', [PostController::class, 'show'])->bind(function ($value) { return Post::withTrashed()->findOrFail($value); });
- 方式1:在
路由模型绑定的主键不匹配
确认Post模型的主键字段是否为默认的id:- 若模型自定义了主键(比如
slug),需在模型中声明:protected $primaryKey = 'slug'; - 或者在路由中明确指定绑定字段:
Route::get('/posts/archived/{post:id}', [PostController::class, 'show']);
- 若模型自定义了主键(比如
路由缓存未清除
若之前生成过路由缓存,修改路由后需执行命令清除缓存:php artisan route:clear路由优先级冲突
确保这条路由没有被更靠前的通用路由(比如Route::get('/posts/{id}', ...))覆盖,Laravel按路由定义顺序匹配,需将更具体的路由放在前面。
内容的提问来源于stack exchange,提问作者Pwned
相关产品推荐
相关产品推荐

