Laravel路由使用withTrashed时模型resolveRouteBinding未触发问题咨询
结论
这是Laravel框架的已知行为,并非代码实现错误。
当路由声明中使用->withTrashed()方法时,Laravel的隐式绑定逻辑会优先执行自带的软删除查询逻辑,直接绕过模型自定义的resolveRouteBinding方法,因此你写在该方法内的代码不会被触发。
解决方案
方案1:将软删除逻辑迁移到resolveRouteBinding内实现
移除路由上的->withTrashed()调用,在模型的resolveRouteBinding方法中自行添加软删除查询规则,既能保留自定义绑定逻辑,也能实现查询已软删除数据的需求。
代码示例:
// routes/web.php 移除withTrashed调用 Route::get('user/{user}', function(SoftDeletedModel $user) { dd($user); });
// Models/SoftDeletedModel.php public function resolveRouteBinding($value, $field = null) { dd("Successfully Substituted Bindings when using WithTrashed."); // 手动添加withTrashed逻辑 return $this->withTrashed() ->where($field ?? $this->getRouteKeyName(), $value) ->firstOrFail(); }
方案2:在路由服务提供者中自定义绑定规则
如果你需要保留路由上的withTrashed()调用,可以直接在app/Providers/RouteServiceProvider.php的boot方法中定义该参数的绑定逻辑,替代模型内的resolveRouteBinding方法:
public function boot() { parent::boot(); Route::bind('user', function ($value) { // 此处可添加任意自定义逻辑 return SoftDeletedModel::withTrashed()->where('id', $value)->firstOrFail(); }); }
内容的提问来源于stack exchange,提问作者dopesky
相关产品推荐
相关产品推荐

