Передача данных в layout

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
omp93
Сообщения: 99
Зарегистрирован: 2016.02.15, 12:24

Передача данных в layout

Сообщение omp93 »

Понимаю, что вопрос уже неоднократно поднимался, но однозначного решения для себя не нашёл, поэтому вопрос: мне нужно передавать данные из БД в layout/main, данные - это категории. Пока напрямую дергаю модель в layout, но это вроде как не совсем правильно. Как можно правильно организовать такое? В каждом контроллере тоже вроде как не очень удобно одно и то же делать..
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Передача данных в layout

Сообщение andrei.obuhovski »

сделать виджет
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Передача данных в layout

Сообщение vitalik1183 »

но это вроде как не совсем правильно
это кардинально не правильно.
Yii2!
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

Re: Передача данных в layout

Сообщение kwasti »

почему не правильно?

в модели MVC - основная идея:
Controller - обрабатывает действия
Model - обрабатывает полученные данные и подготавливает для View
View - отображает
главное не нарушать именно этот порядок и все.

Но на мой взгляд ничто не противоречит данной идее, если во View и обращусь к методу любой из моделей, которую передал контроллер во view. На момент вывода View не обязательно данные должны быть подготовлены, они могут подготовиться моделью во время выполнения View.

для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
никакого противоречия модели MVC в данном случае не произойдет т.к.:
Layout будет заниматься только отображением информации, а подготавливать данные как и положено будет модель.
omp93
Сообщения: 99
Зарегистрирован: 2016.02.15, 12:24

Re: Передача данных в layout

Сообщение omp93 »

Вот и вся суть MVC, сколько людей, столько и мнений, непонятно теперь, кого слушать...)
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

Своеобразное у вас представление о MVC :lol: Если контроллер еще спорный объект, то view вообще не должно знать, из чего состоит модель.
ПС: Другой вопрос, в том, так ли критичны вызовы типа Model::findOne($key). В виджете будет аналогично. А с учетом того, что виджеты - это компромисс, то все еще сомнительнее.
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

Re: Передача данных в layout

Сообщение kwasti »

как раз все наоборот!
Модель не должна ничего знать о контроллере и View

а вот они о модели могут знать довольно много.

выдержка из вики
Концепция MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента:
Модель (англ. Model). Модель предоставляет знания: данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно визуализировать.
Представление, вид (англ. View). Отвечает за отображение информации (визуализацию). Часто в качестве представления выступает форма (окно) с графическими элементами.
Контроллер (англ. Controller). Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.

Важно отметить, что как представление, так и контроллер зависят от модели. Однако модель не зависит ни от представления, ни от контроллера. Тем самым достигается назначение такого разделения: оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
что я и говорил выше...
Модель - основа
Все остальное подстраивается.
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Передача данных в layout

Сообщение sm-vasya »

Nerf писал(а):Если контроллер еще спорный объект, то view вообще не должно знать, из чего состоит модель.
давайте рассуждать логически

во вью (если передаете ей модель) Вы как минимум используете обращение к атрибутам модели, типа
$model->id
$model->title

и тд

так вот уже во вью Вы закладываете знания о том что у модели есть такие атрибуты ..... => вью знает о моделе ровно столько сколько ему (вью) нужно знать. и не вижу ничего плохого в том что вью может вызывать методы модели.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

sm-vasya писал(а): так вот уже во вью Вы закладываете знания о том что у модели есть такие атрибуты ..... => вью знает о моделе ровно столько сколько ему (вью) нужно знать. и не вижу ничего плохого в том что вью может вызывать методы модели.
Верно. Вью зависит от модели. Но некорректно запрашивать саму модель из вью, делать запросы в базу, о которой вью знать не должно.
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Передача данных в layout

Сообщение sm-vasya »

Nerf писал(а): Но некорректно запрашивать саму модель из вью, делать запросы в базу, о которой вью знать не должно.
приведите пример, моя твоя не понимать.


вью не должно принимать решений об изменении данных в базе, т.е. не должно делать INSERT, UPDATE, DELETE
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

Ну, смотрите.
1) Для получения модели пользователь обращается к контролеру, который обрабатывает запрос, возвращает модель. Вы же хотите сказать, что в порядке вещей дернуть модель из вью. Так?
2) Я не считаю, что вью должно знать как\откуда берутся данные модели и ее бизнес-логику.
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Передача данных в layout

Сообщение sm-vasya »

Nerf писал(а):Ну, смотрите.
1) Для получения модели пользователь обращается к контролеру, который обрабатывает запрос, возвращает модель. Вы же хотите сказать, что в порядке вещей дернуть модель из вью. Так?
2) Я не считаю, что вью должно знать как\откуда берутся данные модели и ее бизнес-логику.
1. моя твоя не понимать
что такое "дернуть" ?

