Куда положить метод по генерации цены?

Обсуждаем, как правильно строить приложения
Ответить
gogolinsky
Сообщения: 17
Зарегистрирован: 2016.05.27, 00:31

Куда положить метод по генерации цены?

Сообщение gogolinsky »

У товара (ActiveRecord) есть цена и она выводится геттером

Код: Выделить всё

function getPrice() {return $this->price}
.
Но в системе есть спец. пользователи, которым можно указать персональную скидку на товар. Как лучше считать и выводить цену товара теперь? Также у товаров есть производители, и иногда эти производители делают скидку на все свои товары. Куда лучше положить код по генерации конечной стоимости товара с учетом всех возможных скидок?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Куда положить метод по генерации цены?

Сообщение Nex-Otaku »

Код: Выделить всё

function getPrice()
{
return PriceBuilder::buildPrice($this);
}
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Куда положить метод по генерации цены?

Сообщение zelenin »

доменный сервис PriceCalculator
gogolinsky
Сообщения: 17
Зарегистрирован: 2016.05.27, 00:31

Re: Куда положить метод по генерации цены?

Сообщение gogolinsky »

На сайте есть каталог, в котором нужно выводить уже посчитанную цену товара с учетом скидки для человека. Есть корзина, в которую нужно класть товар с подсчитанной скидкой. В каждом случае перед удобнее же использовать getPrice() сущности Товар. Может лучше заинъектить этот калькулятор внутрь сущности и вызывать из getPrice()? Можно вообще в сущности в конструктор передавать сервисы?
Melodic
Сообщения: 87
Зарегистрирован: 2016.05.11, 17:43
Откуда: Луганск

Re: Куда положить метод по генерации цены?

Сообщение Melodic »

gogolinsky писал(а): 2017.12.19, 16:54 На сайте есть каталог, в котором нужно выводить уже посчитанную цену товара с учетом скидки для человека. Есть корзина, в которую нужно класть товар с подсчитанной скидкой. В каждом случае перед удобнее же использовать getPrice() сущности Товар. Может лучше заинъектить этот калькулятор внутрь сущности и вызывать из getPrice()? Можно вообще в сущности в конструктор передавать сервисы?
В ActiveRecord нельзя передавать зависимости через конструтор, можно в сам метод передавать сервис
gogolinsky
Сообщения: 17
Зарегистрирован: 2016.05.27, 00:31

Re: Куда положить метод по генерации цены?

Сообщение gogolinsky »

Тогда для обычного вывода цены товара на странице, придется во view передавать с товаром и сервис, а потом вызывать ->getPrice($service)?
Так можно и забыть передать этот параметр когда-нибудь и покажется цена без скидки.
noLogicOnlyWar
Сообщения: 83
Зарегистрирован: 2017.07.04, 20:53

Re: Куда положить метод по генерации цены?

Сообщение noLogicOnlyWar »

Melodic писал(а): 2017.12.19, 18:48 В ActiveRecord нельзя передавать зависимости через конструтор, можно в сам метод передавать сервис
Думаю можно, переопределив instantiate предварительно.
gogolinsky писал(а): 2017.12.19, 19:36 Тогда для обычного вывода цены товара на странице, придется во view передавать с товаром и сервис, а потом вызывать ->getPrice($service)?
Так можно и забыть передать этот параметр когда-нибудь и покажется цена без скидки.
Проще просто цену передать во вью. А лучше передать view model (можно использовать тот же AR, например ябы сделал через фабрику, ProductViewFactory::create(...)) с уже проставленной ценой.
gogolinsky
Сообщения: 17
Зарегистрирован: 2016.05.27, 00:31

Re: Куда положить метод по генерации цены?

Сообщение gogolinsky »

Но при подсчете стоимости корзины придется для каждого товара в ней создавать viewModel для подсчета его стоимости. Костыль какой-то
noLogicOnlyWar
Сообщения: 83
Зарегистрирован: 2017.07.04, 20:53

Re: Куда положить метод по генерации цены?

Сообщение noLogicOnlyWar »

Подсчет стоимости корзины это где? если в домене, то там никаких viewModel и не может быть. View model это как способ удобно передать данные во вьюшку.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Куда положить метод по генерации цены?

Сообщение anton_z »

gogolinsky писал(а): 2017.12.19, 16:54 На сайте есть каталог, в котором нужно выводить уже посчитанную цену товара с учетом скидки для человека. Есть корзина, в которую нужно класть товар с подсчитанной скидкой. В каждом случае перед удобнее же использовать getPrice() сущности Товар. Может лучше заинъектить этот калькулятор внутрь сущности и вызывать из getPrice()? Можно вообще в сущности в конструктор передавать сервисы?
На мой взгляд вы все правильно думаете, сейчас я сам бы так и сделал, хотя раньше был против внедрения через конструктор в AR и сущности, затем для себя пришел к другому выводу. В Yii внедрять через конструктор AR да, пока нельзя, но может они это исправят, посмотрел трекер - вроде пока все задачи связанные с этим закрыты: https://github.com/yiisoft/yii2/issues/5786, а жаль.
Либо через метод (неудобно будет таскать везде сервис для вызова), либо через локатор сервисов Yii::$container. Да, тест будет посложнее, придется локатор с нужным объектом в setUp() сначала сделать.

Код: Выделить всё


interface PricingStrategy
{
     public function price($product):
}

class CustomPricedProduct extends ActiveRecord
{
    
    private $pricing_strategy;
    
    public function init()
    {
        //видимо, это вместо конструктора с кастомными зависимостями и задумывалось разработчиками Yii. 
        //почему не прямо в price() обращаемся к локатору - потому что удобнее, 
        //все обращения к локатору в одном методе класса, легче понять его зависимости (сохраняет много времени и сил)
        $this->pricing_strategy = \Yii::$container->get(PricingStrategy::class);
        parent::init();
    }

    public function price()
    {
      //передаем объект товара, стратегии может понадобиться все что угодно - базовая цена, производитель и т.п.)
      return $this->pricing_strategy->price($this);
    }

}

Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Куда положить метод по генерации цены?

Сообщение samdark »

Они не закрыты просто так. Они исправлены, если что...
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Куда положить метод по генерации цены?

Сообщение anton_z »

samdark писал(а): 2017.12.20, 14:15 Они не закрыты просто так. Они исправлены, если что...
Ой, действительно, смерджено. Пойду пробовать)
gogolinsky
Сообщения: 17
Зарегистрирован: 2016.05.27, 00:31

Re: Куда положить метод по генерации цены?

Сообщение gogolinsky »

Сделал именно так. Рабочий вариант
Ответить