Laravel 5.5无法在Request类中生成验证器

时间:2018-02-03 11:30:15

标签: laravel laravel-5 custom-validators

我想检查一下表单是否输入' departement'只有两个“villes”才会被填充。有相同的名字。

在控制器中,这段代码完全可以理解:

 $rules=[  'nom' => 'required', 'ville'=> 'required|exists:villes,nom'];
 $messages = [
      'depart.required' => 'Deux villes portent le même nom, preciser le 
 département'];
  $validator = Validator::make($request->All(), $rules,$messages);
  $validator->sometimes('depart_id', 'required|exists:departs,id', function 
  ($input) {
      return Ville::where('nom',$input->ville)->count()>1;
  });
  if ($validator->fails()) {
    return redirect('admin/etab/create')
            ->withErrors($validator)
            ->withInput();
    }

我将相同的代码放在Form Request类中:

public function rules()
{
  $rules=[  'nom' => 'required', 'ville'=> 'required|exists:villes,nom'];
  $messages = [
      'depart.required' => 'Deux villes portent le même nom, preciser le 
  département',
  ];
  $validator = Validator::make($this->All(), $rules,$messages);
  $validator->sometimes('depart_id', 'required|exists:departs,id', function 
  ($input) {
      return Ville::where('nom',$input->ville)->count()>1;
  });
  return $validator;
}

我得到"Type error: Argument 2 passed to Illuminate\Validation\Factory::make() must be of the type array, object given,"我认为错误信息不足,但我找不到为什么这种方式不起作用

谢谢......

2 个答案:

答案 0 :(得分:1)

您可以查看FormRequest中的vendor/laravel/framework/src/Illuminate/Foundation/Http/FormRequest.php课程并查看它的作用。

它在顶部包含这两种方法:

/**
 * Get the validator instance for the request.
 *
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function getValidatorInstance()
{
    $factory = $this->container->make(ValidationFactory::class);

    if (method_exists($this, 'validator')) {
        $validator = $this->container->call([$this, 'validator'], compact('factory'));
    } else {
        $validator = $this->createDefaultValidator($factory);
    }

    if (method_exists($this, 'withValidator')) {
        $this->withValidator($validator);
    }

    return $validator;
}

/**
 * Create the default validator instance.
 *
 * @param  \Illuminate\Contracts\Validation\Factory  $factory
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function createDefaultValidator(ValidationFactory $factory)
{
    return $factory->make(
        $this->validationData(), $this->container->call([$this, 'rules']),
        $this->messages(), $this->attributes()
    );
}

因此,您基本上可以在自己的FormRequest类中提供validator方法来创建自定义Validator对象,该方法将ValidatorFactory作为参数。

在您的情况下,您不需要这样做,因为您只想将sometimes规则附加到默认验证器。查看上面的代码,它检查withValidator方法是否存在,如果存在,则调用它:

    if (method_exists($this, 'withValidator')) {
        $this->withValidator($validator);
    }

您可以创建FormRequest,确保正确使用rulesmessagesauthorize方法,例如规则和消息返回数组,授权返回一个bool。

然后创建一个withValidator方法,在其中将有时规则附加到Validator。

/**
 * Do foo with Validator
 *
 * @param \Illuminate\Contracts\Validation\Validator $validator
 * @return void
 */
public function withValidator(Validator $validator)
{
    $validator->sometimes('depart_id', 'required|exists:departs,id', function {
        return Ville::where('nom', $this->input('ville'))->count() > 1;
    });
}

这种方式sometimes在执行验证之前附加到验证器。

答案 1 :(得分:0)

您没有将所有验证逻辑放在规则方法中。只有规则定义去那里。所有你需要的是:

public function rules()
{
  'nom' => 'required', 
  'ville'=> 'required|exists:villes,nom'
}

Laravel将从那里开始处理验证。使用Validator时,您无需手动创建FormRequests课程。

自定义消息涉及在类中创建messages方法,如下所示:

public function messages()
{
    return [
        'depart.required' => 'Deux villes portent le même nom, preciser le départemen'
    ];
}

<强>更新

对于sometimes规则,我建议创建一个Rule对象并自定义如何检查具有相同名称的2个vills。

Rule classes