2. в принципе тоже моя твоя не понимать...... т.е. вы во вью никогда не пишете <?= $model->title ?> или <?php $this->title = $model->title; ?> ?

я говорю про то что вью не должно делать чтото типа <?php $model->title = 'dsfasfasf'; $model->save(); ?>
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

Я, вроде, по-русски пишу.
1) получить\запросить
2) Пишу. Но, например, для получения связанных данных вы используете же $model->relatedModels, зная, что получите список моделей RelatedModel, а не делаете "SELECT * from rtable where model_id = $model->id".
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Передача данных в layout

Сообщение sm-vasya »

Nerf писал(а):Я, вроде, по-русски пишу.
1) получить\запросить
2) Пишу. Но, например, для получения связанных данных вы используете же $model->relatedModels, зная, что получите список моделей RelatedModel, а не делаете "SELECT * from rtable where model_id = $model->id".
1. не надо путать субязык (жаргон) и язык. в русском языке слово дернуть означает "резко переместить", но ни как не "получить/запросить". а что касается запросить/получить - тоже не совсем понятно - откуда запросить/получить ? и процитируйте пожалуйста - где я такое сказал. потому что в своем первом посте я сказал следующее:
во вью (если передаете ей модель)
что на мой взгляд отвечает на вопрос - откуда во вью берутся модели

2. в том виде который описали Вы (а именно - простом) - и я не делаю "SELECT * .... " и не рекомендую, с чего вы взяли обратное ?
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

Так! Вы читали вопрос автора темы? Прочитайте от начала. Может быть поймете контекст.
И даже в случае передачи модели во вью, вью не знает о внутренней структуре данных и бизнес-логике. Если вью знает все, то зачем вообще модель?
И все написанное в основном относится к этому:
для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
Т.е. во вью сконфигурировать модель по заданным данным, что делается обычно через контроллер. Тогда зачем контроллер?
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Передача данных в layout

Сообщение sm-vasya »

Nerf писал(а):Так! Вы читали вопрос автора темы?
читал
Nerf писал(а):Прочитайте от начала. Может быть поймете контекст.
может
Nerf писал(а):И даже в случае передачи модели во вью, вью не знает о внутренней структуре данных и бизнес-логике. Если вью знает все, то зачем вообще модель?
кто сказал что все ?

Nerf писал(а): И все написанное в основном относится к этому:
для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
Т.е. во вью сконфигурировать модель по заданным данным, что делается обычно через контроллер. Тогда зачем контроллер?
не вижу логики в Ваших высказываниях. почему нельзя во вью передать модель/класс из контроллера ? не вижу в приведенной Вами цитате ни слова о том откуда эта модель во вью взялась/сконфигурировалась, а следовательно Ваше утверждение о том что "Т.е. во вью сконфигурировать модель ...." - является лишь частным случаем приведенной цитаты => по нему нельзя делать общие выводы.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

Отчаливаю! Если вы не можете проследить логическую цепочку в теме, то дальнейшая дискуссия бессмысленна. Больше на троллинг похоже...
sm-vasya
Сообщения: 191
Зарегистрирован: 2015.03.04, 01:12

Re: Передача данных в layout

Сообщение sm-vasya »

Nerf писал(а):Отчаливаю!
Ваше право
Nerf писал(а):Если вы не можете проследить логическую цепочку в теме, то дальнейшая дискуссия бессмысленна.
виноват, не увидел в Ваших постах логики и ответов на мои вопросы, а так же цитирование моих слов на основании которых вы делаете свои выводы. если сможете ответить на мои вопросы - то постараюсь предпринять ряд действий чтоб разглядеть логику.
Nerf писал(а):Больше на троллинг похоже...
вовсе нет, всего лишь оперирование информацией. а вот не отвечать на вопросы и делать выводы на основании не понятно чего - это как раз признак троллинга.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Передача данных в layout

Сообщение girmate »

Интересная дискуссия.
Я вот во вью помимо $products передаю еще и объект с настройками (типа во что обворачивать цену, в какие-HTML коды. Шаблон задается в настройках.) Поэтому помимо массива в товарами передаю и объект Settings (который создается в контроллере, разумеется), чтобы сразу после foreach ($products as $product) выполнить как бы иницализацию

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

 $product->setParam($settings) 
И тогда конкретный объект $product уже загружен настройками и показывает все как я хочу. Может я и не так делаю, но мне понравилось. Сам вид ничего не запрашивает. Контроллер подготавливает все, а в модель добавил публичный метод setParam().
Осторожно! Вы общаетесь с новичком ;)
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Передача данных в layout

Сообщение Nerf »

Можете поступить проще:
в контроллере:

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

return $this->render('view', ['app' => Yii::$app]);
Во вью:

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

$products = $app->db->createCommand('SELECT * FROM products')->queryAll();
foreach($products as $product) {
   // ...
}
Тонкий контроллер и модельки всякие делать не надо :lol:
Ответить