如何在验证失败和通过验证时在 laravel 验证中创建回调?
How to create a callback in laravel validation when it failed-validated and passed-validated?
我的自定义请求文件中有一个验证。
class AuthRequest extends FormRequest
{
public function store()
{
return $this->validate([
'first_name' => ['required','min:2','max:30',new PersonNameRule],
'last_name' => ['required','min:2','max:30',new PersonNameRule],
'username' => ['required','confirmed',new UsernameRule]
]);
}
public function rules(){ return []; }
}
在我的控制器中,它是这样使用的。
public function store(AuthRequest $request)
{
$data = $request->store();
return request()->all();
}
我的问题是如何执行以下操作:
- 验证失败时 - 创建会话/
session(['attempt' => session('attempt')+1 ?? 1]);
- 验证通过后 - 销毁会话/
session()->forget('attempt')
您可以使用 Validator
实例而不是调用 validate()
$validator = Validator::make($request->all(), [
'first_name' => ['required','min:2','max:30',new PersonNameRule],
'last_name' => ['required','min:2','max:30',new PersonNameRule],
'username' => ['required','confirmed',new UsernameRule]
]);
if ($validator->fails()) {
// create a session
} else {
// destroy the session
}
您可以在此处的文档中查看更多信息:https://laravel.com/docs/7.x/validation#manually-creating-validators
首先我会将您的验证转换为表单请求,这将在注入控制器时自动解析。
UserCreateRequest extends FormRequest {
public function rules() {
'first_name' => ['required','min:2','max:30',new PersonNameRule],
'last_name' => ['required','min:2','max:30',new PersonNameRule],
'username' => ['required','confirmed',new UsernameRule]
}
}
要使用它,请像这样注入它。
public create(UserCreateRequest $request) {
...
}
您可以在表单请求中使用两种回调方法 passedValidation()
和 failedValidation()
。
protected function failedValidation(Validator $validator) {
session(['attempt' => session('attempt')+1 ?? 1]);
return parent::failedValidation($validator);
}
protected function passedValidation() {
session()->forget('attempt')
return parent::passedValidation();
}
@mrhn是对的,你没有在函数里面填规则,所以FormRequest
总是returnfalse。相反,您更喜欢创建自己的方法并使用 $this->validate()
。
下面是解决问题的方法,在文件 ..\Illuminate\Validation\Validator.php 中找到 validate()
函数,然后将它们放入您想要执行的会话,如下所示。
public function validate()
{
if ($this->fails()) {
session(['attempt' => session('attempt')+1 ?? 1]);
throw new ValidationException($this);
}else{
session()->forget('attempt');
}
return $this->validated();
}
The solution above is global which means it will perform everytime you use $this->validate()
.
我的自定义请求文件中有一个验证。
class AuthRequest extends FormRequest
{
public function store()
{
return $this->validate([
'first_name' => ['required','min:2','max:30',new PersonNameRule],
'last_name' => ['required','min:2','max:30',new PersonNameRule],
'username' => ['required','confirmed',new UsernameRule]
]);
}
public function rules(){ return []; }
}
在我的控制器中,它是这样使用的。
public function store(AuthRequest $request)
{
$data = $request->store();
return request()->all();
}
我的问题是如何执行以下操作:
- 验证失败时 - 创建会话/
session(['attempt' => session('attempt')+1 ?? 1]);
- 验证通过后 - 销毁会话/
session()->forget('attempt')
您可以使用 Validator
实例而不是调用 validate()
$validator = Validator::make($request->all(), [
'first_name' => ['required','min:2','max:30',new PersonNameRule],
'last_name' => ['required','min:2','max:30',new PersonNameRule],
'username' => ['required','confirmed',new UsernameRule]
]);
if ($validator->fails()) {
// create a session
} else {
// destroy the session
}
您可以在此处的文档中查看更多信息:https://laravel.com/docs/7.x/validation#manually-creating-validators
首先我会将您的验证转换为表单请求,这将在注入控制器时自动解析。
UserCreateRequest extends FormRequest {
public function rules() {
'first_name' => ['required','min:2','max:30',new PersonNameRule],
'last_name' => ['required','min:2','max:30',new PersonNameRule],
'username' => ['required','confirmed',new UsernameRule]
}
}
要使用它,请像这样注入它。
public create(UserCreateRequest $request) {
...
}
您可以在表单请求中使用两种回调方法 passedValidation()
和 failedValidation()
。
protected function failedValidation(Validator $validator) {
session(['attempt' => session('attempt')+1 ?? 1]);
return parent::failedValidation($validator);
}
protected function passedValidation() {
session()->forget('attempt')
return parent::passedValidation();
}
@mrhn是对的,你没有在函数里面填规则,所以FormRequest
总是returnfalse。相反,您更喜欢创建自己的方法并使用 $this->validate()
。
下面是解决问题的方法,在文件 ..\Illuminate\Validation\Validator.php 中找到 validate()
函数,然后将它们放入您想要执行的会话,如下所示。
public function validate()
{
if ($this->fails()) {
session(['attempt' => session('attempt')+1 ?? 1]);
throw new ValidationException($this);
}else{
session()->forget('attempt');
}
return $this->validated();
}
The solution above is global which means it will perform everytime you use
$this->validate()
.