将时间戳传递给DataTime字段中的symfony表单

时间:2018-02-09 11:00:47

标签: php symfony datetime symfony-forms

我有一个具有DateTime属性的实体:

/**
 * Poll
 *
 * @ORM\Table(name="poll")
 * @ORM\Entity(repositoryClass="Hubup\CoreBundle\Repository\PollRepository")
 */
class Poll
{


/**
 * @var \DateTime
 *
 * @ORM\Column(name="expiration_date", type="datetime")
 *
 * @Groups({"basic"})
 * @Type("DateTime<'U'>")
 *
 */
    private $expirationDate;
...

使用相应的表格:

class PollType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('expirationDate', DateTimeType::class)
            ...
            ;
    }

我发布了一个json正文的请求:

{
    "expirationDate": 1549706072
}

我希望将expirationDate映射为DateTime,就像字符串日期一样。

我尝试了将'input' => 'timestamp'添加到表单中的选项(描述为here),但我找不到使其正常工作的方法。

当我有这样的情况时,我通常从表单中获取数据并手动在控制器中创建DateTime,但我认为有一种更好的方法可以用表单来完成。

希望我能找到帮助。

3 个答案:

答案 0 :(得分:3)

这里的问题是Symfony DateTimeType不使用PHP日期处理的格式选项,而是使用ICU,您可以在此处找到: http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax

该语法中缺少的是时间戳

因此,你有两个选择:

  1. 创建自己的Transformer
  2. 使用其他输入格式。

答案 1 :(得分:1)

您必须使用变换。 (https://symfony.com/doc/current/form/data_transformers.html

  1. 您必须像NUmberType一样设置字段表单。

例如

-> add('opening',NumberType :: class)

  1. 在表单文件夹中新建一个名为DataTransformer的文件夹

  2. 制作一个名为TimestampToDateTimeTransformer.php的新文件

并输入下一个代码

<?php

namespace AppBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class TimestampToDateTimeTransformer implements DataTransformerInterface
{

    /**
     * @param \DateTime $dateTime
     */
    public function transform($dateTime)
    {
        if($dateTime === null)
        {
            return (new \DateTime('now'))->getTimestamp();
        }
        return $dateTime->getTimestamp();
    }

    public function reverseTransform($timestamp)
    {
        return (new \DateTime())->setTimestamp($timestamp);
    }

}
  1. 在表单中添加buildForm以结束方法的下一个代码:

    $ builder     ->获取('开幕')     -> addModelTransformer(new TimestampToDateTimeTransformer())     ;

  2. 仅此而已。

非常感谢:https://codereviewvideos.com/course/beginner-s-guide-to-symfony-3-forms/video/timestamps-on-symfony-forms

他解释得很简单!

答案 2 :(得分:0)

尝试类似:

    ->add(expirationDate', DateTimeType::class, [
        'widget' => 'single_text',
        'date_format' => 'U',
    ]);

注意:我用它:

        'date_format' => "yyyy-MM-dd'T'HH:mm:ss.SSS",

希望这个帮助