Ошибка пользовательской проверки Laravel 6 «класс не существует» при переопределении метода failedValidation FormRequest

Я создал собственный класс проверки, расположенный в app\Http\Requests:

<?php

namespace App\Http\Requests;

use App\Http\Requests\BaseFormRequest;

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 App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;
use Illuminate\Validation\ValidationException;
use Illuminate\Http\Exceptions\HttpResponseException;
//use Illuminate\Http\Request;

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  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(Validator $validator) : void
    {
        //throw (new ValidationException(response()->json($validator->errors(), 422)));
        throw new HttpResponseException(response()->json($validator->errors(), 422));
    }

}

Теперь при попытке использовать его в моем контроллере:

<?php

namespace App\Http\Controllers\API;

use App\Services\UserService;
use Illuminate\Http\JsonResponse as JsonResponse;
//use Iluminate\Http\Request;
use App\Http\Requests\RegisterUserRequest;

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 App\Http\Requests\RegisterUserRequest не существует

Самое смешное, что если я удалю перезаписанный метод failedValidation, ошибка исчезнет, ​​хотя он перенаправляет меня на домашнюю страницу, чего я пытаюсь избежать. Я хочу всегда возвращать ответ json.

Какие-либо предложения? Спасибо


person MrCujo    schedule 13.10.2019    source источник
comment
Вы запускаете composer dump-autoload?   -  person Davit    schedule 14.10.2019
comment
Я только что сделал, тот же результат   -  person MrCujo    schedule 14.10.2019
comment
попробуйте использовать Illuminate\Contracts\Validation\Validator вместо Illuminate\Validation\Validator в качестве аргумента   -  person porloscerros Ψ    schedule 14.10.2019
comment
Это действительно проблема. Большое спасибо! Хотите добавить его в качестве ответа, чтобы я мог отметить его как правильный ответ?   -  person MrCujo    schedule 14.10.2019


Ответы (1)


Обратите внимание, что функция failedValidation() ожидает в качестве параметра экземпляр \Illuminate\Contracts\Validation\Validator:

/**
* ...
* @param  \Illuminate\Contracts\Validation\Validator  $validator
* ...
*/ 

но вы передаете экземпляр Illuminate\Validation\Validator:

use Illuminate\Validation\Validator; 

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

Итак, вы можете изменить

use Illuminate\Validation\Validator; 

to

use Illuminate\Contracts\Validation\Validator; 

или передать его с пространством имен в параметре:

protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator) : void
{
    throw new HttpResponseException(response()->json($validator->errors(), 422));
}
person porloscerros Ψ    schedule 14.10.2019