我需要一些SF 2.7序列化程序的帮助
我已经使用这样获取Json Data的API:
{
"dateDebut":"2017-02-16",
"dateFin":"2018-02-16",
"caMoisTotalHorsSessions":"5.2",
"caMoisClients":"5.3",
"caMoisGarantie":"5.4",
"caMoisHuile":"5.5" }
我尝试了很多方法来反序列化到我的对象类中,其中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);
}
但回调从未使用过:/有人可以帮我吗?
目标是在刷新数据库中的对象之前自动将日期字符串转换为Datetime对象。
非常感谢
答案 0 :(得分: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对象。
答案 1 :(得分:0)
目标是在刷新数据库中的对象之前自动将日期字符串转换为Datetime对象。
这样的东西?使用setter / getters?我在实体
中使用以下代码private $created;
public function setCreated($created)
{
if (!($created instanceof \DateTime)) {
$created = date_create($created);
}
$this->created = $created;
return $this;
}