carsdotcom/laravel-json-schema

为Laravel项目提供Json Schema验证

v2.1.0 2024-07-12 16:31 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文件夹。

模式存储

  1. 在应用根目录下创建一个名为Schemas的文件夹,例如app/Schemas
  2. 在应用的config/filesystem.php文件中的disks键下创建一个新的存储磁盘。
'disks' => [
    'schemas' => [
        'driver' => 'local',
        'root' => app_path('app/Schemas'), // must match the 'config.json-schema.local_base_prefix' value
    ]
]
  1. 将模式文件添加到app/Schemas文件夹中。您可能需要创建子文件夹以保持组织。

生成枚举模式

这是一个可选步骤,但非常有帮助。

注意:枚举必须以内置PHP enum对象或MyCLabs\Enum\Enum类的形式创建。

  1. use Carsdotcom\JsonSchemaValidation\Traits\GeneratesSchemaTrait;添加到枚举声明中。
  2. 在枚举中添加一个SCHEMA常量。它的值将是模式文件的相对路径,例如:const SCHEMA = '/Acme/Enums/item_type.json';
  3. 运行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);