使用 Laravel 5.6 api 验证 JSON Post
Validation of JSON Post using Laravel 5.6 api
难以验证 Laravel 5.6 上 api 的 JSON 输入。我一直在尝试
处的解决方案
但还是没有解决。
支持class:
<?php
namespace App\Http\Controllers\API;
class ResponseObject
{
const status_ok = "OK";
const status_fail = "FAIL";
const code_ok = 200;
const code_failed = 400;
const code_unauthorized = 403;
const code_not_found = 404;
const code_error = 500;
public $status;
public $code;
public $messages = array();
public $result = array();
}
和控制器:
namespace App\Http\Controllers\API;
use App\Http\Resources\MyItemsResource;
use App\MyItem;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use \Illuminate\Http\Response;
use \Illuminate\Support\Facades\Response as FacadeResponse;
use \Illuminate\Support\Facades\Validator;
use App\Http\Controllers\API\ResponseObject;
class MyItemsController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$response = new ResponseObject;
/*
sending a body of
{"code": "45678", "description": "My great item"}
then:
// print_r($request->json()->all()); die();
produces:
Array
(
[code] => 45678
[description] => My great item
)
so data is getting to server
*/
$validator = Validator::make($request->json()->all(), [
'code', 'required',
'description', 'required',
]);
if($validator->fails()){
$response->status = $response::status_failed;
$response->code = $response::code_failed;
foreach ($validator->errors()->getMessages() as $item) {
array_push($response->messages, $item);
}
} else {
$myItem = new MyItem();
$myItem->code = $request->code;
$myItem->description = $request->description;
$response->status = $response::status_ok;
$response->code = $response::code_ok;
$response->result = $myItem;
}
return FacadeResponse::json($response);
/*
Returns:
{
"status": "FAILED",
"code": 400,
"messages": [
[
"The 1 field is required."
],
[
"The 3 field is required."
]
],
"result": []
}
*/
}
}
为什么把字段称为1字段和3字段?
当它们到达 $request 中的控制器时,它没有拾取字段,我错过了什么?
任何指导将不胜感激。
指验证规则的key。
这里只有一个包含 4 个单词的数组(索引 1 和 3 是失败的有效规则):
$validator = Validator::make($request->json()->all(), [
'code', 'required',
'description', 'required',
]);
^ 这等于:
$validator = Validator::make($request->json()->all(), [
0 => 'code',
1 => 'required',
2 => 'description',
3 => 'required',
]);
并查找输入 0
、1
、2
、3
。
相反,你应该创建一个关联数组:
$validator = Validator::make($request->json()->all(), [
'code' => 'required',
'description' => 'required',
]);
^ 这将查找输入 code
和 description
并使用规则 required
验证它们
难以验证 Laravel 5.6 上 api 的 JSON 输入。我一直在尝试
支持class:
<?php
namespace App\Http\Controllers\API;
class ResponseObject
{
const status_ok = "OK";
const status_fail = "FAIL";
const code_ok = 200;
const code_failed = 400;
const code_unauthorized = 403;
const code_not_found = 404;
const code_error = 500;
public $status;
public $code;
public $messages = array();
public $result = array();
}
和控制器:
namespace App\Http\Controllers\API;
use App\Http\Resources\MyItemsResource;
use App\MyItem;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use \Illuminate\Http\Response;
use \Illuminate\Support\Facades\Response as FacadeResponse;
use \Illuminate\Support\Facades\Validator;
use App\Http\Controllers\API\ResponseObject;
class MyItemsController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$response = new ResponseObject;
/*
sending a body of
{"code": "45678", "description": "My great item"}
then:
// print_r($request->json()->all()); die();
produces:
Array
(
[code] => 45678
[description] => My great item
)
so data is getting to server
*/
$validator = Validator::make($request->json()->all(), [
'code', 'required',
'description', 'required',
]);
if($validator->fails()){
$response->status = $response::status_failed;
$response->code = $response::code_failed;
foreach ($validator->errors()->getMessages() as $item) {
array_push($response->messages, $item);
}
} else {
$myItem = new MyItem();
$myItem->code = $request->code;
$myItem->description = $request->description;
$response->status = $response::status_ok;
$response->code = $response::code_ok;
$response->result = $myItem;
}
return FacadeResponse::json($response);
/*
Returns:
{
"status": "FAILED",
"code": 400,
"messages": [
[
"The 1 field is required."
],
[
"The 3 field is required."
]
],
"result": []
}
*/
}
}
为什么把字段称为1字段和3字段? 当它们到达 $request 中的控制器时,它没有拾取字段,我错过了什么?
任何指导将不胜感激。
指验证规则的key。
这里只有一个包含 4 个单词的数组(索引 1 和 3 是失败的有效规则):
$validator = Validator::make($request->json()->all(), [
'code', 'required',
'description', 'required',
]);
^ 这等于:
$validator = Validator::make($request->json()->all(), [
0 => 'code',
1 => 'required',
2 => 'description',
3 => 'required',
]);
并查找输入 0
、1
、2
、3
。
相反,你应该创建一个关联数组:
$validator = Validator::make($request->json()->all(), [
'code' => 'required',
'description' => 'required',
]);
^ 这将查找输入 code
和 description
并使用规则 required