У меня проблема с пользовательским правилом проверки в моем коде. Я пытаюсь проверить recaptcha, но после отладки я увидел, что проверка вызывается дважды.
Я использую Laravel 5.8 и обнаружил эту проблему: https://github.com/laravel/framework/issues/25736, но у меня все еще есть проблема.
Вот мой код:
ReqistrationRequest.php
public function rules()
{
$rules = [
//some rules
'captcha' => ['required', new Recaptcha]
//some rules
];
return $rules;
}
Recaptcha.php
class Recaptcha implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$client = new Client;
$response = $client->post('https://www.google.com/recaptcha/api/siteverify',
[
'form_params' =>
[
'secret' => env('GOOGLE_RECAPTCHA_SECRET'),
'response' => $value
]
]
);
$body = json_decode($response->getBody());
Log::info('TEST RECAPTCHA BODY' . $response->getBody());
return $body->success;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'MSG';
}
}
После отправки запроса мой лог-файл содержит:
[2019-10-30 10:30:28] local.INFO: ТЕСТ RECAPTCHA BODY {"success": true, "challenge_ts": "2019-10-30T10: 19: 18Z", "hostname ":" myhostname "}
[2019-10-30 10:30:28] local.INFO: ТЕСТ RECAPTCHA BODY {" success ": false," error-codes ": [" timeout-or-duplicate "]}
И ответ имеет код 422
У вас есть идеи, почему это происходит?
РЕДАКТИРОВАТЬ:
Я понялчто я могу проверить свою капчу в контроллере. Вот код:
RegistrationRequest.php
public function rules()
{
$rules = [
//some rules
'captcha' => 'required'
//some rules
];
return $rules;
}
Recaptha.php
class Recaptcha
{
/**
* @param string $captcha
* @return bool
*/
public static function isValid(string $captcha): bool
{
$client = new Client;
$response = $client->post('https://www.google.com/recaptcha/api/siteverify',
[
'form_params' =>
[
'secret' => env('GOOGLE_RECAPTCHA_SECRET'),
'response' => $captcha
]
]
);
$body = json_decode($response->getBody());
return $body->success;
}
}
MyController.php
if (!RecaptchaCustomRule::isValid($request->get('captcha'))) {
$this->response->error(trans('registration::app.captcha.required'), 422);
}
И это работаетидеально подходит для меня.