我有一個/checkout
JSON API端點,它允許可選的billingAddress
參數以及其他參數(如電子郵件和deliveryAddress
)。Symfony窗體 - 允許刪除嵌套窗體關聯實體
這些地址存儲在與Order
實體相關的Address
實體中。
如果用戶輸入其billingAddress,一切都很好,但如果用戶刪除以前提交的帳單地址,我無法找到任何方法刪除billingAddress
實體。理想情況下,要刪除帳單地址我會使用下面的JSON POST請求。
{
"email": "[email protected]",
"deliveryAddress": {
"line1": "1 Box Lane"
},
"billingAddress": null
}
這是所有可能的Symfony形式?
有關當前設置的簡單說明,請參見下文。
實體
/**
* @ORM\Entity
*/
class Order
{
// ...
/**
* @var Address
*
* @ORM\OneToOne(targetEntity = "Address", cascade = {"persist", "remove"})
* @ORM\JoinColumn(name = "deliveryAddressId", referencedColumnName = "addressId")
*/
private $deliveryAddress;
/**
* @var Address
*
* @ORM\OneToOne(targetEntity = "Address", cascade = {"persist", "remove"}, orphanRemoval = true)
* @ORM\JoinColumn(name = "billingAddressId", referencedColumnName = "addressId", nullable = true)
*/
private $billingAddress;
public function setDeliveryAddress(Address $deliveryAddress = null)
{
$this->deliveryAddress = $deliveryAddress;
return $this;
}
public function getDeliveryAddress()
{
return $this->deliveryAddress;
}
public function setBillingAddress(Address $billingAddress = null)
{
$this->billingAddress = $billingAddress;
return $this;
}
public function getBillingAddress()
{
return $this->billingAddress;
}
// ...
}
。
/**
* @ORM\Entity
*/
class Address
{
// ...
/**
* @var string
*
* @ORM\Column(type = "string", length = 45, nullable = true)
*/
private $line1;
// ...
}
形式
class CheckoutType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', EmailType::class)
->add('deliveryAddress', AddressType::class, [
'required' => true
])
->add('billingAddress', AddressType::class, [
'required' => false
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Order::class,
'csrf_protection' => false,
'allow_extra_fields' => true,
'cascade_validation' => true
]);
}
public function getBlockPrefix()
{
return '';
}
}
。
class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('line1', TextType::class);
// ...
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Address::class,
'allow_extra_fields' => true
]);
}
public function getBlockPrefix()
{
return '';
}
}
有趣的想法,已經適應了這個只是刪除元素沒有更新實體。稍後我會有機會發布更新。 Thnaks – Nick