我正在学习Symfony2的方式,同时为家庭经营的葡萄酒进口商建立一个小型电子商店。我慢慢了解Symfony2概念,但在继续构建购物车的过程中,我不太确定正确(至少根据Sf2标准)的实现方式此
我正在寻找的是一个简单的Basket
存储BasketItems
及其在会话中的金额,然后在结账时使用这些数据。现在,在我将它以某种方式粘合在一起之前,我想听听关于如何完成和正确分离的建议。
到目前为止,我已经创建了两个实体,现在我不确定是否应该将逻辑直接放在实体类或存储库中,或者最好在哪里?
我希望这不是一个太宽泛的问题。我很清楚,真正强大的购物车实施不是一件小事。
在旁注中,是否已经为Symfony2提供了一些经过验证的工作购物篮?
答案 0 :(得分:5)
创建实体和存储库时的一般规则是,Entity类应包含在单个Entity上运行所需的逻辑,而Repository类包含对实体组进行操作所需的逻辑。
一个简单的例子:
如果您想将商品的价格从美元转换为欧元,则可以BasketItem::convertCurrencyTo($currencyType)
。这是在单个实体上运行的代码。
如果您想查找价格在10美元到20美元之间的所有BasketItems
,您可以使用BasketItemRepository::findByPriceRange($min, $max)
。这是对一组实体进行操作的代码。
Basket
有很多BasketItems
,一个User
有一个Basket
。因此,我认为有理由认为,为了获取BasketItems
User
感兴趣,您可以这样做:$user->getBasket()->getBasketItems()
。
请注意,此示例中没有使用Repository,因为它是一个非常基本的查询。如果你需要做一些更具体的事情,比如找到BasketItems
User
感兴趣的那个正在发售的东西,你可以使用像BasketItemRepository::findWhereOnSaleForBasket($BasketId)
这样的东西。没有什么可以阻止您直接向User
或Basket
类添加类似的方法,但我觉得因为您的查询的主要'目标'是BasketItem
,它属于该实体的存储库类。
你提到实施购物车不是一项小任务,你是对的。但是你问的问题并不仅限于Symfony2(在这种情况下,它更多的是关于Doctrine 2),所以我认为如果你查看其他开源购物车并研究他们正在做什么可能会有所帮助。我认为Symfony2真正具有的唯一影响就是迫使你决定如何在bundle中分割你的代码。
希望这有帮助!
答案 1 :(得分:4)