MVC ?

Обсуждаем, как правильно строить приложения
Ответить
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

MVC ?

Сообщение Arnowt »

Народ, привет!
Вопрос у меня не совсем технический и даже не вопрос, а делема - философская.
Если правильно понимаю MVC, то следует в идеале такой путь: юзер - контроллер - модель - контроллер - вьюшка - контроллер - юзер
но на практике и даже в примерах мы встречаем прямые вызовы запросов из вьюшек типа:

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

$form->field($model, 'product_category')->dropdownList(
    ProductCategory::find()->select(['category_name', 'id'])->indexBy('id')->column(),
    ['prompt'=>'Select Category']
);
Как все-таки правильно? Протаскивать через контроллер массивы или немного нарушать MVC :slightly_smiling_face: (edited)
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: MVC ?

Сообщение ElisDN »

Логичнее использовать ProductForm extends Model и перенести всё в неё:

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

$form->field($model, 'category_id')->dropdownList($model->categoriesList(), ['prompt'=>'Category']);
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: MVC ?

Сообщение yiiliveext »

А еще лучше передать в контроллер из сервиса DTO, по которому будет сформирована форма и отдана в представления.
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: MVC ?

Сообщение Arnowt »

DTO это всего лишь обертка(структурирование), над данными. Это не концептуально, в том смысле что сейчас не столь важно как именно передавать параметры, хоть массивом.

PS:
Если это выпадающий список на 10 записей то это одна история, а если это карта страны со всеми гостиницами(описание, цена, урл, итд), то передавать в параметре, пусть даже в одном, такой объем данных может оказаться не оптимальным.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: MVC ?

Сообщение yiiliveext »

Arnowt писал(а): 2020.01.21, 23:39 Если это выпадающий список на 10 записей то это одна история, а если это карта страны со всеми гостиницами(описание, цена, урл, итд), то передавать в параметре, пусть даже в одном, такой объем данных может оказаться не оптимальным.
Это с чего вы так решили?
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: MVC ?

Сообщение Arnowt »

yiiliveext писал(а): 2020.01.22, 01:37
Arnowt писал(а): 2020.01.21, 23:39 Если это выпадающий список на 10 записей то это одна история, а если это карта страны со всеми гостиницами(описание, цена, урл, итд), то передавать в параметре, пусть даже в одном, такой объем данных может оказаться не оптимальным.
Это с чего вы так решили?
Это предположение основанное на том что данные будут копироваться в памяти тем больше раз чем больше промежуточных вызовов, если только не передавать ссылки.
И если я правильно вас понимаю, то контроллер будет промежуточным вызовом который будет протаскивать через себя весь объем данных полученных от модели.

Такой подход на мой взгляд концептуально вернее с точки зрения MVC, но вот насколько он оправдан практикой? - вот в чем вопрос.
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: MVC ?

Сообщение ElisDN »

Arnowt писал(а): 2020.01.22, 10:43 Это предположение основанное на том что данные будут копироваться в памяти тем больше раз чем больше промежуточных вызовов, если только не передавать ссылки.
Свежий PHP их несколько раз не копирует даже без ссылки, так как использует технологию Copy on Write.
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: MVC ?

Сообщение Arnowt »

ElisDN писал(а): 2020.01.22, 11:12
Arnowt писал(а): 2020.01.22, 10:43 Это предположение основанное на том что данные будут копироваться в памяти тем больше раз чем больше промежуточных вызовов, если только не передавать ссылки.
Свежий PHP их несколько раз не копирует даже без ссылки, так как использует технологию Copy on Write.
Тогда, ваш первый пост в ветке, стоит модифицировать до

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

$form->field($model, 'category_id')->dropdownList($categoriesList, ['prompt'=>'Category']);
а уже $categoriesList получать из контроллера ?
Вы сами так делаете? :roll: Если нет, то почему? 8-)
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: MVC ?

