【问题标题】:How to display custom vaildation error messages for API requests?如何显示 API 请求的自定义验证错误消息?
【发布时间】:2018-05-28 17:02:26
【问题描述】:
            try{
                $request->validate([
                    'aadhar' => 'required|digits:12|numeric',
                    'name' => 'required|string|max:511',
                    'dob' => 'required|date_format:Y-m-d',
                    'email' => 'required|email|max:255',
                    'address' => 'required|string',
                    'insuranceid' => 'required|digits_between:1,15|integer',
                    'password' => 'required|min:59|max:60',
                ]);
                }
            catch(Exception $error){
                    $message = $error->getMessage();
                    $status_code=400;
                    return response()->json(["message" => $message,"status_code" => $status_code]);
                }

这是我的一段代码,用于验证发送到 API 的请求参数。该文档仅提供有关表单请求时的自定义错误消息的详细信息。

验证错误给出默认消息“给定数据无效”,但我想知道哪个参数无效。如何为 API 请求验证提供自定义验证错误消息?

【问题讨论】:

    标签: php laravel api


    【解决方案1】:
    $validator = Validator::make($request->all(), [
            'password' => [
                'required',
                'confirmed',
                'between:8,55'
            ]
        ]);
    
        if ( $validator->fails() ) {
            return response()->json( [ 'errors' => $validator->errors() ], 400 );
        }
    

    【讨论】:

    • 好的,那只能通过Validator门面的一个实例来实现,还是尽管使用了validate方法也能显示错误?
    • 如果您查看这些文档,则有一个消息数组作为第二个参数:devdocs.io/laravel~5.5/api/5.5/illuminate/http/…
    • 我参考了文档中的验证页面,其中没有给出这样的示例。没有引用该方法可以具有的参数。感谢您的链接和答案!
    【解决方案2】:

    首先,要解耦您的代码,您可以使用Form Request class。来自文档:

    对于更复杂的验证场景,您可能希望创建一个“表单 请求”。表单请求是自定义请求类,其中包含 验证逻辑。

    这个类包含两个方法:

    1 - rules,你指定规则的地方,它应该返回一个规则数组。
    2 - authorize 返回一个boolean ,这个方法控制谁被允许执行这个请求。 默认设置为false,所以每次通话都会被拒绝。

    所以,在你的情况下,它应该是这样的:

    首先,创建您的自定义请求类,在您的控制台中执行此工匠命令:

    php artisan make:request CreateCustomObjectRequest
    

    这将在app/Http/Requests 下创建一个新类:

    class CreateCustomObjectRequest extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            // Implement here your Auth validation, something like:
            return auth()->check();
            // or just return "true" if you want to take care of this anywhere else.
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'aadhar' => 'required|digits:12|numeric',
                'name' => 'required|string|max:511',
                'dob' => 'required|date_format:Y-m-d',
                'email' => 'required|email|max:255',
                'address' => 'required|string',
                'insuranceid' => 'required|digits_between:1,15|integer',
                'password' => 'required|min:59|max:60',
            ];
        }
    }
    

    然后,在您的控制器中,我们将使用这个自定义的 Request 对象,而不是注入常规的 Request 对象:

    use App\Http\Requests\CreateCustomObjectRequest;
    
    // ...
    
        public function store(CreateCustomObjectRequest $request)
        {
            // the rest of your controller logic.
        }
    

    现在,您真正感兴趣的部分。要以 json 方式返回错误,您应该在发出请求时添加下一个标头:

    Accept: Application/json
    

    这个标头会告诉 Laravel 输出应该是一个 json 响应,所以它会将它转换为 json。请注意,这仅适用于验证规则以及返回 return $someObject 之类的对象时。要进一步自定义,您应该使用以下内容:

    return response()->json(['data' => $someObject], 200);
    

    【讨论】:

    • 我尝试通过表单请求实现API请求的验证,并在表单请求类的messages方法中给出了我的自定义错误消息。但是,发生的事情是,当验证方法发现错误时,我收到的输出是“您被重定向到localhost:8080”。它没有显示错误,而是将我重定向到默认重定向页面,就像表单出现错误时需要重定向一样。
    • 这就是为什么你应该添加我在回复中提到的标题(接受:application/json)
    • 哦,好的。那么,来自客户端的请求必须有那个标头?
    • 没错。该标头将告诉 Laravel 你想要该格式的响应。该标头在其他情况下也很有用,例如在使用 Laravel Passport 时。
    • 非常感谢!我真诚地想支持这个答案,但由于声誉较低而无法支持。
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2020-04-28
    • 2018-02-08
    • 1970-01-01
    • 2019-09-27
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多