Вопросы по ViewModel

Обсуждаем, как правильно строить приложения
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Вопросы по ViewModel

Сообщение sda »

Есть доменный объект и часть его состояния нужно отобразить в пользовательском интерфейсе.

Подскажите, по следующим вопросам:

1. ViewModel можно создавать в контроллере ?
2. ViewModel может зависеть от фреймворка ?
3. Application service может возвращать в контроллер доменный объект ?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопросы по ViewModel

Сообщение zelenin »

sda писал(а): 2017.03.22, 15:36 Есть доменный объект и часть его состояния нужно отобразить в пользовательском интерфейсе.

Подскажите, по следующим вопросам:

1. ViewModel можно создавать в контроллере ?
viewmodel - экшнозависимая сущность. в экшне она и должна создаваться (через трансформер какой-нибудь)
sda писал(а): 2017.03.22, 15:362. ViewModel может зависеть от фреймворка ?
ну это же просто dto возможно со вспомогательными методами
sda писал(а): 2017.03.22, 15:363. Application service может возвращать в контроллер доменный объект ?
может.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Вопросы по ViewModel

Сообщение anton_z »

zelenin писал(а): 2017.03.23, 00:14
sda писал(а): 2017.03.22, 15:363. Application service может возвращать в контроллер доменный объект ?
может.
Помогите разобраться. В книге DDD in PHP советуют: не связывать напрямую домен и ui. Не давать ui доступа к бизнес методам. Все через application services, request/response и dto.
Последний раз редактировалось anton_z 2017.03.23, 02:49, всего редактировалось 2 раза.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопросы по ViewModel

Сообщение zelenin »

anton_z писал(а): 2017.03.23, 02:18
zelenin писал(а): 2017.03.23, 00:14
sda писал(а): 2017.03.22, 15:363. Application service может возвращать в контроллер доменный объект ?
может.
По мне так лучше возвращать dto или transformer. В книге DDD in PHP так и советуют: не связывать напрямую домен и ui. Не давать ui доступа к бизнес методам. Все через application services, request/response и dto.
вернуть сущность и передать в трансформер для формирования контекстозависимого viewmodel. давать доступ ui не надо.
сервис контекстонезависим, поэтому не знает о ui и формате viewmodel.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Вопросы по ViewModel

Сообщение anton_z »

zelenin писал(а): 2017.03.23, 02:43 вернуть сущность и передать в трансформер для формирования контекстозависимого viewmodel. давать доступ ui не надо.
сервис контекстонезависим, поэтому не знает о ui и формате viewmodel.
А если dto из сервиса возвращать, это сделает его контекстозависимым? Что лучше возвращать из сервиса - сущность или dto?
На основе dto потом viewmodel сделать.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Вопросы по ViewModel

Сообщение anton_z »

А если можно сущность возвращать, то почему тогда нельзя сущность создавать в контроллере и передавать ее в сервис?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопросы по ViewModel

Сообщение zelenin »

anton_z писал(а): 2017.03.23, 02:49 А если можно сущность возвращать, то почему тогда нельзя сущность создавать в контроллере и передавать ее в сервис?
потому что между реквестом и сущностью может быть несколько действий, например валидация входных данных, их обработка/подготовка, контекстозависимое создание сущности. Где все это делать? в экшне?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопросы по ViewModel

Сообщение zelenin »

anton_z писал(а): 2017.03.23, 02:47
zelenin писал(а): 2017.03.23, 02:43 вернуть сущность и передать в трансформер для формирования контекстозависимого viewmodel. давать доступ ui не надо.
сервис контекстонезависим, поэтому не знает о ui и формате viewmodel.
А если dto из сервиса возвращать, это сделает его контекстозависимым?
ну а какой ты dto вернешь? данные из сущности Post или Post+Comments+Author? сервис не знает какие данные ждет ui. А вернув сущность, мы получим доступ ко всем необходимым данным (если учесть что у нас уже работает lazy load итд).
anton_z писал(а): 2017.03.23, 02:47Что лучше возвращать из сервиса - сущность или dto?
dto нужно передавать в сервис, возвращать сущность, передавать в трансформер.

вообще вот такую схему я вижу пригодной:

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

$dto = $this->postDtoFactory->fromRequest($request);
$this->postService->savePost($dto);
$post = $this->postService->getPost($dto->id());
$viewModel = $this->viewModelFactory->create($post);
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Вопросы по ViewModel

