2017-02-20 115 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

這是不可能的,因爲它使用多次使用另一種實體,但由於一個特質修改實體。 –

相關問題