在 DateTime 字段中将时间戳传递给 symfony 表单

Pass a timestamp to symfony form in a DataTime field

我有一个具有 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)
            ...
            ;
    }

我 post 带有 json 正文的请求:

{
    "expirationDate": 1549706072
}

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

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

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

希望能得到帮助。

试试这样的东西:

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

注意:我将它用于:

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

希望对您有所帮助

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

该语法中明显缺失的是 timestamps

因此你有两个选择:

  1. 创建你自己的变形金刚
  2. 使用另一种输入格式。

你必须使用转换。 (https://symfony.com/doc/current/form/data_transformers.html)

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

例如。

->添加('opening', NumberType::class)

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

  2. 创建一个名为 TimestampToDateTimeTransformer.php

  3. 的新文件

并输入下一个代码

<?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 的表单中添加结束方法下一个代码:

    $建设者 ->得到('opening') ->addModelTransformer(新的 TimestampToDateTimeTransformer()) ;

  2. 就这些了。

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

他解释的很简单!