Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony/条令反序列化时间_Symfony_Serialization_Time_Doctrine - Fatal编程技术网

Symfony/条令反序列化时间

Symfony/条令反序列化时间,symfony,serialization,time,doctrine,Symfony,Serialization,Time,Doctrine,我已在我的条令实体中创建了以下字段: /** * @ORM\Column(type="time") * @Groups({"default"}) */ private $timeFrom; 我正在尝试使用以下代码反序列化实体: $workingDays = $serializer->deserialize($json, WorkingDay::class, 'json', array('groups' => array('default'))); 我试过javascript

我已在我的条令实体中创建了以下字段:

/**
 * @ORM\Column(type="time")
 * @Groups({"default"})
 */
private $timeFrom;
我正在尝试使用以下代码反序列化实体:

$workingDays = $serializer->deserialize($json, WorkingDay::class, 'json', array('groups' => array('default')));
我试过javascript中的几种时间/日期时间格式,但Symfony似乎没有反序列化它们


我的问题是:Symfony想要什么类型的格式作为反序列化到时间的输入?

从序列化程序的文档看,在实例化
$Serializer
实例时,需要包含
DateTimeNormalizer
()

$normalizers = [
    ...,
    new DateTimeNormalizer(),
];

$serializer = new Serializer(normalizers, [new JsonEncoder()]);
然后,用你问题中的那句话。理论上,它应该是有效的,但当时我无法测试它。你能做到吗

DateTimeNormalizer
使用RFC3339格式,根据它,这是一个正确格式值的示例:
1985-04-12T23:20:50.52Z

更新: 为了让它工作,正如我在上面所假设的,您需要在序列化程序的规范化程序列表中包含
DateTimeNormalizer
。然而,这正是它变得棘手的地方

  • 规格化器的顺序很重要:
  • 您必须首先放置
    DateTimeNormalizer
    ,否则,您将得到令人不安的误导性
    missingConstructor或argumentsException

  • 类型发现
  • 序列化程序需要知道如何将
    字符串
    反规范化为
    日期时间
    。为此,
    ObjectNormalizer
    有一个类型提取器,用于查找有关底层类型的更多信息。类型可以通过多种方式发现,但我假设您的操作将通过或完成

    现在,举个例子:

    // Prepare the data in form of JSON string
    $incomingData = [
        'id' => 1337,
        'time' => '2018-07-24T01:29:50.00Z',
        'info' => 'Lorem ipsum'
    ];
    $rawData = json_encode($incomingData);
    
    
    $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
    
    // Very important to set type extractor
    $normalizer = new ObjectNormalizer($classMetadataFactory, null, null, new PhpDocExtractor());
    
    $normalizers = [
        new DateTimeNormalizer(),
        $normalizer,
    ];
    
    $serializer = new Serializer($normalizers, [new JsonEncoder()]);
    
    $myObject = $serializer->deserialize($rawData, FooObject::class, 'json');
    
    var_dump($myObject);
    
    这产生了:

    object(App\Data\FooObject)[3333]
      private 'id' => int 1337
      private 'time' => 
        object(DateTime)[3540]
          public 'date' => string '2018-04-12 23:20:50.520000' (length=26)
          public 'timezone_type' => int 2
          public 'timezone' => string 'Z' (length=1)
      private 'info' => string 'Lorem ipsum' (length=11)
    

    希望这会有所帮助……

    可能看起来很明显,但您是否将该属性的setter和getter添加到实体中,因为它是私有的?当您反序列化它时,会发生什么?空值,不正确的值?它给了我一个错误。属性路径构造函数需要“Symfony\Component\PropertyAccess\PropertyPath”的字符串或实例。得到了:“整数。是的,我增加了接球手和二传手。但这不是我真正的问题。我只是想知道我必须在JSON中输入什么时间格式。你如何实例化你的
    $serializer
    ?我将在明天试一试!提前谢谢。使用此设置时,我会遇到完全相同的错误。序列化程序希望我提供什么类型的字段?我是否像datetime字符串一样提供时间?或者一个不同的字符串,比如'08:00:00'。我两次都试过了,但它给了我相同的错误信息。抱歉,我还没有来测试这个。我打算在几个小时内完成这项工作,并更新我的答案……苏,我花了一段时间才尝试,但我还是成功了。正在更新答案。。。