Symfony Компонент сериализатора AbstractNormalizer :: CALLBACKS denormalize - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь использовать Serialize с обратными вызовами, как в https://symfony.com/doc/current/components/serializer.html#using -callbacks-to-serialize-properties-with-object-databases . Но это не похоже на go в обратном вызове. Я могу игнорировать атрибуты с «IGNORED_ATTRIBUTES» нормально, просто CALLBACKS не работает. Что я делаю неправильно?

$dateCallback = function ($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []) {
            dump('foo');
            return 'faa';
        };        
$defaultContext = [
            AbstractNormalizer::CALLBACKS => [
                'order_date' => $dateCallback,
            ]
        ];        
$normalizer = new ObjectNormalizer(null, null, null, null, null, null,  $defaultContext);
$serializer = new Serializer([$normalizer], []);
$order = $serializer->denormalize($data, Orderform::class, 'array');

Данные представляют собой простой массив.

$data = ['order_date' => '2020-07-07',
'order_number' => '123'];

Я ожидал, что будет вызвана функция $ dateCallback. Но, похоже, этого не происходит. Сущность Orderform заполняется, но не со значением, которое я ожидал бы от обратного вызова. Я также пробовал сделать все это с помощью json и xml, поскольку массив не отображается в документации (но он работает, кроме обратного вызова)

Symfony 4.4

1 Ответ

0 голосов
/ 09 июля 2020

Я не отлаживал ваш код, вместо этого я сделал рабочую версию примера десериализации на основе документации , надеюсь, она послужит руководством:

<?php 

include 'vendor/autoload.php';

use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Serializer;

//
//Inializing the Serializer, enconders and callbacks
//
$encoders = [new XmlEncoder(), new JsonEncoder()];
$dateCallback = function ($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []) {
    return $innerObject instanceof \DateTime ? $innerObject->format('Y-m-d H:i:sP') : '';
};

$defaultContext = [
    AbstractNormalizer::CALLBACKS => [
        'createdAt' => $dateCallback,
    ]
];

$normalizer = [new ObjectNormalizer(null, null, null, null, null, null,  $defaultContext)];
$serializer = new Serializer($normalizer, $encoders);

//
//Creating Object Person that will be serialized
//
$person = new Person();
$person->setName('foo');
$person->setAge(99);
$person->setSportsperson(false);
$person->setCreatedAt(new \DateTime());

$arrayContent = $serializer->serialize($person, 'json');

// $arrayContent contains ["name" => "foo","age" => 99,"sportsperson" => false,"createdAt" => null]
//print_r($arrayContent); // or return it in a Response

// Lets deserialize it
$desrializedPerson = $serializer->deserialize($arrayContent, Person::class, 'json');

var_dump($desrializedPerson);

//
// Foo Bar stuff
//

// Entity Person declaration 
class Person
{
    private $age;
    private $name;
    private $sportsperson;
    private $createdAt;

    // Getters
    public function getName()
    {
        return $this->name;
    }

    public function getAge()
    {
        return $this->age;
    }

    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    // Issers
    public function isSportsperson()
    {
        return $this->sportsperson;
    }

    // Setters
    public function setName($name)
    {
        $this->name = $name;
    }

    public function setAge($age)
    {
        $this->age = $age;
    }

    public function setSportsperson($sportsperson)
    {
        $this->sportsperson = $sportsperson;
    }

    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;
    }
}
...