@symfony_php

Страница 247 из 1418
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 это класс модели у которого состояния - пропсы и методы для их изменения

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
ну находу я хороший пример не придумал да) то есть сервисы с бизнес логикой нам впринципе не нужны и их никто не делает?)

все в классе с сущностью доктрины верно?

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

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
User->deposit(100)
не, ну Money::USD(100 * 100) хотя бы ))

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
а ты ему их перевел через банк) транзакция не нужна?
Как-то анемичная модель этому поможет? Как-то rich model как этому помешает?

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
в банках есть) транзакция это снятие с одного счета и зачисление на другой счет, это 2 операции
нет - операция одна, перевод средств. Измеения балансов это чуть другая штука.

1. доменные ивенты 2. double dispatch

и готово

Google
Sergey
04.07.2017
09:53:19
а, понял

конечно, но все что требует зависимостей которые тоже имеют зависимости будет в сервисе
слишком однобокий взгляд на вещи. Попробуй смотреть на проблему через призму "информационного эксперта" и "information hiding"

и пока не попробуешь и не появятся конкретные вопросы - считаю разговор пустышкой

я могу сказать что без сеттеров уж точно можно делать, и даже без геттеров (но тут есть нюансы)

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
только $account
user чтобы понятнее было

а то доебутся еще до названия

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-ми что выше происходит из-за манипуляции не объектами а данными - типа как их распихать по разным структурам

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

например ты юзеров же как-то достал

ну и с $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 стили?

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, который загружается вместе с хтмлем и позволяет сделать базовую отрисовку страницы без загрузки файлов стилей и т.д.

Страница 247 из 1418