2017-02-20 71 views
1

我需要一些帮助,SF 2.7串行Symfony的2.7日期时间序列化

我做了一个API使用get JSON数据是这样的:

{ 
"dateDebut":"2017-02-16", 
"dateFin":"2018-02-16", 
"caMoisTotalHorsSessions":"5.2", 
"caMoisClients":"5.3", 
"caMoisGarantie":"5.4", 
"caMoisHuile":"5.5" } 

我试过很多方法,以deserialze到我的对象类其中dateDebut和dateFin出席是DateTime对象,而不是字符串

try { 
     $encoder = new JsonEncoder(); 
     $normalizer = new GetSetMethodNormalizer(); 

     $callback = function ($date) { 
      return new \DateTime($date); 
     }; 

     $normalizer->setCallbacks(array(
      'dateDebut' => $callback, 
      'dateFin' => $callback,)); 

     $serializer = new Serializer(array($normalizer), array($encoder)); 

     $entity = $serializer->deserialize($request->getContent(), $class, $format); 
    } catch (RuntimeException $e) { 
     return new JsonResponse(
      ['code' => Response::HTTP_BAD_REQUEST, 'message' => $this->trans('api.message.data_error')], 
      Response::HTTP_BAD_REQUEST); 
    } 

但从未使用过的回调:/任何人都可以帮我吗?

目标是在数据库中刷新对象之前自动将日期字符串转换为日期时间对象。

非常感谢

回答

1

你所要做的是非规范化。规范化器回调用于规范化。我认为这很混乱。奇怪的是,他们只能为一个方向提供设置回调。

我测试了一些代码,做我认为你想做的事。你需要一个自定义的标准化类。该类不是那么复杂,它可以从GetSetNormalizer或ObjectNormalizer扩展。您只需要在这里创建\ DateTime,并且您可以为日期时间添加一些验证。

class BoardNormalizer extends GetSetMethodNormalizer 
{ 
    public function denormalize($data, $class, $format = null, array $context = array()) 
    { 
     if (isset($data['created'])) { 
      $data['created'] = new \DateTime($data['created']); 
     } 

     return parent::denormalize($data, $class, $format, $context); 
    } 
} 

我使用此代码测试它:

$json = json_encode([ 
     'created' => '2017-02-20T05:49:51-0500' 
    ]); 

    $encoder = new JsonEncoder(); 
    $normalizer = new MyCustomNormalizer(); 
    $serializer = new Serializer([$normalizer], [$encoder]); 

    $entity = $serializer->deserialize($json, MyCustomClass::class, 'json'); 

而且它产生我的自定义类,其中created财产是\ DateTime对象。

+0

非常感谢,正是我会做:) –

0

目标是在数据库中刷新对象之前自动将日期字符串转换为日期时间对象。

这样的事情?使用setter/getters?我用下面的代码在实体

private $created; 
public function setCreated($created) 
{ 
    if (!($created instanceof \DateTime)) { 
     $created = date_create($created); 
    } 
    $this->created = $created; 

    return $this; 
} 
+0

这是不可能的,因为它使用多次使用另一种实体,但由于一个特质修改实体。 –

相关问题