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 对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Reactjs 中循环遍历 Laravel 验证错误对象