/** * Create array from object * * @param object $object * * @return mixed[] */ private function setArray($object) : array { $data = []; $configurationObject = $this->configuration->getConfigurationObjectForClass(new ClassName(get_class($object))); $identifier = $configurationObject->getIdentifier(); if ($identifier !== '') { $data[$this->configuration->getIdentifierAttribute()] = $identifier; } foreach ($configurationObject->getAttributes() as $attribute) { $type = $configurationObject->getTypeForAttribute($attribute); $data = $this->processSerializeForType($type, $object, $data, $attribute); } return $data; }
/** * @param Type\Collection\IdentifiedObject $objectType * @param object $object * @param array $values * * @return Deserialize */ private function processDeserializeTypeCollectionIdentifiedObject(Type\Collection\IdentifiedObject $objectType, $object, array $values) : self { $identifierAttribute = $this->configuration->getIdentifierAttribute(); $objects = []; foreach ($values as $key => $objectFromValue) { if (isset($objectFromValue[$identifierAttribute]) === false) { continue; } $configurationObject = $this->configuration->getConfigurationObjectForIdentifier($objectFromValue[$identifierAttribute]); if ($configurationObject instanceof Blackhole) { continue; } $objects[$key] = $this->setObjectForClass($configurationObject->getClassName(), $objectFromValue); } $object->{$objectType->setter()}($objects); return $this; }
public function testDeserializeForIdentifiedObjectShouldThrowExceptionWhenJsonDontHaveIdentifier() { $configuration = new Configuration(); $configuration->identifierAttribute('type'); $configurationObject = new Configuration\Object(new ClassName(City::class)); $configurationObject->attributeUseMethod('name', 'setName', 'getName')->registerToConfigurationWithIdentifier($configuration, 'city'); $this->given($this->newTestedInstance($configuration))->exception(function () { $this->testedInstance->deserialize('{"name": "Palaiseau"}'); })->isInstanceOf(MissingIdentifierAttribute::class); }
public function testSerializeWithTypeCollectionIdentifiedObject() { $cityPalaiseau = new City(); $cityPalaiseau->setName('Palaiseau'); $cityParis = new City(); $cityParis->setName('Paris'); $country = new Country(); $country->setName('France'); $country->citiesAre([$cityPalaiseau, $cityParis]); $configuration = new Configuration(); $configuration->identifierAttribute('type'); $configurationObject = new Configuration\Object(new ClassName(Country::class)); $configurationObject->attributeUseMethod('name', 'setName', 'getName')->attributeUseCollectionIdentifiedObject('cities', 'citiesAre', 'getCities')->registerToConfigurationWithIdentifier($configuration, 'country'); $configurationObject = new Configuration\Object(new ClassName(City::class)); $configurationObject->attributeUseMethod('name', 'setName', 'getName')->registerToConfigurationWithIdentifier($configuration, 'city'); $this->given($this->newTestedInstance($configuration))->string($this->testedInstance->serialize($country))->isIdenticalTo('{"type":"country","name":"France","cities":[{"type":"city","name":"Palaiseau"},{"type":"city","name":"Paris"}]}'); }
/** * @param Configuration $configuration * @param string $identifier * * @return ObjectInterface */ public function registerToConfigurationWithIdentifier(Configuration $configuration, string $identifier) : ObjectInterface { $this->identifier($identifier); $configuration->addConfigurationObjectWithIdentifier($this->className, $this, $identifier); return $this; }