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