Laravel 6 重写 FormRequest 的失败验证方法时'class does not exist'自定义验证错误



我创建了一个位于appHttpRequests的自定义验证类:

<?php
namespace AppHttpRequests;
use AppHttpRequestsBaseFormRequest;
class RegisterUserRequest extends BaseFormRequest
{
protected static $NEEDS_AUTHORIZATION = false;
protected static $FORM_RULES = [
'first_name'              => 'required|string|max:80',
'last_name'               => 'required|string|max:80',
'email'                   => 'required|unique:users|email',
'password'                => 'required|string|min:6|confirmed',
'terms_conditions'        => 'accepted'
];
}

并在同一目录中扩展BaseFormRequest

<?php 
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateValidationValidator;
use IlluminateValidationValidationException;
use IlluminateHttpExceptionsHttpResponseException;
//use IlluminateHttpRequest;
abstract class BaseFormRequest extends FormRequest 
{
protected static $NEEDS_AUTHORIZATION = true;
protected static $FORM_RULES          = [];
protected static $ERROR_MESSAGES      = [];
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize() : bool
{
return !static::$NEEDS_AUTHORIZATION;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules() : array
{
return static::$FORM_RULES;
}
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return static::$ERROR_MESSAGES;
}

/**
* @overrride
* Handle a failed validation attempt.
*
* @param  IlluminateContractsValidationValidator  $validator
* @return void
*
* @throws IlluminateValidationValidationException
*/
protected function failedValidation(Validator $validator) : void
{
//throw (new ValidationException(response()->json($validator->errors(), 422)));
throw new HttpResponseException(response()->json($validator->errors(), 422));
}
}

现在,当尝试在我的控制器中使用它时:

<?php
namespace AppHttpControllersAPI;
use AppServicesUserService;
use IlluminateHttpJsonResponse as JsonResponse;
//use IluminateHttpRequest;
use AppHttpRequestsRegisterUserRequest;
class UserController extends Controller
{
private $user;
public function __construct(UserService $user)
{
$this->user = $user;
}
public function store(RegisterUserRequest $request) : JsonResponse
{   
$registered_user = $this->user->register($request->validated());
return response()->json(['status' => 201, 'user_id' => $registered_user->id]);
}
}

我收到以下错误:

ReflectionException Class App\Http\Requests\RegisterUserRequest 不存在

有趣的是,如果我删除覆盖的方法failedValidation错误就消失了,尽管它会将我重定向到主页,这是我试图避免的。我想总是返回一个 json 响应。

有什么建议吗? 谢谢

请注意,failedValidation()函数期望IlluminateContractsValidationValidator的实例作为参数:

/**
* ...
* @param  IlluminateContractsValidationValidator  $validator
* ...
*/ 

但是您正在传递一个IlluminateValidationValidator实例:

use IlluminateValidationValidator; 
protected function failedValidation(Validator $validator) : void
{
throw new HttpResponseException(response()->json($validator->errors(), 422));
}

所以,你可以改变

use IlluminateValidationValidator; 

use IlluminateContractsValidationValidator; 

或者用参数中的命名空间传递它:

protected function failedValidation(IlluminateContractsValidationValidator $validator) : void
{
throw new HttpResponseException(response()->json($validator->errors(), 422));
}

相关内容

最新更新