在 laravel 中将当前实例传递给验证器

Pass current instance to validator in laravel

在 laravel 5.3 中,我可以作为模型规则当前实例的参数传递吗?

我想要检查模型中某些字段的当前值并允许或拒绝将此字段设置为另一个值的规则。

问题是:验证器只收到新值,但我还想检查旧值。

如果我没理解错的话,您可能会想到 exists 验证规则?在 Laravel 文档中:https://laravel.com/docs/5.3/validation#rule-exists

您可以使用merge 方法在验证前添加旧值。

public function store(Request $request) 
{
     $request->merge(['old_key' => 'Value']);
     $this->validate($request, [
         'old_key' => 'required'
     ]);
}

如果这仍然是必要的:

您可以使用静态方法 Illuminate\Support\Facades\Validator::make 的第四个参数 $customAttributes。在这个论点中,你可以传递任何你想要的东西,在你的情况下 - 模型的特定实例:

$order = new Order(); // <!-- create or load for DB instance of your model

/*
 * create validator for validation of the some $requestForValidation
 * by some $validationRules
*/
$validator = \Illuminate\Support\Facades\Validator::make($requestForValidation,
$validationRules, [], [
    'instance' => $order,
]);

并且在您的自定义验证规则中,您可以像这样访问此自定义属性:

Validator::extend('customValidationRule', function ($attribute, $value, 
$parameters, $validator) {
    $validator->customAttributes['instance']; // <!-- here is your instance
});