Use JsonSchema in Laravel apps
This library builds on the outstanding JsonSchema validator opis/json-schema
The entire intent of this library is to make JsonSchema feel like a first class citizen in a Laravel project.
- Adds a new config file,
config/json-schema.php
, to configure your root directory for self-hosted schema files. - Adds the
SchemaValidator
facade that can be used to instantiate the validator with appropriate loaders. - Adds new PhpUnit assertions in the
Carsdotcom\JsonSchemaValidation\Traits\JsonSchemaAssertions
trait, such as validating that a mixed item validates for a specific schema. - Most interestingly, it lets you use JsonSchema to validate incoming Requests bodies, and/or validate your own outgoing response bodies, all using JsonSchema schemas that you can then export into OpenAPI documentation.
This package supports Laravel v9+
.
composer require carsdotcom/laravel-json-schema
Copy the json-schema.php
file from the vendor/carsdotcom/laravel-json-schema/config
folder to your application's config
folder.
- Create a
Schemas
folder under your application root folder, such asapp/Schemas
. - Create a new storage disk under the
disks
key within your application'sconfig/filesystem.php
file:
'disks' => [
'schemas' => [
'driver' => 'local',
'root' => app_path('app/Schemas'), // must match the 'config.json-schema.local_base_prefix' value
]
]
- Add your schema files to the
app/Schemas
folder. You may create subfolders to keep things organized.
This is an optional step, but can be super helpful.
Note: Enums must be created either as a built-in PHP enum
object or a MyCLabs\Enum\Enum
class.
- Add
use Carsdotcom\JsonSchemaValidation\Traits\GeneratesSchemaTrait;
to the declarations in the Enum. - Add a
SCHEMA
constant to the enum. It's value will be the relative path to your schema file, such as:const SCHEMA = '/Acme/Enums/item_type.json';
- Run the
schema:generate
Artisan command.
For this example, we'll be using these objects:
This is assumed to be stored in your app/Schemas
folder as Product.json
.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/product.schema.json",
"title": "Product",
"description": "A product from Acme's catalog",
"type": "object",
"properties": {
"productId": {
"description": "The unique identifier for a product",
"type": "integer"
},
"productName": {
"description": "Name of the product",
"type": "string"
},
"price": {
"description": "The price of the product",
"type": "number",
"exclusiveMinimum": 0
}
},
"required": [ "productId", "productName", "price" ]
}
{
"productId": 1,
"productName": "An ice sculpture",
"price": 12.50
}
use Carsdotcom\JsonSchemaValidation\SchemaValidator;
SchemaValidator::validateOrThrow($json, 'Product.json');
use Carsdotcom\JsonSchemaValidation\SchemaValidator;
SchemaValidator::getSchemaContents('Product.json');
use Carsdotcom\JsonSchemaValidation\SchemaValidator;
SchemaValidator::getSchemaContents('Customer.json', $jsonSchemaForCustomer);
$schemaKey = (new SchemaValidatorService)->registerRawSchema($jsonSchema);