在 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。
因此你有两个选择:
- 创建你自己的变形金刚
- 使用另一种输入格式。
你必须使用转换。 (https://symfony.com/doc/current/form/data_transformers.html)
- 您必须像 NUmberType 一样设置您的字段表单。
例如。
->添加('opening', NumberType::class)
在表单文件夹中创建一个名为 DataTransformer 的新文件夹
创建一个名为 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);
}
}
在 buildForm 的表单中添加结束方法下一个代码:
$建设者
->得到('opening')
->addModelTransformer(新的 TimestampToDateTimeTransformer())
;
就这些了。
他解释的很简单!
我有一个具有 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。
因此你有两个选择:
- 创建你自己的变形金刚
- 使用另一种输入格式。
你必须使用转换。 (https://symfony.com/doc/current/form/data_transformers.html)
- 您必须像 NUmberType 一样设置您的字段表单。
例如。
->添加('opening', NumberType::class)
在表单文件夹中创建一个名为 DataTransformer 的新文件夹
创建一个名为 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);
}
}
在 buildForm 的表单中添加结束方法下一个代码:
$建设者 ->得到('opening') ->addModelTransformer(新的 TimestampToDateTimeTransformer()) ;
就这些了。
他解释的很简单!