Страница 1 из 2

Вопросы по ViewModel

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

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

1. ViewModel можно создавать в контроллере ?
2. ViewModel может зависеть от фреймворка ?
3. Application service может возвращать в контроллер доменный объект ?

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

Добавлено: 2017.03.23, 00:14
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 может возвращать в контроллер доменный объект ?
может.

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

Добавлено: 2017.03.23, 02:18
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.

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

Добавлено: 2017.03.23, 02:43
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.

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

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

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

Добавлено: 2017.03.23, 02:49
anton_z
А если можно сущность возвращать, то почему тогда нельзя сущность создавать в контроллере и передавать ее в сервис?

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

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

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

Добавлено: 2017.03.23, 03:03
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);

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

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

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

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

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

Добавлено: 2017.03.23, 03:45
zelenin
ну и ок? в чем проблема? в том, что ты не можешь уложить в один паттерн все случаи жизни?

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

Добавлено: 2017.03.23, 04:08
anton_z
zelenin писал(а): 2017.03.23, 03:45 ну и ок? в чем проблема? в том, что ты не можешь уложить в один паттерн все случаи жизни?
Видимо да) Пытаюсь определить границы применимости dto.

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

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

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

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

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

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

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

Хочу сразу пояснить, что делаю не на Yii и даже не на PHP.

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

Добавлено: 2017.04.19, 23:25
slavcodev
sda писал(а): 2017.03.22, 15:36 3. Application service может возвращать в контроллер доменный объект ?
Не может. Контроллер это UI, ничего о домене он знать не должен.

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

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

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

Добавлено: 2017.04.19, 23:44
sda
Ну вообще у Эванса в книге такая диаграмма.
Изображение

slavcodev, ну допустим. Но еще нужно знать, каким конкретно пользователям отправлять. Эти данные тоже в dto хранить?

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

Добавлено: 2017.04.19, 23:48
slavcodev
Да храни в DTO все что AL хочет рассказать UI.

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

Добавлено: 2017.04.19, 23:51
ElisDN
Ну раз это уведомления, то отправляйте по событию, как и хотели.