Laravel выбрасывает пользовательское исключение ValidationException - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь создать пользовательское исключение.Проект представляет собой API-интерфейс, использующий API Google Places, и если результат имеет статус ZERO RESULTS, мне нужно выдать исключение для проверки.Это потому, что сохраненные данные неверны.

Чтобы быть более ясным об этом.Зарегистрированный пользователь изменяет свой профиль, который включает в себя адрес, почтовый индекс и т. Д. Затем у нас есть метод get, в котором мы делаем запрос к API мест, чтобы получить широту и долготу и добавить их в модель профиля.

if (strcmp($status, 'ZERO_RESULTS') == 0 || strcmp($status, 'INVALID_REQUEST') == 0) {
    $error = ValidationException::withMessages([
        "one_thing" => ["Validation Message #1"], "another_thing" => ['Validation Message #2']
    ]);
    throw $error;
}

Я прочитал некоторые ответы на StackOverflow, и я даже пробую эти ответы, но я получаю только следующую ошибку:

{
  "errors": [
    {
      "status": 500,
      "code": 1,
      "source": {
        "pointer": "ErrorException line 73 in /Users/jacobotapia/Documents/Espora/one-mind-backend/vendor/sfelix-martins/json-exception-handler/src/ValidationHandler.php"
      },
      "title": "errorexception",
      "detail": "Undefined index: one_thing"
    }
  ]
}

Также я хочу отметить, что весь процесспроисходит во время GET метода.

Единственное, что мне нужно, - это вернуть сообщение о том, что мы не смогли получить какой-либо результат из API мест Google.Это с целью сказать клиенту, что данные профиля, которые пользователь зарегистрировал в приложении, неверны.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Может быть, вы хотели бы попробовать, если у вас есть имена полей "one_thing" и "another_thing"

$error = Illuminate\Validation\ValidationException::withMessages([
        "one_thing" => ["Validation Message #1"], 
        "another_thing" => ['Validation Message #2']
    ]);

throw $error;

проверьте метод withMessages () определение

 public static function withMessages(array $messages)
    {
        return new static(tap(ValidatorFacade::make([], []), function ($validator) use ($messages) {
            foreach ($messages as $key => $value) {
                foreach (Arr::wrap($value) as $message) {
                    $validator->errors()->add($key, $message);
                }
            }
        }));
    }

Ключи обрабатываются как имена полей, так что $ ошибки, которые вы будете проходить, будут связаны с соответствующими полями.

, поэтому в основном похоже на

$error = \Illuminate\Validation\ValidationException::withMessages([
   'field_name_1' => ['Validation Message for field name 1'],
   'field_name_2' => ['Validation Message for field name 2'],
   'field_name_3' => ['Validation Message for field name 3'],
]);
throw $error;

Попробуйте это

Код формы:

<form action="{{ route('test-validation') }}" method="POST">
    @csrf
    <input type="text" name="test" value="" />
    @if( $errors->has('test') ) 
        @foreach( $errors->get('test') as $err ) 
            {{ $err  }} 
        @endforeach 
    @endif
    <input type="submit" name="submit" value="Submit" />
 </form>

и в ваших маршрутах / web.php

use Validator;
use Illuminate\Validation\ValidationException;
use Illuminate\Http\Request;
Route::post('test-validation', function(Request $request){

    $fields = array('test' => $request->input('test'));
    $rules = array('test' => 'required|min:5');

    $validator = Validator::make($fields, $rules); // Empty data and rules fields
    $validator->errors()->add('test', 'This is the error message for test field');
    throw new ValidationException($validator);

    redirect()->withErrors($validator);
})->name('test-validation');

С помощью этого кода вы сможете правильно получать ошибки.

0 голосов
/ 05 июня 2019

Вот решение вашей проблемы

Решение 1 : отправить сообщение об ошибке с http кодом

return response()->json(["error"=> "YOUR_MESSAGE_HERE"],401);

Laravel - Возврат json вместе с httpкод состояния

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...