Symfony2上的JMS Serializer:使用时间戳而不是日期时间

时间:2015-05-27 08:38:57

标签: symfony serialization fosrestbundle jmsserializerbundle

我使用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完成这项工作?

编辑: @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": []
          },...

1 个答案:

答案 0 :(得分:0)

对于您的问题,我会使用虚拟财产,而不是暴露原始属性。 也许不是最佳实践,但我认为你也可以覆盖get函数并将其转换为。