carsdotcom / laravel-json-schema
为Laravel项目提供Json Schema验证
v2.1.0
2024-07-12 16:31 UTC
Requires
- php: ^8.1
- laravel/framework: ^9.19 || ^10.0 || ^11.0
- opis/json-schema: ^2.3
Requires (Dev)
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.4.4
- nunomaduro/collision: ^6.1|7.*|8.*
- orchestra/testbench: 7.*|8.*|9.*
- phpstan/phpstan: ^1.8
- phpunit/phpunit: ~8.0|~9.0|^10.5
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-12 17:12:50 UTC
README
在Laravel应用中使用JsonSchema
用途
这个库基于出色的JsonSchema验证器opis/json-schema
这个库的整个目的就是让JsonSchema在Laravel项目中感觉像是一等公民。
- 添加一个新的配置文件
config/json-schema.php
,用于配置根目录下的自托管模式文件。 - 添加了
SchemaValidator
外观,可以使用它来使用适当的加载器实例化验证器。 - 在
Carsdotcom\JsonSchemaValidation\Traits\JsonSchemaAssertions
特质中添加了新的PhpUnit断言,例如验证混合项目是否针对特定模式进行了验证。 - 最有趣的是,它允许您使用JsonSchema来验证传入的请求体,以及/或验证您自己的传出响应体,所有这些都使用您可以将它们导出为OpenAPI文档的JsonSchema模式。
Laravel版本兼容性
此包支持Laravel v9+
。
安装
composer require carsdotcom/laravel-json-schema
使用Laravel JSON Schema
设置
配置文件
将json-schema.php
文件从vendor/carsdotcom/laravel-json-schema/config
文件夹复制到您的应用的config
文件夹。
模式存储
- 在应用根目录下创建一个名为
Schemas
的文件夹,例如app/Schemas
。 - 在应用的
config/filesystem.php
文件中的disks
键下创建一个新的存储磁盘。
'disks' => [
'schemas' => [
'driver' => 'local',
'root' => app_path('app/Schemas'), // must match the 'config.json-schema.local_base_prefix' value
]
]
- 将模式文件添加到
app/Schemas
文件夹中。您可能需要创建子文件夹以保持组织。
生成枚举模式
这是一个可选步骤,但非常有帮助。
注意:枚举必须以内置PHP enum
对象或MyCLabs\Enum\Enum
类的形式创建。
- 将
use Carsdotcom\JsonSchemaValidation\Traits\GeneratesSchemaTrait;
添加到枚举声明中。 - 在枚举中添加一个
SCHEMA
常量。它的值将是模式文件的相对路径,例如:const SCHEMA = '/Acme/Enums/item_type.json';
- 运行
schema:generate
Artisan命令。
针对模式验证JSON数据
在这个例子中,我们将使用这些对象
托管JSON Schema文件
假设它存储在您的app/Schemas
文件夹中,文件名为Product.json
。
{
"$schema": "https://json-schema.fullstack.org.cn/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" ]
}
待验证的JSON数据
{
"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);