Php 拉威尔5.7。路由模型绑定验证

Php 拉威尔5.7。路由模型绑定验证,php,laravel,laravel-5,eloquent,laravel-validation,Php,Laravel,Laravel 5,Eloquent,Laravel Validation,我想使用sweet Laravel模型绑定,然后对模型本身运行一些复杂的验证检查 差不多 Route::post('/dosomething/{something}','SomeController@store'); 及 我假设传递给每个规则的$value将是App\Something类的一个实例 有可能做到这一点吗 我能想到的最接近的选项是传递模型的id,然后在每个规则实例中运行App\Some::find($value),但这会降低性能,并且不可扩展 答复 不,这是不可能的,因为x,y,z,

我想使用sweet Laravel模型绑定,然后对模型本身运行一些复杂的验证检查

差不多

Route::post('/dosomething/{something}','SomeController@store');

我假设传递给每个规则的
$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
将接收模型的实例

有关更多信息,您可以查看路由模型绑定下的自定义解析逻辑:

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;
    });
}