从 JSON 模式创建 PHP 对象

问题描述 投票:0回答:3

我的任务是为 JSON 模式定义的对象创建一个类。最初我只是想根据模式构建类,但现在我被告知它应该从模式本身自动生成。

我希望类为其成员提供 set/get 方法。

解决这个问题的最佳方法是什么?

php json jsonschema
3个回答
4
投票

使用 swaggest/php-code-builder 您可以在映射过程中生成带有访问器方法和验证的 PHP 类。

映射和验证由 swaggest/json-schema 提供支持,这是一种快速且兼容的 JSON 模式实现。

生成的类是 IDE 友好的,因此您可以自动完成所有属性。


0
投票

请注意,下面的包已被放弃,不再维护。没有建议更换包。


我为此用例编写了一个包:https://packagist.org/packages/dto/dto

这个想法是能够将对象定义为 JSON 模式,以便其他服务可以使用这些定义,然后使用这些相同的 JSON 模式在内部定义 PHP 对象。

<?php
class Example extends Dto\Dto
{
   protected $schema = [
        'type' => 'object',
        'properties' => [
            'a' => ['type' => 'string'],
            'b' => ['type' => 'string']
        ],
        'additionalProperties' => false
    ];
}

这个包有一些棘手的地方(并且通常对 PHP 中的类型严格要求):

  1. PHP 没有 __toInt 等的魔术方法。 因此,如果您在需要某种类型数据的地方使用 DTO 对象中的值,例如将其与整数进行比较,您必须显式地将值解析为类型。

if ($dto->my_integer > 3) {  // generates an error!

相反,您必须显式地将值转换为标量值(由 JSON 架构定义定义):

if ($dto->my_integer->toScalar() > 3) {  // works

  1. 您的 JSON 模式通常具有各种必填字段 - 因此,如果您实例化由该模式定义的对象,则必须通过构造来水化它,否则它处于无效状态。 我发现拥有一些模式变体很有帮助,例如允许使用一个空的未水合对象来减少限制性的 PHP 使用,并且在支持各种 HTTP 动词时很有帮助——例如GET 请求可能只返回对象的一部分,POST 请求可能需要一些字段,PATCH 请求可能需要唯一的 id 字段和至少一个其他字段等。

希望这有帮助。


-1
投票

我认为你有几个选择。

  1. 代码生成:运行架构并将 PHP 代码构建为字符串。这会很快,但您必须满意地按原样使用生成的输出,否则如果架构发生更改,您将遇到麻烦。
  2. 构建一个保存架构的对象,并使用
    __call()
    拦截对
    getFoo()
    setBar()
    的调用,并可以执行必要的验证和返回值。

在这两种情况下,我认为棘手的部分是如果您一路上遇到引用类型。不过,如果您的架构相当简单,那应该不会太糟糕。

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.