繁体   English   中英

带有原理的购物车功能

[英]Cart feature with Doctrine

我正在尝试在Symfony应用中实现购物车功能。 目的是允许用户在购物车中添加一些事件。

因此,我创建了3个实体。 UserEventCart 用户需要访问他的购物车来获取他的事件。 就像$user->getCart ,它将返回事件的ArrayCollection。

我不知道用教义关系做这件事的最好方法是什么。 我尝试过的所有方法似乎都无效。

到目前为止,这是我所做的:

在我的User实体中

/**
* @ORM\OneToOne(targetEntity="App\Entity\Cart", mappedBy="user", cascade={"persist", "remove"})
*/
private $cart;

public function getCart(): ?Cart
{
    return $this->cart;
}

public function setCart(Cart $cart): self
{
    $this->cart = $cart;

    // set the owning side of the relation if necessary
    if ($this !== $cart->getUser()) {
        $cart->setUser($this);
    }

    return $this;
}

在我的User实体中

/**
* @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="cart", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $user;

我已经在这里停了下来,因为我觉得我没有采取正确的方法。

我对此有何感想?

尽管我自己还没有测试过,但是很有可能会工作。

实体:

class User
{
    ...

    /**
     * @ORM\OneToMany(targetEntity="Cart", mappedBy="user", cascade={"persist"})
     */
    private $carts;

    public function __construct()
    {
        $this->carts = new ArrayCollection();
    }

    public function addCart(Cart $cart): self
    {
        $this->carts[] = $cart;

        return $this;
    }

    public function removeCart(Cart $cart): bool
    {
        return $this->carts->removeElement($cart);
    }

    public function getCarts(): Collection
    {
        return $this->carts;
    }
}

class Cart
{
    ...

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="carts", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
     */
    private $user;

    /**
     * @ORM\OneToMany(targetEntity="Event", mappedBy="cart", cascade={"persist"})
     */
    private $events;

    public function __construct()
    {
        $this->events = new ArrayCollection();
    }

    public function setUser(User $user): self
    {
        $this->user = $user;

        return $this;
    }

    public function getUser(): User
    {
        return $this->user;
    }

    public function addEvent(Event $event): self
    {
        $this->events[] = $event;

        return $this;
    }

    public function removeEvent(Event $event): bool
    {
        return $this->events->removeElement($event);
    }

    public function getEvents(): Collection
    {
        return $this->events;
    }
}

class Event
{
    ...

    /**
     * @ORM\ManyToOne(targetEntity="Cart", inversedBy="events", cascade={"persist"})
     * @ORM\JoinColumn(name="cart_id", referencedColumnName="id", nullable=false)
     */
    private $cart;

    public function setCart(Cart $cart): self
    {
        $this->cart = $cart;

        return $this;
    }

    public function getCart(): User
    {
        return $this->cart;
    }
}

在进行手推车和电子商务时,您必须记住很多事情,并且需要问自己要保留什么样的信息。 有些人以事件源方式开发购物车模块,因此他们不会丢失任何数据。 格雷格·杨(Greg Young)的演讲在这个主题上很棒。 那是我要使用的方法,但不是最简单的方法。

但是也许您不想保留所有这些有价值的额外状态。 在这种情况下,您可以尝试使用传统的CRUD方法。

使用此功能时,请记住两件事。

  1. 您的事件是可变的。 价格可以改变,位置可以改变,时间可以改变。
  2. 购买完成后,您将使用该购物车并从中生成一个Purchase对象。 由于1,该Purchase对象不能与Event有任何关系。
  3. 我想您不希望用户拥有一个购物车。 一个用户可以有多个购物车,因此也许您应该在购物车一侧将这种关系设置为ManyToOne 否则,购物车只能是您可以存储在用户中的值对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM