Общее правило при создании сущностей и репозиториев состоит в том, что класс сущностей должен содержать логику, необходимую для работы с одной сущностью, а классы репозитория содержат логику, необходимую для работы с группами сущностей.
Простой пример:
Если вы хотите конвертировать цену предмета из долларов в евро, вы получите BasketItem::convertCurrencyTo($currencyType)
. Это код, который работает с одним объектом.
Если вы хотите найти все BasketItems
, цена которых составляет от 10 до 20 долларов, вы должны использовать BasketItemRepository::findByPriceRange($min, $max)
. Это код, который работает с группой сущностей.
ИМО, вещи могут стать немного запутанными, когда имеешь дело с сущностями, которые имеют отношения один ко многим или многие ко многим. Я бы предположил, что у одного Basket
есть много BasketItems
, а у одного User
есть одно Basket
. Поэтому я думаю, что разумно предположить, что для получения BasketItems
a User
, интересующего вас, вы можете сделать что-то вроде этого:
$user->getBasket()->getBasketItems()
.
Обратите внимание, что в этом примере не используется репозиторий, потому что это очень простой запрос. Если вам нужно сделать что-то более конкретное, например, найти, что BasketItems
a User
заинтересован в том, чтобы быть в продаже, вы можете использовать что-то вроде BasketItemRepository::findWhereOnSaleForBasket($BasketId)
. Ничто не мешает вам добавить подобный метод непосредственно в классы User
или Basket
, но я чувствую, что поскольку основной «целью» вашего запроса является BasketItem
, он принадлежит классу репозитория этого объекта.
Вы упоминаете, что внедрение корзины для покупок - задача не из легких, и вы правы. Но вопросы, которые вы задаете, на самом деле не ограничиваются Symfony2 (в данном случае это больше касается Doctrine 2), поэтому я думаю, что это может быть полезно, если вы посмотрите другие корзины с открытым исходным кодом и изучите, что они делают. Я думаю, что единственное влияние, которое Symfony2 действительно может оказать, - это заставить вас решить, как разделить ваш код на пакеты.
Надеюсь, это поможет!