Symfony 用户注册和添加地址
Symfony user registration and add addresses
我想创建一个表单来注册用户及其地址 (billing/shipping)
我的表单包含 UserEntity 和两个 Address(Billing/Shipping)
在我的用户实体中,我想保存许多用户保存的地址(以更改购物车中的地址)但默认情况下保留地址 (billing/shipping)
这是我的用户实体
class User implements UserInterface, \Serializable{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $username;
/**
* @ORM\OneToMany(targetEntity="App\Entity\UserAddress", mappedBy="user", orphanRemoval=true)
*/
private $addresses;
/**
* @ORM\OneToOne(targetEntity="App\Entity\UserAddress", cascade={"persist", "remove"})
*/
private $billingAddress;
/**
* @ORM\OneToOne(targetEntity="App\Entity\UserAddress", cascade={"persist", "remove"})
*/
private $deliveryAddress;
}
这是我的用户地址实体:
class UserAddress{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="addresses")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
}
这是我的用户注册类型
$builder
->add('username')
->add('billingAddress', RegistrationAddressType::class, [
'label'=>'billing Address',
'required' => true,
])
->add('deliveryAddress', RegistrationAddressType::class, [
'label'=>'delivery Address',
'required' => false,
])
;
我的表格完美无缺,我拥有所有想要的字段。
但是在这种情况下,当我创建一个新用户时,我在 address->user
上出错,因为它是空的。
如何创建一个用户,他的地址是一种形式?
如何检查用户是否检查过使用相同的地址?并将 user->setDeliveryAddress = billingAddress->getID()
设置为不重复 UserAddress 中的条目 ?
非常感谢你的帮助
在多对一问题上,您可以尝试在地址设置器中添加如下内容:
public function setBillingAddress(?UserAddress $address): self
{
$this->billingAddress = $address->setUser($this);
return $this;
}
以及您的表单地址字段选项 'by_reference' => false
。
关于账单地址和送货地址,你有一对一的关系,如果用户有相同的地址并且表格中的两个字段都将被填写,送货地址应该被删除以避免重复。您可以检查地址是否与 Symfony 表单或学说预提交事件匹配。以及您在用户实体中的送货地址 getter
应如下所示:
public function getDeliveryAddress(): UserAddress
{
if (!empty($this->deliveryAddress)) {
return $this->deliveryAddress;
}
return $this->billingAddress;
}
我想创建一个表单来注册用户及其地址 (billing/shipping) 我的表单包含 UserEntity 和两个 Address(Billing/Shipping)
在我的用户实体中,我想保存许多用户保存的地址(以更改购物车中的地址)但默认情况下保留地址 (billing/shipping)
这是我的用户实体
class User implements UserInterface, \Serializable{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $username;
/**
* @ORM\OneToMany(targetEntity="App\Entity\UserAddress", mappedBy="user", orphanRemoval=true)
*/
private $addresses;
/**
* @ORM\OneToOne(targetEntity="App\Entity\UserAddress", cascade={"persist", "remove"})
*/
private $billingAddress;
/**
* @ORM\OneToOne(targetEntity="App\Entity\UserAddress", cascade={"persist", "remove"})
*/
private $deliveryAddress;
}
这是我的用户地址实体:
class UserAddress{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="addresses")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
}
这是我的用户注册类型
$builder
->add('username')
->add('billingAddress', RegistrationAddressType::class, [
'label'=>'billing Address',
'required' => true,
])
->add('deliveryAddress', RegistrationAddressType::class, [
'label'=>'delivery Address',
'required' => false,
])
;
我的表格完美无缺,我拥有所有想要的字段。
但是在这种情况下,当我创建一个新用户时,我在 address->user
上出错,因为它是空的。
如何创建一个用户,他的地址是一种形式?
如何检查用户是否检查过使用相同的地址?并将 user->setDeliveryAddress = billingAddress->getID()
设置为不重复 UserAddress 中的条目 ?
非常感谢你的帮助
在多对一问题上,您可以尝试在地址设置器中添加如下内容:
public function setBillingAddress(?UserAddress $address): self
{
$this->billingAddress = $address->setUser($this);
return $this;
}
以及您的表单地址字段选项 'by_reference' => false
。
关于账单地址和送货地址,你有一对一的关系,如果用户有相同的地址并且表格中的两个字段都将被填写,送货地址应该被删除以避免重复。您可以检查地址是否与 Symfony 表单或学说预提交事件匹配。以及您在用户实体中的送货地址 getter 应如下所示:
public function getDeliveryAddress(): UserAddress
{
if (!empty($this->deliveryAddress)) {
return $this->deliveryAddress;
}
return $this->billingAddress;
}