Сообщение anton_z »

zelenin писал(а): 2017.03.23, 03:03 ну а какой ты dto вернешь? данные из сущности Post или Post+Comments+Author? сервис не знает какие данные ждет ui. А вернув сущность, мы получим доступ ко всем необходимым данным (если учесть что у нас уже работает lazy load итд).
А я думал, что application service это типа use-case. А use case определяет какие данные поступают на вход, какие на выход.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Вопросы по ViewModel

Сообщение anton_z »

Например, нам нужно посчитать стоимость какой-нибудь платной услуги и показать пользователю на странице. Стоимость считается на основе данных в БД, но сама в БД не сохраняется. Я решаю такую задачу с помощью запроса к ApplicationService, в ответ мне приходит dto со стоимостью и сопутствующими данными.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопросы по ViewModel

Сообщение zelenin »

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

Re: Вопросы по ViewModel

Сообщение anton_z »

zelenin писал(а): 2017.03.23, 03:45 ну и ок? в чем проблема? в том, что ты не можешь уложить в один паттерн все случаи жизни?
Видимо да) Пытаюсь определить границы применимости dto.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Вопросы по ViewModel

Сообщение anton_z »

А если у меня внизу (в application service), не domain model a голый SQL тогда кроме возврата DTO альтернатив нет?
В старых приложениях, которые приходится поддерживать, понамешан SQL и html. Рефакторю заворачиванием в application services, отделяя ui от работы с данными.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Вопросы по ViewModel

Сообщение zelenin »

anton_z писал(а): 2017.03.23, 04:16 А если у меня внизу (в application service), не domain model a голый SQL тогда кроме возврата DTO альтернатив нет?
В старых приложениях, которые приходится поддерживать, понамешан SQL и html. Рефакторю заворачиванием в application services, отделяя ui от работы с данными.
возвращаешь то, что нужно, исходя из контекста.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Вопросы по ViewModel

Сообщение sda »

anton_z, я тоже считаю, что сервис должен возвращать dto и по книгам Вернона так и есть. Но я использую websocket и нужно вернуть не только ответ на запрос, но и рассылать данные по сокетам. Например, такой кейс
Пользователь делает запрос, чтобы войти на сайт. Пользователь получает ответ с данными о своем профиле. Остальные получают уведомление о входе пользователя с усеченными данными о его профиле.
То есть условно на запрос пользователя ему нужно вернуть ответ {login: 'name', money: 100}, а всем остальным уведомление {login: 'name'}. Но я не могу из сервиса вернуть два разных dto. Теперь я вообще не знаю, что я должен возвращать из сервиса.

Я думаю, что теперь сервисы должны не только возвращать dto, но еще и эмитить (emit) события уровня приложения. Но это не точно.

Хочу сразу пояснить, что делаю не на Yii и даже не на PHP.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопросы по ViewModel

Сообщение slavcodev »

sda писал(а): 2017.03.22, 15:36 3. Application service может возвращать в контроллер доменный объект ?
Не может. Контроллер это UI, ничего о домене он знать не должен.
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопросы по ViewModel

Сообщение slavcodev »

sda писал(а): 2017.04.19, 22:53 То есть условно на запрос пользователя ему нужно вернуть ответ {login: 'name', money: 100}, а всем остальным уведомление {login: 'name'}. Но я не могу из сервиса вернуть два разных dto. Теперь я вообще не знаю, что я должен возвращать из сервиса.
Пусть возвращают DTO содержащий данные на "все кейсы", ничего страшного что где-то в контроллере будет ДТО с данными которые он не юзает, гораздо хуже если контроллер будет иметь доступ к сущности домена и сможет менять его состояния.
Жду Yii 3!
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Вопросы по ViewModel

Сообщение sda »

Ну вообще у Эванса в книге такая диаграмма.
Изображение

slavcodev, ну допустим. Но еще нужно знать, каким конкретно пользователям отправлять. Эти данные тоже в dto хранить?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопросы по ViewModel

Сообщение slavcodev »

Да храни в DTO все что AL хочет рассказать UI.
Жду Yii 3!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопросы по ViewModel

Сообщение ElisDN »

Ну раз это уведомления, то отправляйте по событию, как и хотели.
Ответить