Вопросы по ViewModel
Вопросы по ViewModel
Есть доменный объект и часть его состояния нужно отобразить в пользовательском интерфейсе.
Подскажите, по следующим вопросам:
1. ViewModel можно создавать в контроллере ?
2. ViewModel может зависеть от фреймворка ?
3. Application service может возвращать в контроллер доменный объект ?
Подскажите, по следующим вопросам:
1. ViewModel можно создавать в контроллере ?
2. ViewModel может зависеть от фреймворка ?
3. Application service может возвращать в контроллер доменный объект ?
Re: Вопросы по ViewModel
viewmodel - экшнозависимая сущность. в экшне она и должна создаваться (через трансформер какой-нибудь)
ну это же просто dto возможно со вспомогательными методами
может.
Re: Вопросы по ViewModel
Помогите разобраться. В книге DDD in PHP советуют: не связывать напрямую домен и ui. Не давать ui доступа к бизнес методам. Все через application services, request/response и dto.
Последний раз редактировалось anton_z 2017.03.23, 02:49, всего редактировалось 2 раза.
Re: Вопросы по ViewModel
вернуть сущность и передать в трансформер для формирования контекстозависимого viewmodel. давать доступ ui не надо.
сервис контекстонезависим, поэтому не знает о ui и формате viewmodel.
Re: Вопросы по ViewModel
А если dto из сервиса возвращать, это сделает его контекстозависимым? Что лучше возвращать из сервиса - сущность или dto?
На основе dto потом viewmodel сделать.
Re: Вопросы по ViewModel
А если можно сущность возвращать, то почему тогда нельзя сущность создавать в контроллере и передавать ее в сервис?
Re: Вопросы по ViewModel
потому что между реквестом и сущностью может быть несколько действий, например валидация входных данных, их обработка/подготовка, контекстозависимое создание сущности. Где все это делать? в экшне?
Re: Вопросы по ViewModel
ну а какой ты dto вернешь? данные из сущности Post или Post+Comments+Author? сервис не знает какие данные ждет ui. А вернув сущность, мы получим доступ ко всем необходимым данным (если учесть что у нас уже работает lazy load итд).
dto нужно передавать в сервис, возвращать сущность, передавать в трансформер.
вообще вот такую схему я вижу пригодной:
Код: Выделить всё
$dto = $this->postDtoFactory->fromRequest($request);
$this->postService->savePost($dto);
$post = $this->postService->getPost($dto->id());
$viewModel = $this->viewModelFactory->create($post);
Re: Вопросы по ViewModel
А я думал, что application service это типа use-case. А use case определяет какие данные поступают на вход, какие на выход.
Re: Вопросы по ViewModel
Например, нам нужно посчитать стоимость какой-нибудь платной услуги и показать пользователю на странице. Стоимость считается на основе данных в БД, но сама в БД не сохраняется. Я решаю такую задачу с помощью запроса к ApplicationService, в ответ мне приходит dto со стоимостью и сопутствующими данными.
Re: Вопросы по ViewModel
ну и ок? в чем проблема? в том, что ты не можешь уложить в один паттерн все случаи жизни?
Re: Вопросы по ViewModel
А если у меня внизу (в application service), не domain model a голый SQL тогда кроме возврата DTO альтернатив нет?
В старых приложениях, которые приходится поддерживать, понамешан SQL и html. Рефакторю заворачиванием в application services, отделяя ui от работы с данными.
В старых приложениях, которые приходится поддерживать, понамешан SQL и html. Рефакторю заворачиванием в application services, отделяя ui от работы с данными.
Re: Вопросы по ViewModel
возвращаешь то, что нужно, исходя из контекста.anton_z писал(а): ↑2017.03.23, 04:16 А если у меня внизу (в application service), не domain model a голый SQL тогда кроме возврата DTO альтернатив нет?
В старых приложениях, которые приходится поддерживать, понамешан SQL и html. Рефакторю заворачиванием в application services, отделяя ui от работы с данными.
Re: Вопросы по ViewModel
anton_z, я тоже считаю, что сервис должен возвращать dto и по книгам Вернона так и есть. Но я использую websocket и нужно вернуть не только ответ на запрос, но и рассылать данные по сокетам. Например, такой кейс
Я думаю, что теперь сервисы должны не только возвращать dto, но еще и эмитить (emit) события уровня приложения. Но это не точно.
Хочу сразу пояснить, что делаю не на Yii и даже не на PHP.
То есть условно на запрос пользователя ему нужно вернуть ответ {login: 'name', money: 100}, а всем остальным уведомление {login: 'name'}. Но я не могу из сервиса вернуть два разных dto. Теперь я вообще не знаю, что я должен возвращать из сервиса.Пользователь делает запрос, чтобы войти на сайт. Пользователь получает ответ с данными о своем профиле. Остальные получают уведомление о входе пользователя с усеченными данными о его профиле.
Я думаю, что теперь сервисы должны не только возвращать dto, но еще и эмитить (emit) события уровня приложения. Но это не точно.
Хочу сразу пояснить, что делаю не на Yii и даже не на PHP.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Вопросы по ViewModel
Не может. Контроллер это UI, ничего о домене он знать не должен.
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Вопросы по ViewModel
Пусть возвращают DTO содержащий данные на "все кейсы", ничего страшного что где-то в контроллере будет ДТО с данными которые он не юзает, гораздо хуже если контроллер будет иметь доступ к сущности домена и сможет менять его состояния.
Жду Yii 3!
Re: Вопросы по ViewModel
Ну вообще у Эванса в книге такая диаграмма.
slavcodev, ну допустим. Но еще нужно знать, каким конкретно пользователям отправлять. Эти данные тоже в dto хранить?
slavcodev, ну допустим. Но еще нужно знать, каким конкретно пользователям отправлять. Эти данные тоже в dto хранить?
Re: Вопросы по ViewModel
Ну раз это уведомления, то отправляйте по событию, как и хотели.