2012-10-19 64 views
2

我的實體的一個實例:Symfony2.1表格日期字段:傳遞給...參數1必須是日期時間

/** 
* @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) }} 

當我選擇日期並提交表格時,我發現錯誤:

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無法猜測它並傳遞給字段setter正確的日期格式(\ DateTime而不是字符串)?

編輯:如果我刪除@Assert\Date()然後一切正常工作。我認爲這是一個sf2.1錯誤,猜測日期字段類型

+0

錯誤很明顯:您試圖設置字符串而不是日期時間對象,您是如何呈現已發佈的字段的? – Snroki

+0

我上面描述過,只是'{{form_widget(form)}}'它呈現所有形式的字段 – Mikhail

回答

0

爲了解決這個問題,您可以

1.更改從@Assert\Date()斷言到@Assert\Type('\DateTime')

OR

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

3.指定input在表單構建器中的選項:$builder->add('publishedAt',null,array('input' => 'datetime'))

+0

它是@Assert \ DateTime()https://symfony.com/doc/current/reference/constraints/DateTime.html#basic-usage – dotoree

0

主義想調用\ DateTime :: format()。來自一個字符串。

您可以檢查setter方法參數:我​​用來對付這就像最大寫道

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

謝謝。我明白這一點。但它不是很好的方式。我使用[here](http://symfony.com/doc/current/book/forms.html#creating-a-simple-form)中的默認文檔,但它不起作用 – Mikhail

+0

DataTransformer將在此處需要。 –

1

,但後來我發現Data transformers。這是非常有效的方式,並不意味着修改模型(或它的getter/setter方法)...

編輯:簽出標題「在自定義字段類型中使用變形金剛」。他們寫DateTime有...

+0

我不明白爲什麼Sf無法猜測它。如果我將表單生成器更改爲'$ builder-> add('publishedAt','date')',那麼所有工作都正常。你知道它爲什麼會發生嗎? – Mikhail