phore/hydrator

将数组反序列化为对象结构

v1.1.0 2024-02-18 13:28 UTC

This package is auto-updated.

Last update: 2024-09-13 13:07:27 UTC


README

将序列化/反序列化平铺到对象结构中。Hydrator解析公共属性的DocComments并根据定义实例化类。

示例

安装

composer install phore/hydrator

基本示例

class UserData {
    /**
     * @var string
     */
    public $name;
    
    /**
    * Assoc Array 
    * @var array<string, ClassType2> 
    */
    public $map;
    
    /**
     * @var int
     */
    public $age;
}

$input = ["name"=>"bob", "age"=>37];

$userData = phore_hydrate($input, UserData::class);

assert( $userData instanceof UserData);

$userData 是一个 UserData 对象,所有属性都正确转换为DocComments中指定的所需类型。

识别的注解

  • 简单类型如 stringintboolfloatarray
  • 数组类型如 string[]int[]...
  • 对象类型 OtherClass
  • 对象数组 OtherClass[]
  • 可空属性 type|null

指南

获取器/设置器

在对象上,hydrator将按照以下顺序尝试设置属性值

  1. 如果对象有一个set<PropertyName>($value)方法,它将首先使用该方法
  2. 如果属性是public,它将被直接设置
  3. 如果有__set($name, $value)方法,它将被使用

默认值

如果找不到特定键的数据,将应用默认值

public $prop1 = []

可选属性

您可以通过在DocBlock中添加|null来定义属性为可选

/**
 * @var SomeEntity1|null
 */
public $entity1;

如果找不到输入数据,值将为null

在注水之前过滤输入数据

为了简化向后兼容性问题,在注水之前,将调用魔法方法__hydrate()来预先过滤输入数据。

class Entity1 {
    public $p1;

    public function __hydrate(array $input) : array
    {
        // .. modify input to match the object ..
        return $input;
    }
}

处理额外的/未定义的输入数据

默认情况下,对于未定义的输入键,hydrator将抛出异常。您可以选择这种行为