stratadox / deserializer
v1.0.0
2023-05-08 15:23 UTC
Requires
- php: >=8.0
- ext-json: *
- stratadox/deserializer-contracts: ^0.3
- stratadox/hydrator: ^6.0.1
- stratadox/immutable-collection: ^2
- stratadox/instantiator: ^0.2
- stratadox/specification: ^1.0
Requires (Dev)
- fakerphp/faker: ^1.7
- php-coveralls/php-coveralls: ^2.0
- phpstan/phpstan: ^0.12.54
- phpunit/phpunit: ^8.2
- roave/security-advisories: dev-master
This package is auto-updated.
Last update: 2024-09-08 18:10:56 UTC
README
将序列化数据转换为对象。
安装
使用 composer require stratadox/deserializer 安装
这是什么?
一个可以 反序列化 的对象,可以将 序列化 数据转换为对象。
期望 序列化 输入数据具有数组形式,无论是数字索引还是关联数组。这样,可以轻松地将 SQL 查询的结果和已解码的 JSON、会话数据以及其他来源转换为对象。
如何使用它?
要将关联数组的内容写入对象,可以使用
<?php use Stratadox\Deserializer\ObjectDeserializer; $deserialize = ObjectDeserializer::forThe(Foo::class); $foo = $deserialize->from([ 'bar' => 'Bar.', 'baz' => 'BAZ!', ]); assert($foo instanceof Foo); assert('Bar.' === $foo->bar); assert('BAZ!' === $foo->getBaz());
要将数字索引数组的内容写入集合对象,使用
<?php use Stratadox\Deserializer\CollectionDeserializer; $deserialize = CollectionDeserializer::forImmutable(Numbers::class); $numbers = $deserialize->from([10, 11, 12]); assert($numbers instanceof Numbers); assert(count($numbers) === 3); assert($numbers[0] === 10); assert($numbers[1] === 11); assert($numbers[2] === 12);
或者
<?php use Stratadox\Deserializer\CollectionDeserializer; $deserialize = CollectionDeserializer::forMutable(ArrayObject::class); $numbers = $deserialize->from([10, 11, 12]); assert($numbers instanceof ArrayObject); assert(count($numbers) === 3); assert($numbers[0] === 10); assert($numbers[1] === 11); assert($numbers[2] === 12);
在没有反序列化需求但需要反序列化器的情况下,可以使用 ArrayDeserializer
<?php use Stratadox\Deserializer\ArrayDeserializer; $deserialize = ArrayDeserializer::make(); $input = ['foo', 'bar']; $output = $deserialize->from($input); assert($input === $output);
它还能做什么?
默认情况下,集合反序列化器使用 CollectionHydrator,对象反序列化器使用 ObjectHydrator 对简单对象进行简单处理,或在涉及继承时使用 ReflectiveHydrator。
可以通过注入自定义(可能已装饰的) hydrators 和 instantiators 来改变这种默认行为
<?php use Stratadox\Deserializer\ObjectDeserializer; use Stratadox\Instantiator\Instantiator; use Stratadox\Hydrator\ObjectHydrator; $deserialize = ObjectDeserializer::using( Instantiator::forThe(Foo::class), ObjectHydrator::default() );
在某些情况下,输入可能会发生变化,需要为不同类型的数据使用不同的反序列化器。
例如,当输入数据表示继承结构时
<?php use Stratadox\Deserializer\ForDataSets; use Stratadox\Deserializer\Condition\HaveTheDiscriminatorValue; use Stratadox\Deserializer\ObjectDeserializer; use Stratadox\Deserializer\OneOfThese; $deserialize = OneOfThese::deserializers( ForDataSets::that( HaveTheDiscriminatorValue::of('type', 'A'), ObjectDeserializer::forThe(ChildA::class) ), ForDataSets::that( HaveTheDiscriminatorValue::of('type', 'B'), ObjectDeserializer::forThe(ChildB::class) ) ); $a = $deserialize->from([ 'type' => 'A', 'property' => 'value', ]); $b = $deserialize->from([ 'type' => 'B', 'attribute' => 'different value', ]); assert($a instanceof ChildA); assert($b instanceof ChildB);
这些功能可以组合成更高级的反序列化结构,例如条件应用的反序列化器,这些反序列化器配置了 映射 hydrators。