2

私のエンティティ:

/**
 * @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がそれを推測してフィールドセッターに適切な日付形式(文字列ではなく\ DateTime)を渡すことができないのはなぜですか?

編集:私が削除した@Assert\Date()場合、すべてが正常に動作します。日付フィールドタイプを推測することによるsf2.1のバグだと思います

4

3 に答える 3

1

私はMaxが書いたようにこれを扱っていましたが、その後データトランスフォーマーを発見しました。これは非常に効率的な方法であり、モデル(またはゲッター/セッターメソッド)への変更を意味するものではありません...

編集:「カスタムフィールドタイプでのトランスフォーマーの使用」というタイトルを確認してください。彼らはそこについて書いてDateTimeいます...

于 2012-10-19T09:09:16.267 に答える
0

Doctrineは\DateTime:: format()を呼び出したいと思っています。文字列から。

setterメソッドで引数を確認できます。

public function setPublishedAt($publishedAt)
{
    if($publishedAt instanceof \DateTime) {
        $this->publishedAt = $publishedAt;
    } else {
        $date = new \DateTime($publishedAt);
        $this->publishedAt = $date;
    }
}
于 2012-10-19T09:02:47.230 に答える
0

この問題を解決するには、

1.アサートをから@Assert\Date()に変更します@Assert\Type('\DateTime')

また

2.フォームビルダーをに変更します$builder->add('publishedAt','date')

また

3.inputフォームビルダーでオプションを指定します。$builder->add('publishedAt',null,array('input' => 'datetime'))

于 2012-10-20T13:39:27.510 に答える