Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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;
    }
}