验证嵌入表单(如果不为空)

时间:2019-02-19 17:37:48

标签: symfony doctrine

我有两个实体:ProgramWidget

程序

class Program
{
     ....
    /**
     * @Assert\Valid
     * 
     * @ORM\OneToOne(targetEntity="Widget", inversedBy="program", cascade={"persist", "remove"}, orphanRemoval=true)
     * @ORM\JoinColumn(nullable=true)
     */
    private $widget;
}

小部件

class Widget
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="integer")
     */
    private $addressId;

    /**
     * @ORM\Column(type="integer")
     */
    private $extAddressId;

    /**
     * @ORM\Column(type="string")
     */
    private $language;

    /**
     * @ORM\OneToOne(targetEntity="Program", mappedBy="widget")
     */
    private $program;
}

我有两个问题。

首先,我需要在已定义WidgetaddressIdextAddressId(而不是两者)上添加条件约束。

widget不需要第二个Program。是要么让所有表单字段都为空白,要么像不想在表单中添加小部件,要么填写表单,但必须遵守条件约束,当然也要遵守必填字段。

我正试图添加一个Callback,正如官方文档here中所述,但是我不知道如何将两者结合起来。

1 个答案:

答案 0 :(得分:1)

首先,您必须定义Assert von小部件关系,例如

Column Widet
@Assert\Valid()

接下来,您必须在小部件本身上使用表达式,例如

Column adressId
@Assert\Expression(
     *     expression=" (this.getAdressId() and !this.extAdressId()) or !this.getAdressId() ",
     *     message="error.cant_be_enabled_with_adress_id"
     * )

Column extAdressId
@Assert\Expression(
     *     expression=" (this.getExtAddressId() and !this.getAdressId()) or !this.getExtAdressId() ",
     *     message="error.cant_be_enabled_with_adress_id"
     * )