
Alan
04.07.2017
09:27:01
например модель заказа тебе надо посчитать сумму товаров в нем

Ad
04.07.2017
09:27:20
Одни читатели нас хотят читать, мать их, вторые не могут и в фб жалобы пишут

Alan
04.07.2017
09:27:51
с доктриной это анемичная модель и отдельные менеджеры, сервисы, которые берут на себя бизнес логику

Ruslan
04.07.2017
09:27:54
я про бизнес логику
http://ocramius.github.io/doctrine-best-practices/#/37 определимся с терминами
то, что на слайде пойдет за бизнес-логику?

Google

Alan
04.07.2017
09:28:07
с rich model это класс модели у которого состояния - пропсы и методы для их изменения

Max
04.07.2017
09:28:11
нет?

Alan
04.07.2017
09:29:43
товары в заказе это другие сущности

Max
04.07.2017
09:30:05
public function getSum()
{
$sum = 0;
foreach ($this->products as $product) {
...
}
return $sum;
}
ну и как бы в твоем домене ордер содержит в себе ссылки на продукты

Alan
04.07.2017
09:32:27
ну и у этих продуктов есть логика которую ты должен использовать

Max
04.07.2017
09:32:54
метод getPrice()

Alan
04.07.2017
09:33:04
это не логика это геттер)

Jan
04.07.2017
09:33:16
Еще один дилетантский вопрос: странно ли было бы назвать репозиторий отлично от названия сущности? Хочу сделать так: сущность MapPoint и репозиторий GeographicalCoverageRepository.
это не логика это геттер)
Внутри него и содержится логика относительно того, как считать сумму товаров. Может, там будет скидка?

Alan
04.07.2017
09:34:09
или купон активированный

Google

Max
04.07.2017
09:34:27

Alan
04.07.2017
09:34:33
а что? сервис?

Ruslan
04.07.2017
09:35:00
Активированный купон звучит как часть заказа. Поэтому он и пойдет в заказ и будет использоваться в методе getSum().

Jan
04.07.2017
09:35:04
и назвать его можно не getPrice, а calculatePrice, например)

Alan
04.07.2017
09:35:54
ну находу я хороший пример не придумал да) то есть сервисы с бизнес логикой нам впринципе не нужны и их никто не делает?)
все в классе с сущностью доктрины верно?

Max
04.07.2017
09:36:23

Ruslan
04.07.2017
09:37:21
Поведение, которое принадлежит сущности, в классе с сущностью доктрины
Поведение, которое вне сущности, лежит в отдельном сервисе

Sergey
04.07.2017
09:37:54

Max
04.07.2017
09:40:03
> то есть сервисы с бизнес логикой нам впринципе не нужны и их никто не делает?)
обычно сервисы описывают какой-то процесс, когда сложно отнести что-то к отдельной сущности и то это довольно таки не частый кейс

Sergey
04.07.2017
09:40:18
у сущностей отдельный цикл жизни от цикла жизни контейнера. ты не сможешь никак в сущности пихать референсы на какие-либо сервисы, репосы и прочий булшит, только дабл диспатч в редких случаях
а rich model не стоит путать с AR

Alan
04.07.2017
09:40:35
так, другой пример)
пополнить баланс пользователя = назначить ему свойство + создать транзакцию пополнения это модель пользователя?

Aleh
04.07.2017
09:41:00
ты всегда можешь аргументом в метод сущности кинуть сервис, через который сущность сделает все, что ей нужно

Alan
04.07.2017
09:41:27
а у этого сервиса своя зависимость

Sergey
04.07.2017
09:41:34
User->deposit(100)

Aleh
04.07.2017
09:41:35
это уже никого не волнует

Max
04.07.2017
09:42:05
> создать транзакцию пополнения
транзакция это уже инфраструктура

Aleh
04.07.2017
09:42:20

Max
04.07.2017
09:42:22
проблема в том что в реальной жизни деньги материальны
те у тебя есть материальный эквивалент ценности

Google

Aleh
04.07.2017
09:43:18

Max
04.07.2017
09:44:04
и если на сделку смотреть не с точки зрения комп системы, там нет транзакций

Alan
04.07.2017
09:45:04
а если он скажет что деньги не пришли?)
а ты ему их перевел через банк) транзакция не нужна?

