【问题标题】:Pass a timestamp to symfony form in a DataTime field在 DateTime 字段中将时间戳传递给 symfony 表单
【发布时间】:2018-02-09 11:00:46
【问题描述】:

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

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

我尝试了将'input' =&gt; 'timestamp' 添加到表单(描述为here)之类的选项,但我没有找到使它起作用的方法。

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

希望我能找到帮助。

【问题讨论】:

    标签: php symfony datetime symfony-forms


    【解决方案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 ->get('打开') ->addModelTransformer(新 TimestampToDateTimeTransformer()) ;

    2. 仅此而已。

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

    他解释得很简单!

    【讨论】:

      【解决方案2】:

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

      该语法中明显缺少的是时间戳

      因此你有两个选择:

      1. 创建您自己的转换器
      2. 使用其他输入格式。

      【讨论】:

      • 如果有人想知道如何在 ICU 中制作Y-m-d H:i:syyyy-MM-dd HH:mm:ss
      【解决方案3】:

      尝试类似:

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

      注意:我将它用于:

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

      希望有帮助

      【讨论】:

      • 感谢您的回答,我在我的表单中尝试了它,但我无法让它工作。我发帖:{ "expirationDate": 1549706072 } 我仍然收到错误消息:"expirationDate": { "errors": [ "This value is not valid." ] }
      猜你喜欢
      • 2022-01-24
      • 2011-06-12
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2020-01-09
      相关资源
      最近更新 更多