Передача данных в layout
Передача данных в layout
Понимаю, что вопрос уже неоднократно поднимался, но однозначного решения для себя не нашёл, поэтому вопрос: мне нужно передавать данные из БД в layout/main, данные - это категории. Пока напрямую дергаю модель в layout, но это вроде как не совсем правильно. Как можно правильно организовать такое? В каждом контроллере тоже вроде как не очень удобно одно и то же делать..
-
- Сообщения: 610
- Зарегистрирован: 2015.07.16, 10:50
Re: Передача данных в layout
сделать виджет
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Передача данных в layout
это кардинально не правильно.но это вроде как не совсем правильно
Yii2!
Re: Передача данных в layout
почему не правильно?
в модели MVC - основная идея:
Controller - обрабатывает действия
Model - обрабатывает полученные данные и подготавливает для View
View - отображает
главное не нарушать именно этот порядок и все.
Но на мой взгляд ничто не противоречит данной идее, если во View и обращусь к методу любой из моделей, которую передал контроллер во view. На момент вывода View не обязательно данные должны быть подготовлены, они могут подготовиться моделью во время выполнения View.
для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
никакого противоречия модели MVC в данном случае не произойдет т.к.:
Layout будет заниматься только отображением информации, а подготавливать данные как и положено будет модель.
в модели MVC - основная идея:
Controller - обрабатывает действия
Model - обрабатывает полученные данные и подготавливает для View
View - отображает
главное не нарушать именно этот порядок и все.
Но на мой взгляд ничто не противоречит данной идее, если во View и обращусь к методу любой из моделей, которую передал контроллер во view. На момент вывода View не обязательно данные должны быть подготовлены, они могут подготовиться моделью во время выполнения View.
для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
никакого противоречия модели MVC в данном случае не произойдет т.к.:
Layout будет заниматься только отображением информации, а подготавливать данные как и положено будет модель.
Re: Передача данных в layout
Вот и вся суть MVC, сколько людей, столько и мнений, непонятно теперь, кого слушать...)
Re: Передача данных в layout
Своеобразное у вас представление о MVC Если контроллер еще спорный объект, то view вообще не должно знать, из чего состоит модель.
ПС: Другой вопрос, в том, так ли критичны вызовы типа Model::findOne($key). В виджете будет аналогично. А с учетом того, что виджеты - это компромисс, то все еще сомнительнее.
ПС: Другой вопрос, в том, так ли критичны вызовы типа Model::findOne($key). В виджете будет аналогично. А с учетом того, что виджеты - это компромисс, то все еще сомнительнее.
Re: Передача данных в layout
как раз все наоборот!
Модель не должна ничего знать о контроллере и View
а вот они о модели могут знать довольно много.
выдержка из вики
Модель - основа
Все остальное подстраивается.
Модель не должна ничего знать о контроллере и View
а вот они о модели могут знать довольно много.
выдержка из вики
что я и говорил выше...Концепция MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента:
Модель (англ. Model). Модель предоставляет знания: данные и методы работы с этими данными, реагирует на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно визуализировать.
Представление, вид (англ. View). Отвечает за отображение информации (визуализацию). Часто в качестве представления выступает форма (окно) с графическими элементами.
Контроллер (англ. Controller). Обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
Важно отметить, что как представление, так и контроллер зависят от модели. Однако модель не зависит ни от представления, ни от контроллера. Тем самым достигается назначение такого разделения: оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
Модель - основа
Все остальное подстраивается.
Re: Передача данных в layout
давайте рассуждать логическиNerf писал(а):Если контроллер еще спорный объект, то view вообще не должно знать, из чего состоит модель.
во вью (если передаете ей модель) Вы как минимум используете обращение к атрибутам модели, типа
$model->id
$model->title
и тд
так вот уже во вью Вы закладываете знания о том что у модели есть такие атрибуты ..... => вью знает о моделе ровно столько сколько ему (вью) нужно знать. и не вижу ничего плохого в том что вью может вызывать методы модели.
Re: Передача данных в layout
Верно. Вью зависит от модели. Но некорректно запрашивать саму модель из вью, делать запросы в базу, о которой вью знать не должно.sm-vasya писал(а): так вот уже во вью Вы закладываете знания о том что у модели есть такие атрибуты ..... => вью знает о моделе ровно столько сколько ему (вью) нужно знать. и не вижу ничего плохого в том что вью может вызывать методы модели.
Re: Передача данных в layout
приведите пример, моя твоя не понимать.Nerf писал(а): Но некорректно запрашивать саму модель из вью, делать запросы в базу, о которой вью знать не должно.
вью не должно принимать решений об изменении данных в базе, т.е. не должно делать INSERT, UPDATE, DELETE
Re: Передача данных в layout
Ну, смотрите.
1) Для получения модели пользователь обращается к контролеру, который обрабатывает запрос, возвращает модель. Вы же хотите сказать, что в порядке вещей дернуть модель из вью. Так?
2) Я не считаю, что вью должно знать как\откуда берутся данные модели и ее бизнес-логику.
1) Для получения модели пользователь обращается к контролеру, который обрабатывает запрос, возвращает модель. Вы же хотите сказать, что в порядке вещей дернуть модель из вью. Так?
2) Я не считаю, что вью должно знать как\откуда берутся данные модели и ее бизнес-логику.
Re: Передача данных в layout
1. моя твоя не пониматьNerf писал(а):Ну, смотрите.
1) Для получения модели пользователь обращается к контролеру, который обрабатывает запрос, возвращает модель. Вы же хотите сказать, что в порядке вещей дернуть модель из вью. Так?
2) Я не считаю, что вью должно знать как\откуда берутся данные модели и ее бизнес-логику.
что такое "дернуть" ?
2. в принципе тоже моя твоя не понимать...... т.е. вы во вью никогда не пишете <?= $model->title ?> или <?php $this->title = $model->title; ?> ?
я говорю про то что вью не должно делать чтото типа <?php $model->title = 'dsfasfasf'; $model->save(); ?>
Re: Передача данных в layout
Я, вроде, по-русски пишу.
1) получить\запросить
2) Пишу. Но, например, для получения связанных данных вы используете же $model->relatedModels, зная, что получите список моделей RelatedModel, а не делаете "SELECT * from rtable where model_id = $model->id".
1) получить\запросить
2) Пишу. Но, например, для получения связанных данных вы используете же $model->relatedModels, зная, что получите список моделей RelatedModel, а не делаете "SELECT * from rtable where model_id = $model->id".
Re: Передача данных в layout
1. не надо путать субязык (жаргон) и язык. в русском языке слово дернуть означает "резко переместить", но ни как не "получить/запросить". а что касается запросить/получить - тоже не совсем понятно - откуда запросить/получить ? и процитируйте пожалуйста - где я такое сказал. потому что в своем первом посте я сказал следующее:Nerf писал(а):Я, вроде, по-русски пишу.
1) получить\запросить
2) Пишу. Но, например, для получения связанных данных вы используете же $model->relatedModels, зная, что получите список моделей RelatedModel, а не делаете "SELECT * from rtable where model_id = $model->id".
что на мой взгляд отвечает на вопрос - откуда во вью берутся моделиво вью (если передаете ей модель)
2. в том виде который описали Вы (а именно - простом) - и я не делаю "SELECT * .... " и не рекомендую, с чего вы взяли обратное ?
Re: Передача данных в layout
Так! Вы читали вопрос автора темы? Прочитайте от начала. Может быть поймете контекст.
И даже в случае передачи модели во вью, вью не знает о внутренней структуре данных и бизнес-логике. Если вью знает все, то зачем вообще модель?
И все написанное в основном относится к этому:
И даже в случае передачи модели во вью, вью не знает о внутренней структуре данных и бизнес-логике. Если вью знает все, то зачем вообще модель?
И все написанное в основном относится к этому:
Т.е. во вью сконфигурировать модель по заданным данным, что делается обычно через контроллер. Тогда зачем контроллер?для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
Re: Передача данных в layout
читалNerf писал(а):Так! Вы читали вопрос автора темы?
можетNerf писал(а):Прочитайте от начала. Может быть поймете контекст.
кто сказал что все ?Nerf писал(а):И даже в случае передачи модели во вью, вью не знает о внутренней структуре данных и бизнес-логике. Если вью знает все, то зачем вообще модель?
не вижу логики в Ваших высказываниях. почему нельзя во вью передать модель/класс из контроллера ? не вижу в приведенной Вами цитате ни слова о том откуда эта модель во вью взялась/сконфигурировалась, а следовательно Ваше утверждение о том что "Т.е. во вью сконфигурировать модель ...." - является лишь частным случаем приведенной цитаты => по нему нельзя делать общие выводы.Nerf писал(а): И все написанное в основном относится к этому:Т.е. во вью сконфигурировать модель по заданным данным, что делается обычно через контроллер. Тогда зачем контроллер?для Layout самое правильное в модели создать static метод, который будет подготавливать нужные данные.
Re: Передача данных в layout
Отчаливаю! Если вы не можете проследить логическую цепочку в теме, то дальнейшая дискуссия бессмысленна. Больше на троллинг похоже...
Re: Передача данных в layout
Ваше правоNerf писал(а):Отчаливаю!
виноват, не увидел в Ваших постах логики и ответов на мои вопросы, а так же цитирование моих слов на основании которых вы делаете свои выводы. если сможете ответить на мои вопросы - то постараюсь предпринять ряд действий чтоб разглядеть логику.Nerf писал(а):Если вы не можете проследить логическую цепочку в теме, то дальнейшая дискуссия бессмысленна.
вовсе нет, всего лишь оперирование информацией. а вот не отвечать на вопросы и делать выводы на основании не понятно чего - это как раз признак троллинга.Nerf писал(а):Больше на троллинг похоже...
Re: Передача данных в layout
Интересная дискуссия.
Я вот во вью помимо $products передаю еще и объект с настройками (типа во что обворачивать цену, в какие-HTML коды. Шаблон задается в настройках.) Поэтому помимо массива в товарами передаю и объект Settings (который создается в контроллере, разумеется), чтобы сразу после foreach ($products as $product) выполнить как бы иницализацию И тогда конкретный объект $product уже загружен настройками и показывает все как я хочу. Может я и не так делаю, но мне понравилось. Сам вид ничего не запрашивает. Контроллер подготавливает все, а в модель добавил публичный метод setParam().
Я вот во вью помимо $products передаю еще и объект с настройками (типа во что обворачивать цену, в какие-HTML коды. Шаблон задается в настройках.) Поэтому помимо массива в товарами передаю и объект Settings (который создается в контроллере, разумеется), чтобы сразу после foreach ($products as $product) выполнить как бы иницализацию
Код: Выделить всё
$product->setParam($settings)
Осторожно! Вы общаетесь с новичком
Re: Передача данных в layout
Можете поступить проще:
в контроллере:
Во вью:
Тонкий контроллер и модельки всякие делать не надо
в контроллере:
Код: Выделить всё
return $this->render('view', ['app' => Yii::$app]);
Код: Выделить всё
$products = $app->db->createCommand('SELECT * FROM products')->queryAll();
foreach($products as $product) {
// ...
}