У меня несколько сложный механизм ценообразования в моем приложении. Вот некоторые из моих бизнес-правил для настройки этапа (сущности полужирный):
- Продукт может иметь уникальные Ценовые точки для данного Клиента, Веб-сайт или Клиента Группа.
- Продукт может иногда иметь один или несколько дополнительных параметров, которые могут иметь свои собственные Ценовые точки или Правила цены. > .
- Продукт имеет одно Уникальное дополнение, выбранное пользователем, которое по существу является ценой и целым числом.
Прямо сейчас у меня есть EntityRepository для Price Points, чтобы существенно определить правильную цену для базового продукта. То же самое относится к Уникальное дополнение и Параметры.
PricePointRepository
public function getThePrice($Product, $qty, $Website, $Customer = null)
{
//all logic to get product price for this given instance goes here. Good.
}
Контроллер (упрощенный)
public function indexAction()
{
$Product = $em->dostuffwithpostdata;
$qty = POST['qty']; //inb4insecure trolls
$Website = $em->dostuff();
$Customer = (if user is logged in, return their object with $em, otherwise null as it is a guest or public person); // No business logic here, just understanding the request.
$price = $em->getRepository(PricePointRepository)->getThePrice($Product,$qty,Website,$Customer);
$Options[] = $em->dostuffwithPOSTdata;
$optionsPrice = 0;
//Below is some logic directly related to pricing the product.
foreach($Options as $option) {
if($option->hasRule()) {
$optionsPrice += $ruleprice; //after some other stuff of course)
} else {
$optionsPrice += $em->getRepository(OptionPricePoints)->getPrice($option->getID(),$qty);
}
}
$uniqueAdditionPrice = $em->stuff;
$finalprice = $price + $optionsPrice + $uniqueAdditionPrice; //This is logic related to how I price this type of product!
$unitprice = $finalprice / $qty;
//twig stuff to render and show $finalprice, $unitprice, $uniqueAdditionPrice
}
Это только для страницы продукта. Что происходит, когда я добираюсь до корзины, сохраняя заказ и т.д., Когда эту логику нужно повторно использовать. Как вы можете видеть, я использую Doctrine всюду, чтобы вытащить данные на основе моей бизнес-логики в классы репозитория.
Я с радостью приветствую urdoingitwrong ответы, потому что я действительно думаю, что это неправильно. Как я могу это исправить? Что-то красивое было бы сервисом, который по сути выглядит следующим образом:
$pricer = getPricerService->Pricer($Entities,$postdata,$etc);
$unitPrice = $pricer->getUnitPrice();
$totalPrice = $pricer->getTotalPrice();
$optionsPrice = $pricer->getOptionsPrice();
Но я не знаю, как это сделать в Symfony/Doctrine, особенно в том, как доступ к Doctrine и Repositories осуществляется в контроллерах.