从JSON模式制作PHP对象

时间:2013-05-24 01:46:49

标签: php json jsonschema

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

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

最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

我认为你有几个选择。

  1. 代码生成:运行模式并将PHP代码构建为字符串。这将非常快,但您必须对按原样使用生成的输出感到满意,否则如果架构发生更改,您将遇到麻烦。
  2. 构建一个包含架构的对象,并使用__call()拦截对getFoo()setBar()的调用,并执行必要的验证和返回值。
  3. 在这两种情况下,我认为如果您在此过程中遇到参考类型,那将是棘手的部分。但是,如果您的架构相当简单,那么它应该不会太糟糕。

    祝你好运!

答案 2 :(得分: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对象中的值,例如将它与整数进行比较,您必须显式解析该类型的值。
  2. if ($dto->my_integer > 3) { // generates an error!

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

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

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