【问题标题】:Laravel: validate json objectLaravel:验证 json 对象
【发布时间】: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 只接受字母字符

标签: json laravel validation laravel-5.4


【解决方案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',
    ]);
    

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 1970-01-01
      • 2020-07-13
      • 2018-05-06
      • 1970-01-01
      • 2015-10-24
      • 2021-06-28
      • 2017-09-24
      • 2011-07-03
      相关资源
      最近更新 更多