Laravel:验证 json 对象

Posted

技术标签:

【中文标题】Laravel:验证 json 对象【英文标题】:Laravel: validate json object 【发布时间】:2017-10-15 12:14:21 【问题描述】:

这是我第一次在 laravel 中使用验证。我正在尝试在下面的 json 对象上应用验证规则。 json对象名称为payload,示例如下。

payload = 
  "name": "jason123",
  "email": "email@xyz.com",
  "password": "password",
  "gender": "male",
  "age": 21,
  "mobile_number": "0322 8075833",
  "company_name": "xyz",
  "verification_status": 0,
  "image_url": "image.png",
  "address": "main address",
  "lattitude": 0,
  "longitude": 0,
  "message": "my message",
  "profession_id": 1,
  "designation_id": 1,
  "skills": [
    
      "id": 1,
      "custom" : "new custom1"
    
   ]

验证码如下所示,出于测试目的,我将名称验证为数字。当我执行下面的代码时,上面的 json 对象被批准并插入到我的数据库中。相反,它应该给我一个例外,因为我用字母数字值传递名称,我做错了什么:

public function store(Request $request)


    $this->validate($request, [
        'name' => 'digits',
        'age' => 'digits',
        ]);

【问题讨论】:

您应该使用integer 只接受数字或alpha 只接受字母字符 【参考方案1】:

我在这里看到了一些有用的答案,只是想补充一下——我的偏好是控制器函数只处理有效请求。所以我在请求中保留所有验证。 Laravel 在验证请求中的所有规则后将请求注入到控制器函数中。通过一个小的调整(或者更好的特性),标准的 FormRequest 非常适合验证 json 帖子。

客户端示例.js

var data = first: "Joe", last: "Dohn";
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST",'//laravel.test/api/endpoint');
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(JSON.stringify(data));

项目/路由/api.php

Route::any('endpoint', function (\App\Http\Requests\MyJsonRequest $request)
    dd($request->all());
);

app/Http/Requests/MyJsonRequest.php(由php artisan make:request MyJsonRequest生成)

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MyJsonRequest extends FormRequest

    public function authorize()
        return true;//you'll want to secure this
    

    public function rules()
        return [
            'first' => 'required',
            'last'  => 'required|max:69',
        ];
    

    //All normal laravel request/validation stuff until here
    //We want the JSON...
    //so we overload one critical function with SOMETHING LIKE this
    public function all($keys = null)
        if(empty($keys))
            return parent::json()->all();
        

        return collect(parent::json()->all())->only($keys)->toArray();
    

【讨论】:

在 Laravel 8 上完美运行【参考方案2】:
 $request->merge([
            'meta_data' => !is_null($request->meta_data) ? json_encode($request->meta_data) : null
        ]);

validator = Validator::make($request->all(), [
      'meta_data' => 'nullable|json'
        ]);

【讨论】:

【参考方案3】:

请试试这个方法

use Validator;

public function store(Request $request)

    //$data = $request->all();
    $data = json_decode($request->payload, true);
    $rules = [
        'name' => 'digits:8', //Must be a number and length of value is 8
        'age' => 'digits:8'
    ];

    $validator = Validator::make($data, $rules);
    if ($validator->passes()) 
        //TODO Handle your data
     else 
        //TODO Handle your error
        dd($validator->errors()->all());
    

数字:值

验证中的字段必须是数字,并且必须具有精确的值长度。

【讨论】:

if ($validator->fails()) return response()->json($validator->messages(), 200); 是处理消息的更好方法 @rchatburn 是的。我在 API 中使用这种方式。 @rchatburn,呵呵......自从你评论这个很久了,但我认为它应该返回 422 而不是 200......问候。【参考方案4】:

你的有效载荷应该是payload: 然后你可以这样做

$this->validate($request->payload, [
    'name' => 'required|digits:5',
    'age' => 'required|digits:5',
    ]);

或者如果您不发送有效负载密钥,您可以使用 $request->all()

【讨论】:

我正在发送带有键“payload”的 json 对象,但是当我尝试像这样访问它时出现错误 $request->payload error:validate() must be an instance of Illuminate\Http\请求,给定字符串。 @MTA 在这种情况下使用 Quỳnh Nguyễn 答案并将 $request->all() 替换为 $request->payload【参考方案5】:

使用Validator 工厂类,而不是使用从控制器特征派生的validate 方法。它接受有效载荷的数组,因此您需要先对其进行解码

\Validator::make(json_decode($request->payload, true), [
    'name' => 'digits',
    'age' => 'digits',
]);

【讨论】:

以上是关于Laravel:验证 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中验证递归对象

Laravel 验证对象数组问题

在 Reactjs 中循环遍历 Laravel 验证错误对象

在 laravel 表单请求验证中验证数组对象?

Laravel Eloquent 验证请求的 items 字段 foreach

Laravel 图像验证