Symfony2 FormType 可选全或无

Symfony2 FormType optional whole or nothing

我在 Symfony2 中有一个表单,其中包含 2 个子表单类型,代表我实体中的 2 个关系。 invoiceAddress 始终是必需的并且它工作正常,但我希望 deliveryAddress 仅在 deliveryAdress 的所有输入为空时保持可选。 当我将它设置为不需要时,symfony 将 deliveryAddress 设置为 null,当表单中没有填写任何内容时,但是当某些字段已填写时,它不会 运行 对该实体的断言进行验证。所以我想要实现的是当表单完全为空时告诉 symfony 然后将 deliveryAddress 设置为 null 但是当设置表单中的内容时然后 运行 以正常方式进行验证。有什么办法吗?谢谢

我的表单类型看起来像这样,在控制器中我有标准的 $form->isValid 条件。

$builder->add('invoiceAddress',new AddressType())
        ->add('deliveryAddress', new AddressType(),["required" => false])

AdressType 仅包含一些原始类型映射,如下所示:

$builder->add('firstName')
        ->add('lastName')...

在地址实体中:

    /**
 * @Assert\NotBlank
 * @ORM\Column
 * @var string
 */
private $firstName;

/**
 * @Assert\NotBlank
 * @ORM\Column
 * @var string
 */
private $lastName;

如果您正确设置了实体和断言,这应该是开箱即用的。当 Address 对象为空时,表单组件将 return null 作为模型数据并将其设置在父级上。当 属性 为 null 时,将跳过 属性 的验证。它应该看起来像这样:

class Order
{
    /**
     * @var Address
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Address")
     * @ORM\JoinColumn(onDelete="CASCADE", nullable=false)
     *
     * @Assert\NotBlank()
     * @Assert\Valid()
     */
    private $invoiceAddress;

    /**
     * @var Address
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Address")
     * @ORM\JoinColumn(onDelete="SET NULL", nullable=true)
     *
     * @Assert\Valid()
     */
    private $deliveryAddress;

    public function getInvoiceAddress()
    {
        return $this->invoiceAddress;
    }

    public function setInvoiceAddress(Address $address)
    {
        $this->invoiceAddress = $address;
    }

    public function getDeliveryAddress()
    {
        return $this->deliveryAddress;
    }

    public function setDeliveryAddress(Address $address = null)
    {
        $this->deliveryAddress = $address;
    }
}