1. Go to this page and download the library: Download eventsauce/object-hydrator library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
eventsauce / object-hydrator example snippets
use EventSauce\ObjectHydrator\ObjectMapperUsingReflection;
$mapper = new ObjectMapperUsingReflection();
class ExampleCommand
{
public function __construct(
public readonly string $name,
public readonly int $birthYear,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'name' => 'de Jonge',
'birth_year' => 1987
],
);
$command->name === 'de Jonge';
$command->birthYear === 1987;
class ChildObject
{
public function __construct(
public readonly string $value,
) {}
}
class ParentObject
{
public function __construct(
public readonly string $value,
public readonly ChildObject $child,
) {}
}
$command = $mapper->hydrateObject(
ParentObject::class,
[
'value' => 'parent value',
'child' => [
'value' => 'child value',
]
],
);
class ChildObject
{
public function __construct(
public readonly string $value,
) {}
}
class ParentObject
{
/**
* @param ChildObject[] $list
*/
public function __construct(
public readonly array $list,
) {}
}
$object = $mapper->hydrateObject(ParentObject::class, [
'list' => [
['value' => 'one'],
['value' => 'two'],
],
]);
$object->list[0]->value === 'one';
$object->list[1]->value === 'two';
use EventSauce\ObjectHydrator\MapFrom;
class ExampleCommand
{
public function __construct(
public readonly string $name,
#[MapFrom('year')]
public readonly int $birthYear,
) {}
}
use EventSauce\ObjectHydrator\MapFrom;
class BirthDate
{
public function __construct(
public int $year,
public int $month,
public int $day
){}
}
class ExampleCommand
{
public function __construct(
public readonly string $name,
#[MapFrom(['year_of_birth' => 'year', 'month', 'day'])]
public readonly BirthDate $birthDate,
) {}
}
$mapper->hydrateObject(ExampleCommand::class, [
'name' => 'Frank',
'year_of_birth' => 1987,
'month' => 11,
'day' => 24,
]);
use EventSauce\ObjectHydrator\PropertyCasters\CastToType;
class ExampleCommand
{
public function __construct(
#[CastToType('integer')]
public readonly int $number,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'number' => '1234',
],
);
use EventSauce\ObjectHydrator\PropertyCasters\CastListToType;
class ExampleCommand
{
public function __construct(
#[CastListToType('integer')]
public readonly array $numbers,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'numbers' => ['1234', '2345'],
],
);
use EventSauce\ObjectHydrator\PropertyCasters\CastListToType;
class Member
{
public function __construct(
public readonly string $name,
) {}
}
class ExampleCommand
{
public function __construct(
#[CastListToType(Member::class)]
public readonly array $members,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'members' => [
['name' => 'Frank'],
['name' => 'Renske'],
],
],
);
use EventSauce\ObjectHydrator\PropertyCasters\CastToDateTimeImmutable;
class ExampleCommand
{
public function __construct(
#[CastToDateTimeImmutable('!Y-m-d')]
public readonly DateTimeImmutable $birthDate,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'birthDate' => '1987-11-24',
],
);
use EventSauce\ObjectHydrator\PropertyCasters\CastToUuid;
use Ramsey\Uuid\UuidInterface;
class ExampleCommand
{
public function __construct(
#[CastToUuid]
public readonly UuidInterface $id,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'id' => '9f960d77-7c9b-4bfd-9fc4-62d141efc7e5',
],
);
use EventSauce\ObjectHydrator\PropertyCasters\CastToArrayWithKey;
use EventSauce\ObjectHydrator\PropertyCasters\CastToType;
use EventSauce\ObjectHydrator\MapFrom;
use Ramsey\Uuid\UuidInterface;
class ExampleCommand
{
public function __construct(
#[CastToType('string')]
#[CastToArrayWithKey('nested')]
#[MapFrom('number')]
public readonly array $stringNumbers,
) {}
}
$command = $mapper->hydrateObject(
ExampleCommand::class,
[
'number' => [1234],
],
);
$command->stringNumbers === ['nested' => [1234]];
use Attribute;
use EventSauce\ObjectHydrator\ObjectMapper;
use EventSauce\ObjectHydrator\PropertyCaster;
#[Attribute(Attribute::TARGET_PARAMETER)]
class CastToMoney implements PropertyCaster
{
public function __construct(
private string $currency
) {}
public function cast(mixed $value, ObjectMapper $mapper) : mixed
{
return new Money($value, Currency::fromString($this->currency));
}
}
// ----------------------------------------------------------------------
#[Attribute(Attribute::TARGET_PARAMETER)]
class CastUnionToType implements PropertyCaster
{
public function __construct(
private array $typeToClassMap
) {}
public function cast(mixed $value, ObjectMapper $mapper) : mixed
{
assert(is_array($value));
$type = $value['type'] ?? 'unknown';
unset($value['type']);
$className = $this->typeToClassMap[$type] ?? null;
if ($className === null) {
throw new LogicException("Unable to map type '$type' to class.");
}
return $mapper->hydrateObject($className, $value);
}
}
class ExampleCommand
{
public function __construct(
#[CastToMoney('EUR')]
public readonly Money $money,
#[CastUnionToType(['some' => SomeObject::class, 'other' => OtherObject::class])]
public readonly SomeObject|OtherObject $money,
) {}
}
use EventSauce\ObjectHydrator\Constructor;
use EventSauce\ObjectHydrator\MapFrom;
class ExampleCommand
{
private function __construct(
public readonly string $value,
) {}
#[Constructor]
public static function create(
#[MapFrom('some_value')]
string $value
): static {
return new static($value);
}
}
use EventSauce\ObjectHydrator\DefinitionProvider;
use EventSauce\ObjectHydrator\KeyFormatterWithoutConversion;
use EventSauce\ObjectHydrator\ObjectMapperUsingReflection;
$mapper = new ObjectMapperUsingReflection(
new DefinitionProvider(
keyFormatter: new KeyFormatterWithoutConversion(),
),
);
class ExampleCommand
{
public function __construct(
public readonly string $name,
public readonly int $birthYear,
) {}
}
$command = new ExampleCommand('de Jonge', 1987);
$payload = $mapper->serializeObject($command);
$payload['name'] === 'de Jonge';
$payload['birth_year'] === 1987;
use EventSauce\ObjectHydrator\MapFrom;
class BirthDate
{
public function __construct(
public int $year,
public int $month,
public int $day
){}
}
class ExampleCommand
{
public function __construct(
#[MapFrom('my_name')]
public readonly string $name,
#[MapFrom(['year_of_birth' => 'year', 'month', 'day'])]
public readonly BirthDate $birthDate,
) {}
}
$command = new ExampleCommand(
'de Jonge',
new BirthDate(1987, 11, 24)
);
$payload = $mapper->serializeObject($command);
$payload['my_name'] === 'de Jonge';
$payload['year_of_birth'] === 1987;
$payload['month'] === 11;
$payload['day'] === 24;
use EventSauce\ObjectHydrator\ObjectMapper;
use EventSauce\ObjectHydrator\PropertySerializer;
#[Attribute(Attribute::TARGET_PARAMETER | Attribute::TARGET_METHOD | Attribute::TARGET_PROPERTY)]
class UppercaseString implements PropertySerializer
{
public function serialize(mixed $value, ObjectMapper $hydrator): string
{
assert(is_string($value));
return strtoupper($value);
}
}
class Shout
{
public function __construct(
private readonly string $message
) {}
#[UppercaseString]
public function what(): string
{
return $this->message();
}
}
$payload = $mapper->serializeObject(new Shout('Hello, World!');
$payload['what'] === 'HELLO, WORLD!';
use EventSauce\ObjectHydrator\ObjectMapper;
use EventSauce\ObjectHydrator\PropertyCaster;
use EventSauce\ObjectHydrator\PropertySerializer;
class CastToArrayWithKey implements PropertyCaster, PropertySerializer
{
public function __construct(private string $key)
{
}
public function cast(mixed $value, ObjectMapper $hydrator): mixed
{
return [$this->key => $value];
}
public function serialize(mixed $value, ObjectMapper $hydrator): mixed
{
if (is_object($value)) {
$value = $hydrator->serializeObject($value);
}
return $value[$this->key] ?? null;
}
}
use EventSauce\ObjectHydrator\MapperSettings;
#[MapperSettings(serializePublicMethods: false)]
class ClassThatDoesNotSerializePublicMethods
{
// class body
}
#[MapperSettings(serializePublicProperties: false)]
class ClassThatDoesNotSerializePublicProperties
{
// class body
}
use EventSauce\ObjectHydrator\MapperSettings;
#[MapperSettings(serializePublicMethods: false)]
interface InterfaceThatDoesNotSerializePublicMethods
{
public function resource(): string;
}
class ClassThatInheritsMapperSettingsFromInterface implements InterfaceThatDoesNotSerializePublicMethods
{
public function resource(): string
{
return 'foo';
}
}
use EventSauce\ObjectHydrator\DoNotSerialize;
class ClassThatExcludesCertainDataPoints
{
public function __construct(
public string $n '
use EventSauce\ObjectHydrator\ObjectMapper;
use EventSauce\ObjectHydrator\ObjectMapperCodeGenerator;
$dumpedClassNamed = "AcmeCorp\\YourOptimizedMapper";
$dumper = new ObjectMapperCodeGenerator();
$classesToDump = [SomeCommand::class, AnotherCommand::class];
$code = $dumper->dump($classesToDump, $dumpedClassNamed);
file_put_contents('src/AcmeCorp/YourOptimizedMapper.php', $code);
/** @var ObjectMapper $mapper */
$mapper = new AcmeCorp\YourOptimizedMapper();
$someObject = $mapper->hydrateObject(SomeObject::class, $payload);