AutorÃa | Ultima modificación | Ver Log |
<?php
declare(strict_types=1);
namespace LeadersLinked\Hydrator;
use Laminas\Hydrator\AbstractHydrator;
use ReflectionClass;
use ReflectionProperty;
use function array_fill_keys;
use function array_map;
use function get_class;
use function get_object_vars;
class ObjectPropertyHydrator extends AbstractHydrator
{
public function extract(object $object) : array
{
$data = get_object_vars($object);
$filter = $this->getFilter();
foreach ($data as $name => $value) {
// Filter keys, removing any we don't want
if (! $filter->filter($name)) {
unset($data[$name]);
continue;
}
// Replace name if extracted differ
$extracted = $this->extractName($name, $object);
if ($extracted !== $name) {
unset($data[$name]);
$name = $extracted;
}
if ($name == 'added_on' || $name == 'updated_on') {
continue;
}
$data[$name] = $this->extractValue($name, $value, $object);
}
return $data;
}
public function hydrate(array $data, object $object)
{
$properties = null;
if (null === $properties) {
$reflection = new ReflectionClass($object);
$properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
$properties =
array_map(
function (ReflectionProperty $property) {
return $property->getName();
},
$properties
);
}
foreach ($data as $name => $value)
{
$property = $this->hydrateName($name, $data);
if(in_array($property, $properties)) {
$object->$property = $this->hydrateValue($property, $value, $data);
}
}
return $object;
}
}