Sergey
04.07.2017
09:45:31

Aleh
04.07.2017
09:45:36

Ruslan
04.07.2017
09:46:37

Max
04.07.2017
09:47:01
ну я прост про то что в реальной модели бизнеса нет базы данных и нет транзакций - это уже технические ограничения которые накладываются при моделировании системы

Alan
04.07.2017
09:48:32
да почему, ты по договору должен перевести на счет
подтверждение этому транзакция

Sergey
04.07.2017
09:48:40
в банках есть) транзакция это снятие с одного счета и зачисление на другой счет, это 2 операции

Alan
04.07.2017
09:49:35
и эта бизнес задача - одна модель, но она рассеивается на несколько классов

Max
04.07.2017
09:50:13

Alan
04.07.2017
09:51:45
конечно, но все что требует зависимостей которые тоже имеют зависимости будет в сервисе
и останутся сеттеры/геттеры в энтити

Sergey
04.07.2017
09:52:10
1. доменные ивенты
2. double dispatch
и готово

Sergey
04.07.2017
09:53:09

Google

Sergey
04.07.2017
09:53:19
а, понял
и пока не попробуешь и не появятся конкретные вопросы - считаю разговор пустышкой
я могу сказать что без сеттеров уж точно можно делать, и даже без геттеров (но тут есть нюансы)

Sergey
04.07.2017
09:56:02
суть в том что в сервисах у тебя в принципе не должно быть кода в духе
$transaction = new Transaction();
$transaction->setAmout(...);
$transaction->setCreatedAt(..);
$user->getTransactions()->add($transaction);
$user->setBalance(...)
$em->persist($transaction);

Sergey
04.07.2017
09:56:58
это называется transactional scripts

Jan
04.07.2017
09:57:02
Sergey а что должно быть?)

Alan
04.07.2017
09:57:16
$this->userManager->addBalance() ?)

Admin
ERROR: S client not available

Max
04.07.2017
09:57:17
$transaction = new Transaction($user, $amount);
$em->persist($transaction);

Sergey
04.07.2017
09:57:40
а еще лучше persist спрятать в репозитории

Sergey
04.07.2017
09:57:43

Sergey
04.07.2017
09:57:51
тоже норм
только $account

Sergey
04.07.2017
09:57:59
$user->transfer($amount, $anotherUser)

Sergey
04.07.2017
09:58:13
хотя от домена зевисит

Sergey
04.07.2017
09:58:18
а то доебутся еще до названия

Max
04.07.2017
09:58:49
bounded context же))

Google

Max
04.07.2017
09:59:52
можно еще даже так $transaction = $user->transfer($amount, $anotherUser);
но это уже it depends

Sergey
04.07.2017
10:01:31
да в принципе как угодно. это уже полноценный доменный язык выходит, который исключает вариации невалидного состояния, когда сняли с одного счета, а на второй забыли положить, или балансы забыли обновить, или время транзакции указать

Alan
04.07.2017
10:04:30
$user->transfer($amount, $anotherUser)
а если $amount это объект из суммы, валюты, etc, мы его предварительно формируем в сервисе ?

Max
04.07.2017
10:05:54
мне кажется что проблема кучи сервисов и того примера с setter-ми что выше происходит из-за манипуляции не объектами а данными - типа как их распихать по разным структурам
например ты юзеров же как-то достал
ну и с $amount также

Sergey
04.07.2017
10:12:39
можно еще отдельные бизнес правила и т.д. выносит в сервисы

Max
04.07.2017
10:16:09
но это уже будут не доменные сервисы
больше заточенные под приложение, чисто для оркестрации изменения состояния системы

Sergey
04.07.2017
10:17:43
там много чего можно делать
главное не зацикливаться на идее "есть сервисы и сущности"

Dinar
04.07.2017
12:16:46
Вы используете inline стили?

Andrew
04.07.2017
12:24:10

Dinar
04.07.2017
12:24:19
ага

Andrew
04.07.2017
12:25:18
inline styles юзаем для отрисовки critical path css

Dinar
04.07.2017
12:25:34
Что это?

Andrew
04.07.2017
12:27:16
критический CSS, который загружается вместе с хтмлем и позволяет сделать базовую отрисовку страницы без загрузки файлов стилей и т.д.