我想检查一下表单是否输入' 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,"
我认为错误信息不足,但我找不到为什么这种方式不起作用
谢谢......
答案 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,确保正确使用rules
,messages
和authorize
方法,例如规则和消息返回数组,授权返回一个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。