Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ismail1432/23679cb3724d07b60a76293b3a30cf34 to your computer and use it in GitHub Desktop.
Save ismail1432/23679cb3724d07b60a76293b3a30cf34 to your computer and use it in GitHub Desktop.
<?php
// Simple hydrator
final class Hydrator
{
public function hydrate($object, array $data = [])
{
foreach ($data as $property => $value) {
$method = 'set'.ucfirst($property);
if (\method_exists($object, $method)) {
$object->{$method}($value);
}
}
}
}
class Root {
/**
* @var string
*/
$firstName;
/**
* @var string
*/
$lastName; //string
// other properties
/**
* @var FooEmbedded
*/
$fooEmbedded;
/**
* @var BarEmbedded
*/
$barEmbedded;
/**
* @var DummyEmbedded
*/
$dummyEmbedded;
// setters
}
// index.php
$data = [
'firstname' => 'Smaone',
'lastName' => 'LesZommes',
// nearly 20 properties in the root
'dummyEmbedded' => ['property1'=> 'value', 'property2'=> 'value',],//...
'barEmbedded' => ['property1'=> 'value', 'property2'=> 'value',]//...
'fooEmbedded' => ['property1'=> 'value', 'property2'=> 'value',]//...
];
$embeddedRelations = [
'dummyEmbedded'=> FooEmbedded::class,
'barEmbedded' => BarEmbedded,
'fooEmbedded'=> FooEmbedded::class
];
// Replace the emmbedded array by an object
foreach ($embeddedRelations as $relationName => $fqcn) {
$relationObject = new $fqcn;
(new Hydrator)->hydrate($relationObject, $data[$relationName]);
$data[$relationName] = $relationObject;
}
// Hydrate the Root :-)
$root = new Root;
(new Hydrator)->hydrate($root, $data);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment