Laravel 5.7。路由模型绑定验证

时间:2019-04-19 17:04:31

标签: php laravel laravel-5 eloquent laravel-validation

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

也将被接受。

1 个答案:

答案 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