vox / data
1.0.0
2021-10-17 02:10 UTC
Requires
- php: >=7.4
- vox/event: ^0.6
- vox/metadata: ^1.0.0
Requires (Dev)
- phpunit/phpunit: ^9
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')]
。
排除也可以通过输入和输出进行控制,在这种情况下将在注入时使用,并在提取时省略。