So erstellen Sie ein erstes Objekt mit Symfony-Serialisierung

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: So erstellen Sie ein erstes Objekt mit Symfony-Serialisierung

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

Code: Select all

{"name":"Jane"}
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);
}
}
}
}
}

Top