Пользовательские правила проверки Laravel вызываются дважды - PullRequest
1 голос
/ 30 октября 2019

У меня проблема с пользовательским правилом проверки в моем коде. Я пытаюсь проверить 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);
      }

И это работаетидеально подходит для меня.

...