Laravel抛出一个自定义的ValidationException

时间:2019-06-05 03:16:55

标签: php laravel laravel-5

我正在尝试引发自定义异常。该项目是使用Google Places API的API,如果结果的状态为ZERO RESULTS,则需要抛出验证异常。这是因为存储的数据错误。

要对此更加清楚。注册用户修改其个人资料,其中包括地址,邮政编码等。 然后,我们有一个get方法,在其中查询places 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方法期间进行的。

我唯一想做的就是返回一个错误消息,说我们无法从google place API获得任何结果。目的是向客户说用户在应用程序中注册的个人资料数据是错误的。

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

如果您的字段名称为“ one_thing”和“ another_thing”,则可能要尝试

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

throw $error;

检查withMessages()方法definition

 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);
                }
            }
        }));
    }

键被视为字段名称,因此您将遇到的$ errors将与各个字段相关。

基本上像

$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>

以及您的route / 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');

使用此代码,您应该能够正确获取错误。

答案 1 :(得分:-1)

这是您问题的解决方案

解决方案1 ​​:使用http代码发送错误消息

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

Laravel - Return json along with http status code