Laravel FormRequest With Opis JSON Schema Validator
Use Opis JSON Schema to validate your laravel form requests.
composer require mesak/laravel-opis-validator
Or you could directly reference it into your composer.json
file as a dependency
{
"require": {
"mesak/laravel-opis-validator": "^1.0.0"
}
}
<?php
namespace App\Http\Requests;
use Mesak\LaravelOpisValidator\JsonSchemaRequest;
class JsonSchema extends JsonSchemaRequest
{
protected $extendValidatorMessage = true;
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'$schema' => "http://json-schema.org/draft-07/schema#",
"type" => "object",
"title" => "Base Preference",
"description" => "Base Preference Setting",
"properties" => [
"limit" => [
"type" => "integer",
"minimum" => 5,
"maximum" => 15,
"title" => "limit",
"attrs" => [
"placeholder" => "limit (limit)"
]
],
"page" => [
"type" => "object",
"title" => "Page",
"attrs" => [
"placeholder" => "Page ( Page )"
],
"properties" => [
"limit" => [
"type" => "integer"
]
]
]
],
"additionalProperties" => false,
"required" => [
"limit",
"page"
]
];
}
protected function prepareForValidation()
{
//clear urlencoded data from request
//input integer is not allowed in json schema
$intance = $this->getValidatorInstance();
foreach ($intance->getRules() as $key => $rule) {
$inputValue = $this->input($key);
if ($rule == 'integer' && preg_match('/\d+/', $inputValue)) {
$this->merge([
$key => intval($inputValue),
]);
}
}
$intance->setData($this->all());
}
}
use App\Http\Requests\JsonSchema as JsonSchemaRequest;
public function update(JsonSchemaRequest $request)
{
dd($request->validated());
}
use postman to test your request.
curl --location --request POST 'http://localhost/test/update' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
"limit" :10,
"page": {
"limit" : 10
}
}'