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;
}
}
我在 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;
}
}