gpt4 book ai didi

php - 序列化器 Symfony 上的回调

转载 作者:行者123 更新时间:2023-12-02 02:26:43 25 4
gpt4 key购买 nike

我正在运行 Symfony 2.7,并且正在尝试将对象(Doctrine 实体)输出为 JSON。

当我规范化对象时,我想转换它的一些值。为此,我在the documentation中找到了“setCallbacks”方法。但我有点困惑如何将其应用到我的案例中。

有没有办法在调用 Symfonys 序列化器服务时设置的规范器上调用“setCallbacks”方法?

这是我想要实现的目标的一个简短示例:

//ExampleController.php

public function getJSONOrderByIdAction($id) {
$serializer = $this->get('serializer');
$normalizer = $serializer->getNormalizer(); // <- This is what I'm unable to do

$dateTimeToString = function ($dateTime) {
return $dateTime instanceof \DateTime ? $dateTime->format(\DateTime::ISO8601) : '';
};

$normalizer->setCallbacks(['time' => $dateTimeToString]);


$order = $this->getDoctrine()->find("AppBundle:Order", $id);

return new JsonResponse(["order" => $serializer->normalize($order, null, ["groups" => ["public"]])]);
}

我知道大多数人已经切换到 JMS 序列化器。似乎内置的序列化器应该能够处理我想要实现的目标。

最佳答案

默认的序列化器服务是在依赖项注入(inject)阶段创建的,并且序列化器接口(interface)不允许编辑(完整)规范化器的检索。

我认为你(至少)有三个选择:

  1. 将自定义标准化器添加到默认序列化器服务
  2. 将 NormalizedInterface 添加到您的实体
  3. 按照您的尝试创建一个新的序列化器服务(或文档建议的本地对象)。

我认为在你的场景中,情况 1 是首选(因为情况 2 很快就会变得无聊)。

我会做这样的事情;首先创建一个自定义标准化器

<?php
namespace AppBundle;

class DateTimeNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface
{
/**
* {@inheritdoc}
*/
public function normalize($object, $format = null, array $context = array())
{
return $object->format(\DateTime::ISO8601);
}

/**
* {@inheritdoc}
*/
public function denormalize($data, $class, $format = null, array $context = array())
{
return new $class($data);
}

/**
* Checks if the given class is a DateTime.
*
* @param mixed $data Data to normalize.
* @param string $format The format being (de-)serialized from or into.
*
* @return bool
*/
public function supportsNormalization($data, $format = null)
{
return $data instanceof \DateTime;
}

/**
* Checks if the given class is a DateTime.
*
* @param mixed $data Data to denormalize from.
* @param string $type The class to which the data should be denormalized.
* @param string $format The format being deserialized from.
*
* @return bool
*/
public function supportsDenormalization($data, $type, $format = null)
{
$class = new \ReflectionClass($type);

return $class->isSubclassOf('\DateTime');
}
}

然后将其注册到您的服务:

# app/config/services.yml
services:
datetime_normalizer:
class: AppBundle\DateTimeNormalizer
tags:
- { name: serializer.normalizer }

关于php - 序列化器 Symfony 上的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33148750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com