Сообщение ElisDN »

Arnowt писал(а): 2020.01.22, 12:16 Тогда, ваш первый пост в ветке, стоит модифицировать до ->dropdownList($categoriesList), а уже $categoriesList получать из контроллера ?
Это как вам больше нравится.
Arnowt писал(а): 2020.01.22, 12:16 Вы сами так делаете? :roll:
Не делаю, так как не использую сущности напрямую в формах.
Arnowt писал(а): 2020.01.22, 12:16 Если нет, то почему? 8-)
Если есть построитель формы ProductForm (как в Yii и Symfony), то удобно инкапсулировать все списки в него.

А если построителя нет, то тогда возиться с россыпью переменных $categoriesList поштучно (как в Laravel).
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: MVC ?

Сообщение Arnowt »

спасибо
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: MVC ?

Сообщение anton_z »

yiiliveext писал(а): 2020.01.22, 01:37
Arnowt писал(а): 2020.01.21, 23:39 Если это выпадающий список на 10 записей то это одна история, а если это карта страны со всеми гостиницами(описание, цена, урл, итд), то передавать в параметре, пусть даже в одном, такой объем данных может оказаться не оптимальным.
Это с чего вы так решили?
Накладные расходы на создание дополнительных DTO при большом объеме будут ощутимее, очевидно. И дело не только в используемой памяти, но и в процессорном времени.
yiiliveext писал(а): 2020.01.21, 22:04 А еще лучше передать в контроллер из сервиса DTO, по которому будет сформирована форма и отдана в представления.
Вот когда о таком заговаривают, предпочитаю не слушать.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: MVC ?

Сообщение yiiliveext »

anton_z писал(а): 2020.01.23, 07:28 Накладные расходы на создание дополнительных DTO при большом объеме будут ощутимее, очевидно. И дело не только в используемой памяти, но и в процессорном времени.
Во-первых, в 99% процентов проектов вы это "ощутимее" никогда не заметите.
Во-вторых, вы не слышали о таких вещах как REST API и SPA? Ведь там это стандартный процесс, бэкенд формирует DTO и отдает его по API на фронт.
Вот когда о таком заговаривают, предпочитаю не слушать.
Не слушайте. Если разрабатываете проекты уровня бложиков, то это еще и вредно, там это ненужный оверхед.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: MVC ?

Сообщение anton_z »

yiiliveext писал(а): 2020.01.23, 14:10
Не слушайте. Если разрабатываете проекты уровня бложиков, то это еще и вредно, там это ненужный оверхед.
Ой, пристыдили :lol: Нормальные я проекты разрабатываю. Работаю на результат, а не занимаюсь архитектурным самоудовлетворением и code bloat

А если по теме, то я за вариант Дмитрия. Пусть запрос на формирование списка делается в форме. И это никак не превратит даже самый навороченный проект в "уровень бложика" :D
ElisDN писал(а): 2020.01.21, 18:45 Логичнее использовать ProductForm extends Model и перенести всё в неё:

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

$form->field($model, 'category_id')->dropdownList($model->categoriesList(), ['prompt'=>'Category']);
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: MVC ?

Сообщение yiiliveext »

anton_z писал(а): 2020.01.24, 04:22 А если по теме, то я за вариант Дмитрия. Пусть запрос на формирование списка делается в форме. И это никак не превратит даже самый навороченный проект в "уровень бложика" :D
ElisDN писал(а): 2020.01.21, 18:45 Логичнее использовать ProductForm extends Model и перенести всё в неё:

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

$form->field($model, 'category_id')->dropdownList($model->categoriesList(), ['prompt'=>'Category']);
С точки зрения представления ничего не поменялось. Как дергалась база в представлении, так и дергается.
Хотя, так безусловно лучше, чем работать с кверибилдером напрямую.

Как вариант, можно вызывать categoriesList() при инициализации формы и кешировать в приватной переменной.
Ответить