Symfony2:如何为实体创建表单但具有不同字段的表单具有属性

时间:2013-09-05 20:49:49

标签: symfony

我有一个包含两个人的Duo实体。在创建过程中,创建者提交电子邮件地址伙伴并决定他是否是新Duo的队长。如果他决定不是(他选择了助理)那么,自动地,第二个人被指派为队长。我的Duo实体如下:

/**
 * @ORM\Table()
 * @ORM\Entity()
 */
class Duo{

    /**
    * @Assert\NotNull()
    * @ORM\OneToOne(targetEntity="User")
    * @ORM\JoinColumn(name="captain_id", referencedColumnName="id")
    */
    private $captain;

    /**
    * @Assert\NotNull()
    * @ORM\OneToOne(targetEntity="User")
    * @ORM\JoinColumn(name="assistant_id", referencedColumnName="id")
    */
    private $assistant;

我想知道如何组织我的表单,以便只提交一个指定合作伙伴的电子邮件地址。当我呼叫$form->isValid()时,我希望我的Duo实体有效。我不想使用没有实体的表单,因为我不想手动分配数据并处理表单之外的错误。此外,我想验证两个用户中的一个是否没有参与另一个Duo。如果是,如何以干净的方式将错误消息传递给表单。

我该怎么办?有没有办法使用表单回调或事件或类似的东西?

1 个答案:

答案 0 :(得分:0)

数据传输可以做你想做的一切:

http://symfony.com/doc/current/cookbook/form/data_transformers.html

我建议仔细阅读,因为我第一次这样做时非常困惑。这里有一个完美的例子,解释了如何构建issue idIssue,基本上与你的情况相同。

至于错误,我认为您最好的选择是将Callback与表单constraints属性结合使用:

http://knpuniversity.com/screencast/question-answer-day/custom-validation-property-path#creating-a-proper-custom-validation-constraint

你应该阅读整篇文章,因为不仅有“正确”的方式,而且“又快又脏”。

希望这有帮助。