【发布时间】:2016-12-12 18:59:29
【问题描述】:
我有一个/checkout JSON API 端点,它允许在电子邮件和deliveryAddress 等其他参数旁边使用可选的billingAddress 参数。
这些地址存储在与Order 实体相关的Address 实体中。
如果用户输入他们的 billingAddress,一切正常,但如果用户删除了之前提交的帐单地址,我找不到删除 billingAddress 实体的方法。理想情况下,要删除帐单地址,我会使用以下 JSON POST 请求。
{
"email": "nick@example.com",
"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 '';
}
}
【问题讨论】:
标签: symfony doctrine-orm