0

我是编程初学者,请原谅我对 Laravel 验证的误解。

我正在尝试为特定游戏的游戏玩家创建一个网站,用户可以在其中注册。当他们提交表格时,我必须验证他们的帐户是否存在。为此,我有一个外部 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 的自定义验证器吗?

4

1 回答 1

2

must的validator()方法RegisterController总是返回一个类的实例,Illuminate\Contracts\Validation\Validator但你lluminate\View\Viewelse条件下返回,尝试将其更改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!');
                }
            });
        }
    );
}
于 2020-01-19T10:33:03.083 回答