Laravel 5.7。路线模型绑定验证

问题描述 投票:0回答:1

我想使用甜蜜的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

也将被接受。

php laravel laravel-5 eloquent laravel-validation
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.