我有一个具有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,但我认为有一种更好的方法可以用表单来完成。
希望我能找到帮助。
答案 0 :(得分:3)
这里的问题是Symfony DateTimeType
不使用PHP日期处理的格式选项,而是使用ICU,您可以在此处找到:
http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax
该语法中缺少的是时间戳。
因此,你有两个选择:
答案 1 :(得分:1)
您必须使用变换。 (https://symfony.com/doc/current/form/data_transformers.html)
例如
-> add('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以结束方法的下一个代码:
$ builder ->获取('开幕') -> addModelTransformer(new TimestampToDateTimeTransformer()) ;
仅此而已。
他解释得很简单!
答案 2 :(得分:0)
尝试类似:
->add(expirationDate', DateTimeType::class, [
'widget' => 'single_text',
'date_format' => 'U',
]);
注意:我用它:
'date_format' => "yyyy-MM-dd'T'HH:mm:ss.SSS",
希望这个帮助