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

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

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

Сообщение gogolinsky » 2017.11.26, 11:44

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

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

function getPrice() {return $this->price}
.
Но в системе есть спец. пользователи, которым можно указать персональную скидку на товар. Как лучше считать и выводить цену товара теперь? Также у товаров есть производители, и иногда эти производители делают скидку на все свои товары. Куда лучше положить код по генерации конечной стоимости товара с учетом всех возможных скидок?

Nex-Otaku
Сообщения: 809
Зарегистрирован: 2016.07.09, 21:07

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

Сообщение Nex-Otaku » 2017.11.26, 11:48

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

function getPrice()
{
return PriceBuilder::buildPrice($this);
}

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin » 2017.11.26, 15:19

доменный сервис PriceCalculator

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

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

Сообщение gogolinsky » 2017.12.19, 16:54

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

Melodic
Сообщения: 87
Зарегистрирован: 2016.05.11, 17:43
Откуда: Луганск

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

Сообщение Melodic » 2017.12.19, 18:48

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

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

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

Сообщение gogolinsky » 2017.12.19, 19:36

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

noLogicOnlyWar
Сообщения: 75
Зарегистрирован: 2017.07.04, 20:53

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

Сообщение noLogicOnlyWar » 2017.12.19, 21:24

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 » 2017.12.20, 00:08

Но при подсчете стоимости корзины придется для каждого товара в ней создавать viewModel для подсчета его стоимости. Костыль какой-то

noLogicOnlyWar
Сообщения: 75
Зарегистрирован: 2017.07.04, 20:53

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

Сообщение noLogicOnlyWar » 2017.12.20, 00:23

Подсчет стоимости корзины это где? если в домене, то там никаких viewModel и не может быть. View model это как способ удобно передать данные во вьюшку.

anton_z
Сообщения: 353
Зарегистрирован: 2017.01.15, 15:01

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

Сообщение anton_z » 2017.12.20, 01:46

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
Администратор
Сообщения: 8800
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark » 2017.12.20, 14:15

Они не закрыты просто так. Они исправлены, если что...

anton_z
Сообщения: 353
Зарегистрирован: 2017.01.15, 15:01

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

Сообщение anton_z » 2017.12.20, 14:20

samdark писал(а):
2017.12.20, 14:15
Они не закрыты просто так. Они исправлены, если что...
Ой, действительно, смерджено. Пойду пробовать)

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

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

Сообщение gogolinsky » 2017.12.20, 15:54

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

Ответить