【问题标题】:Making a PHP Object from a JSON Schema从 JSON 模式创建 PHP 对象
【发布时间】:2013-05-24 01:46:49
【问题描述】:

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

我希望该类为其成员设置/获取方法。

最好的方法是什么?

【问题讨论】:

  • 我已经做到了,似乎只是根据模式验证数据的工具,这不是我想要的。
  • 我不知道有任何这样的项目——但是,如果你做这样的事情,那么请在Google Group或GitHub repo上发布一些东西,所以他们可以把它放在网站上供将来的人们使用。 :)

标签: php json jsonschema


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我为这个用例写了一个包: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-&gt;my_integer &gt; 3) { // generates an error!

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

    if ($dto-&gt;my_integer-&gt;toScalar() &gt; 3) { // works

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我认为您在这里有几个选择。

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

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

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2022-07-18
        • 1970-01-01
        • 2014-11-17
        • 2019-05-05
        • 2017-01-04
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多