vox/data

1.0.0 2021-10-17 02:10 UTC

This package is auto-updated.

Last update: 2024-09-09 11:32:37 UTC


README

使用此库,您可以

  • 将 PHP 类序列化为 json、xml,并创建自定义格式化程序
  • 将数据反序列化为 PHP 对象(json、xml 和自定义格式)
  • 在不同数据结构之间传输数据(从一个类实例到另一个类实例)
  • 将 PHP 对象标准化为数组
  • 使用属性访问器访问私有类成员
  • 您可以通过扩展和注解区分器来实现所有这些功能
  • 它也与 ocramius 代理兼容

用法

由于此库依赖于 Vox\Metadata 包,您必须获取 MetadataFactory 实例,然后您可以使用它来创建 ObjectExtractor 和 ObjectHydrator 实例。

给定以下类

class DataClass {
    private string $name;
    
    public int $age;
    
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    
    public function getName() {
        return $this->name;
    }
}

您可以创建您自己的数据提取器和注入器

$mf = (new MetadataFactoryFactory())->createAnnotationMetadataFactory();
$oe = new ObjectExtractor($mf);
$oh = new ObjectHydrator($mf);

要提取数据,您可以使用 extract 方法,并且可以向它提供一个上下文,有一个内置的特殊上下文值 extractType 可以使用,它将在标准化数组上提供一个名为 type 的属性,其中包含原始类的 FQCN(完全限定类名),这在反规范化(注入)过程中可能很有用。

$context = ['extractType' => true];
$data = $extractor->extract(new DataClass('John Doe', 18), $context);

您可以将数据注入回新的类或类实例

$object = $oh->hydrate(DataClass::class, $data);
$oh->hydrate($object, $data);

数据绑定

您可以通过使用 @Binding 和 @Exclude 注解来自定义数据输入和输出

class DataClass {
    #[Bindings(source: 'first_name', target: 'username')]
    private string $name;
    
    #[Exclude(input: false, output: true)]
    public int $age;
    
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    
    public function getName() {
        return $this->name;
    }
}

在此示例中,您可以有一个包含 "first_name" 字段的输入数组,它将被映射到 name 属性,并且当您提取它时,结果数组将包含此数据在 "username" 字段上。如果您想输入和输出使用相同的字段,则这些是可选的,您可以仅传递源,注意 'source' 是第一个参数,因此您可以省略参数名称,如这样 #[Bindings('first_name')]

排除也可以通过输入和输出进行控制,在这种情况下将在注入时使用,并在提取时省略。