У меня есть объект, который содержит поле типа DateTimeInterface
с именем completedAt
, и я хочу десериализовать объект JSON для этого объекта объекта.
Я пытался DateTimeNormalizer
и ObjectNormalizer
, но они оба дали мне ошибку, сказав, что я не могу присвоить строку / массив объекту DateTime.
Например, у меня есть эта сущность,
class Task
{
private $id;
private $name;
/**
* @var DateTimeInterface
*/
private $completedAt;
}
и способ создания объекта JSON в моем тесте с использованием PHPUnit,
$rawData = json_encode([
'name' => 'test-task',
'completedAt' => Carbon::now()->toRfc3339String(),
// I tried some other formats here, such as datetime array, datetime string, etc.
]);
В моем контроллере я попробовал это (это тест, а не мой реальный код):
public function update(Request $request, Task $task, SerializerInterface $serializer): Response
{
$task = new Task();
$task->setName('test');
$task->setCompletedAt(Carbon::now()->toDateTime());
$json = $serializer->serialize($task, 'json');
$serializer = new Serializer([new ObjectNormalizer(), new DateTimeNormalizer()], [new JsonEncoder()]); // array of needed normalizer
var_dump($serializer->deserialize($json, Task::class, 'json'));
}
Я получил эту ошибку,
NotNormalizableValueException
Ожидаемый аргумент типа «DateTimeInterface», «строка», заданный в пути к свойству «completeAt».
Как можно десериализовать этот объект JSON с помощью нескольких нормализаторов?