by Guest » 24 Dec 2024, 10:50
Zum Beispiel habe ich die SimpleDto-Klasse
Code: Select all
class SimpleDto implements GetPhoneInterface
{
public string $name;
public int $value;
}
Und json
Wenn ich es serialisiere, erhalte ich ein ungültiges Objekt.
Code: Select all
$serializer = self::getContainer()->get(SerializerInterface::class);
$dto = $serializer->deserialize($json, $dtoClass);
$dto hat keine Anfangsvariable $value.
Wie kann ich sicherstellen, dass während der Deserialisierung eine Ausnahme auftritt, dass die Klasse nicht validierte Werte hat?< /p>
Wenn dies nicht mit einem Serialisierer gelöst werden kann, gibt es vielleicht eine Möglichkeit, dies mit einem Validator zu überprüfen?
Upd:
Ich habe es versucht Implementieren Sie es so, aber der Code verhält sich falsch. Darüber hinaus ist ObjectNormalizer eine letzte Klasse.
Vielleicht kennt jemand eine bessere Lösung?
Code: Select all
class InitialObjectNormalizer extends ObjectNormalizer
{
// circle check
private array $visitedObjects = [];
private array $errors = [];
public function denormalize(mixed $data, string $type, ?string $format = null, array $context = [])
{
$data = parent::denormalize($data, $type, $format, $context);
$this->handleObject($data);
if (!empty($this->errors)) {
throw new PartialDenormalizationException(null, $this->errors);
}
return $data;
}
public function handleObject($obj): void
{
if (in_array($obj, $this->visitedObjects, true)) {
return;
}
$this->visitedObjects[] = $obj;
$attributes = new ReflectionObject($obj);
foreach ($attributes->getProperties() as $attribute) {
if (!$attribute->isInitialized($obj)) {
$this->errors[] = new NotNormalizableValueException('Attribute ' . $attribute->getName() . ' not initial',);
} else {
$value = $attribute->getValue($obj);
if (is_array($value) || is_object($value)) {
$this->handleObject($value);
}
}
}
}
}
Zum Beispiel habe ich die SimpleDto-Klasse
[code]class SimpleDto implements GetPhoneInterface
{
public string $name;
public int $value;
}
[/code]
Und json
[code]{"name":"Jane"}
[/code]
Wenn ich es serialisiere, erhalte ich ein ungültiges Objekt.
[code]$serializer = self::getContainer()->get(SerializerInterface::class);
$dto = $serializer->deserialize($json, $dtoClass);
[/code]
$dto hat keine Anfangsvariable $value.
Wie kann ich sicherstellen, dass während der Deserialisierung eine Ausnahme auftritt, dass die Klasse nicht validierte Werte hat?< /p>
Wenn dies nicht mit einem Serialisierer gelöst werden kann, gibt es vielleicht eine Möglichkeit, dies mit einem Validator zu überprüfen?
Upd:
Ich habe es versucht Implementieren Sie es so, aber der Code verhält sich falsch. Darüber hinaus ist ObjectNormalizer eine letzte Klasse.
Vielleicht kennt jemand eine bessere Lösung?
[code]class InitialObjectNormalizer extends ObjectNormalizer
{
// circle check
private array $visitedObjects = [];
private array $errors = [];
public function denormalize(mixed $data, string $type, ?string $format = null, array $context = [])
{
$data = parent::denormalize($data, $type, $format, $context);
$this->handleObject($data);
if (!empty($this->errors)) {
throw new PartialDenormalizationException(null, $this->errors);
}
return $data;
}
public function handleObject($obj): void
{
if (in_array($obj, $this->visitedObjects, true)) {
return;
}
$this->visitedObjects[] = $obj;
$attributes = new ReflectionObject($obj);
foreach ($attributes->getProperties() as $attribute) {
if (!$attribute->isInitialized($obj)) {
$this->errors[] = new NotNormalizableValueException('Attribute ' . $attribute->getName() . ' not initial',);
} else {
$value = $attribute->getValue($obj);
if (is_array($value) || is_object($value)) {
$this->handleObject($value);
}
}
}
}
}
[/code]