stratadox/deserializer

v1.0.0 2023-05-08 15:23 UTC

This package is auto-updated.

Last update: 2024-09-08 18:10:56 UTC


README

Build Status Coverage Status Infection Minimum PhpStan Level Scrutinizer Code Quality Maintainability Latest Stable Version License

Implements Latest Stable Version License

将序列化数据转换为对象。

安装

使用 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