在 Route 声明中使用 withTrashed 方法并在模型中使用 resolveRouteBinding 时自定义模型绑定
Custom model binding when using withTrashed method on Route declaration and resolveRouteBinding in Model
我在路由上的隐式模型绑定遇到问题软删除模型 .使用 withTrashed
方法时,不会调用 Model 中的 resolveRouteBinding
方法。当从 路由声明 中删除 withTrashed
方法时,将按预期调用方法 resolveRouteBinding
。
重现步骤:
routes/web.php
Route::get('user/{user}', function(SoftDeletedModel $user) {
dd($user);
})->withTrashed(); //withTrashed is used
Models/SoftDeletedModel.php
use SoftDeletes;
public function resolveRouteBinding($value, $field = null) {
dd("Successfully Substituted Bindings when using WithTrashed."); //This is not displayed.
return parent::resolveRouteBinding($value, $field);
}
这是已知错误还是我哪里出错了?
在 github
上也存在一个 issue
您需要使用此方法 resolveSoftDeletableRouteBinding
而不是 resolveRouteBinding
。
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @param string|null $field
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveSoftDeletableRouteBinding($value, $field = null)
{
return parent::resolveSoftDeletableRouteBinding($value, $field);
}
由于 Laravel v8.55.0,withTrashed()
支持路由:
Route::post('/user/{user}', function (ImplicitBindingModel $user) {
return $user;
})->middleware(['web'])->withTrashed();
我在路由上的隐式模型绑定遇到问题软删除模型 .使用 withTrashed
方法时,不会调用 Model 中的 resolveRouteBinding
方法。当从 路由声明 中删除 withTrashed
方法时,将按预期调用方法 resolveRouteBinding
。
重现步骤:
routes/web.php
Route::get('user/{user}', function(SoftDeletedModel $user) {
dd($user);
})->withTrashed(); //withTrashed is used
Models/SoftDeletedModel.php
use SoftDeletes;
public function resolveRouteBinding($value, $field = null) {
dd("Successfully Substituted Bindings when using WithTrashed."); //This is not displayed.
return parent::resolveRouteBinding($value, $field);
}
这是已知错误还是我哪里出错了? 在 github
上也存在一个 issue您需要使用此方法 resolveSoftDeletableRouteBinding
而不是 resolveRouteBinding
。
/**
* Retrieve the model for a bound value.
*
* @param mixed $value
* @param string|null $field
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveSoftDeletableRouteBinding($value, $field = null)
{
return parent::resolveSoftDeletableRouteBinding($value, $field);
}
由于 Laravel v8.55.0,withTrashed()
支持路由:
Route::post('/user/{user}', function (ImplicitBindingModel $user) {
return $user;
})->middleware(['web'])->withTrashed();