我想使用甜蜜的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
也将被接受。
答案 0 :(得分:1)
您可以像这样在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