我想使用甜蜜的Laravel模型绑定,然后对模型本身运行一些复杂的验证检查。
就像是
Route::post('/do-something/{something}', 'SomeController@store');
和
$request->validate([
'something' => [
new MyFirstVeryComplexRule,
new MySecondVeryComplexRule,
new MyThirdVeryComplexRule,
//...
],
]);
我假设,传递给每个规则的$value
将是App\Something
类的一个实例。
有可能实现吗?
我能想到的最接近的选择是传递模型的id
然后在每个规则实例中运行App\Some::find($value)
,但这会导致性能下降并且不可扩展。
回答
不,这是不可能的,因为x,y,z,尝试a,b,c
也将被接受。
您可以在RouteServiceProvider
中创建自定义绑定,如下所示:
public function boot()
{
parent::boot();
Route::bind('something', function ($value) {
$instance = Model::find($value) ?? abort(404);
$validator = Validator::make([
'something' => $instance,
], [
'something' => [
new MyFirstVeryComplexRule,
new MySecondVeryComplexRule,
new MyThirdVeryComplexRule
]
]);
if ($validator->errors()->any()) {
// perform on error tasks
}
return $instance;
});
}
然后每个规则的$value
将接收您的模型的实例。
有关更多信息,您可以查看路径模型绑定下的自定义分辨率逻辑:https://laravel.com/docs/5.8/routing#route-model-binding