Laravel: validate json object
Please try this way
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()); }}
digits:value
The field under validation must be numeric and must have an exact length of value.
I see some helpful answers here, just want to add - my preference is that controller functions only deal with valid requests. So I keep all validation in the request. Laravel injects the request into the controller function after validating all the rules within the request. With one small tweak (or better yet a trait) the standard FormRequest works great for validating json posts.
Client example.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));
project/routes/api.php
Route::any('endpoint', function (\App\Http\Requests\MyJsonRequest $request){ dd($request->all());});
app/Http/Requests/MyJsonRequest.php (as generated by php artisan make:request MyJsonRequest
)
<?phpnamespace 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(); }}
Your payload should be payload: {
then you can do
$this->validate($request->payload, [ 'name' => 'required|digits:5', 'age' => 'required|digits:5', ]);
or if you are not sending the payload key you can just use $request->all()