-->

Symfony2.1表格日期字段:参数1传递给...必须的DateTime的一个实例(Symfony

2019-09-24 07:19发布

我的实体:

/**
 * @var \DateTime $publishedAt
 *
 * @ORM\Column(name="published_at", type="date")
 * 
 * @Assert\Date()
 */
private $publishedAt;

/**
 * Set publishedAt
 *
 * @param \DateTime $publishedAt
 * @return MagazineIssue
 */
public function setPublishedAt(\DateTime $publishedAt)
{
    $this->publishedAt = $publishedAt;

    return $this;
}

/**
 * Get published_at
 *
 * @return \DateTime 
 */
public function getPublishedAt()
{
    return $this->publishedAt;
}

我的表单生成器:

$builder->add('publishedAt');

我的观点:

{{ form_widget(form) }}

当我选择在选择的日期并提交表单我catche错误:

Catchable Fatal Error: Argument 1 passed to ... must be an instance of DateTime, 
string given, called in .../vendor/symfony/symfony/src/Symfony/Component/Form
/Util/PropertyPath.php on line 537 and defined in ... line 214 

为什么会发生? 如果我更换与现场二传手public function setPublishedAt($publishedAt)我得到了错误:

Fatal error: Call to a member function format() on a non-object 
in .../vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateType.php on line 44 

如果我改变了表单生成器来

 $builder->add('publishedAt','date')

一切工作正常。 为什么会发生? 为什么symfony中不能猜测它,并通过现场二传手正确的日期格式(\日期时间,而不是字符串)?

编辑:如果我删除@Assert\Date()然后一切工作正常了。 我认为这是一个错误sf2.1与猜测的日期字段类型

Answer 1:

我用来对付这就像最大写到后来我才发现数据变压器 。 这是非常有效的方式,并不意味着修改模型(或它的getter / setter方法)...

编辑:检查出的标题是“在自定义字段类型使用变形金刚”。 他们写DateTime有...



Answer 2:

学说想打电话\日期时间::格式()。 从一个字符串。

您可以检查在setter方法参数:

public function setPublishedAt($publishedAt)
{
    if($publishedAt instanceof \DateTime) {
        $this->publishedAt = $publishedAt;
    } else {
        $date = new \DateTime($publishedAt);
        $this->publishedAt = $date;
    }
}


Answer 3:

为了解决这个问题,您可以

1.更改从断言@Assert\Date()@Assert\Type('\DateTime')

要么

2.change表单生成器,以$builder->add('publishedAt','date')

要么

3.specify的input形式生成器选项: $builder->add('publishedAt',null,array('input' => 'datetime'))



文章来源: Symfony2.1 form date field: Argument 1 passed to … must be an instance of DateTime