【问题标题】:JMS Serializer on Symfony2 : work with timestamps instead of datetimesSymfony2 上的 JMS 序列化器:使用时间戳而不是日期时间
【发布时间】:2015-08-09 05:34:35
【问题描述】:

我使用 Symfony2、FOSRestBundle 和 JMS Serializer 制作了一个 Web 服务。 Web 服务客户端处理的是时间戳而不是 ISO 格式化日期时间。

我希望 JMS Serializer 将输入从时间戳转换为 DateTimes,并将输出从 DateTimes 转换为时间戳。

我试图把这个注释放在我的属性上:

/**
 * Start of validity
 *
 * @var \DateTime
 *
 * @ORM\Column(name="validityStart", type="datetime", nullable=true)
 *
 * @Assert\Type(type="integer",message="Validity dates must be timestamps. [{{ value }}] is incorrect.")
 *
 * @Serializer\Expose()
 * @Serializer\Groups({"ticket_detail","ticket_list"})
 * @Serializer\Type("DateTime<'U'>")
 *
 */
private $validityStart;

当我这样做时,我在表单验证时收到此错误:

"validityStart": {
        "errors": [
          "This value is not valid."
        ],
        "children": {
          "date": {
            "children": {
              "year": [],
              "month": [],
              "day": []
            }
          },
          "time": {
            "children": {
              "hour": [],
              "minute": []
            }
          }
        }

你知道我怎样才能让 JMS 序列化器完成这项工作吗?

编辑: @Serializer\Type 注释在输出上效果很好。但是我仍然有输入问题...

编辑 2:这是我的表单生成器

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('validityStart', 'datetime',
                array(  'format'=>'U',
                        'required'=>false,
                        'description'=>'The message validity start timestamp')
            )
            ->add('validityEnd', 'integer',
                array(  'required'=>false,
                        'description'=>'The message validity end timestamp')
            )
        ;
    }

我尝试了两种方法,第二种方法似乎有效!但是通过表单验证后出现此错误:

"message": "Error: Call to a member function format() on a non-object",
        "class": "Symfony\\Component\\Debug\\Exception\\FatalErrorException",
        "trace": [
          {
            "namespace": "",
            "short_class": "",
            "class": "",
            "type": "",
            "function": "",
            "file": "/var/www/symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php",
            "line": 53,
            "args": []
          },...

【问题讨论】:

    标签: symfony serialization fosrestbundle jmsserializerbundle


    【解决方案1】:

    对于您的问题,我会使用虚拟属性而不公开原始属性。 也许不是最佳实践,但我认为您也可以覆盖 get 函数并在那里进行转换。

    【讨论】:

    • 我对解决这个问题的任何想法都持开放态度,但实际上,虚拟属性仅适用于序列化(输出)。 @Serializer/Type 注释非常适合序列化!问题在于反序列化...
    • 您能否也发布您为此使用的表格?
    • 我贴出来了。当我将字段设置为整数时,错误发生了变化
    • 我想你也把validitystart放在你的表单中。实际上,在您需要数据转换器将“整数”转换为日期时间之后。看看这个文档:symfony2-document.readthedocs.org/en/latest/cookbook/form/…
    猜你喜欢
    • 2022-01-14
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多