Laravel 6 - Изменить метод validator для RegisterController. - PullRequest
0 голосов
/ 19 января 2020

Я новичок в программировании, поэтому, пожалуйста, извините за неправильное понимание валидации в Laravel.

Я пытаюсь создать веб-сайт для геймеров конкретной игры c, где пользователи могут регистр. Когда они отправляют форму, я должен проверить, существует ли их учетная запись или нет. Для этого у меня есть внешний api (api из игры), который я могу использовать для проверки своей учетной записи.

Я попытался решить это следующим образом в моем RegisterController:

protected function validator(array $data)
{
    $validation = $this->isSummonerValid($data['summonername']);
    if ($validation) {
        return Validator::make($data, [
            'summonername' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'region' => ['required', 'string'],
            'rank' => ['required', 'string'],
            'lane' => ['required', 'array'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    } else {
        return view('auth.register');
    }
}

Все, что делает isSummonerValid(), это использует API и возвращает true, если пользователь существует в игре, и false, если нет.

protected function isSummonerValid($summonerName)
{
    $client = new Client();
    try {
        $response = $client->request('GET',
            'https://euw1.api.riotgames.com/lol/summoner/v4/summoners/by-name/' . $summonerName .
            '?api_key=' . APIKEY);
    } catch (ClientException $e) {
        return false;
    }
    return true;
}

Когда вызов API завершается успешно, все работает нормально. Пользователь создается и может войти в систему.

Когда происходит сбой вызова API (пользователь не существует), я получаю эту ошибку:

Метод Illuminate \ View \ View :: validate не существовать.

Может кто-нибудь объяснить, как я могу создать собственный валидатор в Laravel, который вызывает внешний API?

1 Ответ

1 голос
/ 19 января 2020

Метод validator() RegisterController всегда должен возвращать экземпляр класса Illuminate\Contracts\Validation\Validator, но вы возвращаете lluminate\View\View при else условии, попробуйте изменить validator на следующее:

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    return tap(Validator::make($data, [
            'summonername' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'region' => ['required', 'string'],
            'rank' => ['required', 'string'],
            'lane' => ['required', 'array'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]),
        function ($validator) use ($data) {
            $validator->after(function ($validator) use ($data) {
                if (! $this->isSummonerValid($data['summonername'])) {
                    $validator->errors()->add('summonername', 'Something is wrong with this field!');
                }
            });
        }
    );
}
...