Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Модель MVC, что передавать в класс View
Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013
Помог: 0 раз(а)
Не могу разобраться с моделью мвц, я так понимаю за отображение должен отвечать класс виев, поэтому когда в модели из базы данных получаю список новостей как их передать в виев?
в контроллере вы обращаетесь к объекту view (вью) и создаете в нем переменную myVar, значение которой берете из модели model, вызвав метод getSomeVar().
Затем вы вызвываете метод render() (или иное другое название, как сами напишете), включаете название php странички, в этой страничке вы и будете обращаться к полученной переменной myVar вот так :
Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012
Помог: 3 раз(а)
caballero пишет:
Вообще то он и должен обращатся если по уму. Ведь кто как не вью который рендерит страницу лучше знает какие ему надо данные
Сам же знаешь, что есть данные,работа с которыми до первого вывода информации в браузер(заголовки, куки). Зачем такое говоришь?
grafillo
Отправлено: 19 Марта, 2015 - 17:54:15
Посетитель
Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013
Помог: 0 раз(а)
вопрос в том что получается многомерный ассоциативный массив, если я допустим хочу вывести список новостей в каждой новости: категория текст картинка. Получается что переводить mysql_query в многомерный массив не имеет смысла, так как потом всё равно его придётся разобрать в классе вью, приходится чтоли передавать результат mysql_query?
кто как делает? и как вообще принято?
teddy
Отправлено: 19 Марта, 2015 - 18:19:22
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DelphinPRO пишет:
Зачем же так категорично? Почему вью не может сам обратиться к модели?
Потому что MVC подразумевает отделение мух от котлет.
caballero пишет:
Вообще то он и должен обращатся если по уму
Не нужно забывать, что работа с моделью подразумевает не только получение, но и изменение/добавление/удаление уже существующих данных, а эти задачи выходят за рамки view. К тому же, модель может не иметь данных для вью, а делать какие нибудь внутренние операции с данными, которые не подлежат представлению, что опять же не приемлемо для выполнения этих операций во вью. Так же есть ситуации, где во view работать с моделью уже будет поздно, например в том случае, как написали выше, если требуется отправить заголовки на основе извлеченных данных. А если действовать по обстоятельствам в отношении работы с моделью, это приведет к неоднозначности что отрицательно отразится на качестве кода.
Более того, очень часто приходится брать параметры из роутера, и на основе этих параметров извлекать данные из модели. Это означает, что во вью придется давать доступ в том числе и к роутеру, что не приемлемо, потому как вью не должен знать о роутере. Исключением может быть формирование ссылок по имени роута, и то обычно это делается через плагины вью, а не через прямое общение с роутером.
Можно ещё поговорить о том, почему не нужно работать с моделью во вью, но думаю этого достаточно.
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
teddy пишет:
Потому что MVC подразумевает отделение мух от котлет.
а я утверждал обратное?
модель генерит данные, вьюха их забирает и рендерит. (Добавление)
Давайте я вам примерчик приведу.
Например есть у нас страница. Она показывает имя пользователя
Мы пишем
в модели: getName() { bla bla }
в контроллере $this->view->set('name', $model->getName())
во вьюхе: echo $this->name
Потом подумали: "а ведь модель у нас продвинутая, она же еще и возраст возвращает. Давай его тоже на страницу выведем".
Что делаем? Редактируем шаблон, потом еще и контроллер. Хотя, казалось бы, при чем здесь контроллер. Мы же всего лишь данных на страницу добавили.
Это реально неудобно. Сам так писал.
Хотя это, конечно, спорный момент.
PS. Блин, в конце предложений вместо точки уже на автомате ставлю точку-с-запятой
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
Сам же знаешь, что есть данные,работа с которыми до первого вывода информации в браузер(заголовки, куки). Зачем такое говоришь?
И где тут противоречие?
Цитата:
Не нужно забывать, что работа с моделью подразумевает не только получение, но и изменение/добавление/удаление уже существующих данных, а эти задачи выходят за рамки view.
в теме идет речь от ОТОБРАЖЕНИИ данных
Цитата:
Так же есть ситуации, где во view работать с моделью уже будет поздно, например в том случае, как написали выше, если требуется отправить заголовки на основе извлеченных данных.
глупость выше я уже прокоментировал - что мешает view отправить щзаголовки а потом рендерить собственно страницу?
Цитата:
Можно ещё поговорить о том, почему не нужно работать с моделью во вью, но думаю этого достаточно.
не надо говорить - полстраницы бессмысленых рассуждений достаточно.
Цитата:
Хотя это, конечно, спорный момент.
Не спорный. Нужно просто отличать изменение данных модели в соответствии с командой, выполняемой контроллером, и отображением данных. Нет никаких причин чтобы контролер был перевалочным пунктом между моделью и view (Добавление)
Цитата:
кто как делает? и как вообще принято?
никак не принято - кто как хочет так и делает.
есть масса библиотек более высокого уровня для работы с БД - они уже возвращают ассоциативные массивы.
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DelphinPRO
Пример по правде говоря не очень и добавление одной строчки в контроллере не составит труда, особенно ради внятного кода. И не факт что данные по вью передаются именно по указанному примеру. Мне например удобно сделать что то типа $model->find(array('id' => 5))->fetchIn('Package\Entity\User') и во вью уже отдать этот entity, тогда не придется править контроллер а достаточно будет вызвать $user->getAge()
caballero пишет:
в теме идет речь от ОТОБРАЖЕНИИ данных
А я понял. И получится у тебя неоднозначная логика.
caballero пишет:
что мешает view отправить щзаголовки а потом рендерить собственно страницу?
Технически ничего не мешает, но это не логично. Вью(имеется ввиду не шаблон а API который формирует разметку) не должен отправлять заголовки, его дело заниматься формированием разметки а не устанавливать статус коды/отправлять заголовки и т.п, для этого должен быть Response, который и должен возвращать сформированную View API разметку(если это требуется) + заголовки.
Более того, раз уж перекидываешь отправку ответа на шею View, то смотри: тебе надо отправить клиенту json и ничего более, разве логично отправлять его через View? Здесь нет никакого представления, это всего лишь json.
Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013
Помог: 0 раз(а)
я понимаю что холивар это кулл. но ответьте на мои вопросы пожалуйста:
В каком классе надо подключаться к бд.
Как передавать mysql_query в класс вью, его надо разбирать в ассоциативнй массив или как и можно пример кода?
caballero
Отправлено: 20 Марта, 2015 - 23:05:53
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
я понимаю что холивар это кулл. но ответьте на мои вопросы пожалуйста:
на вопросы непонятно о чем ответят только непонятно как
Цитата:
В каком классе надо подключаться к бд.
Що значит в каком? Каком по счету на диске?
Цитата:
Как передавать mysql_query в класс вью, его надо разбирать в ассоциативнй массив или как и можно пример кода?
так же как передавать в любое другое место (Добавление)
Цитата:
А я понял. И получится у тебя неоднозначная логика.
в чем неоднозначная?
Цитата:
Технически ничего не мешает, но это не логично.
что именно не логично
Цитата:
Вью(имеется ввиду не шаблон а API который формирует разметку)
а где было сказано что имеется ввиду и при чем тут какое то API? А если не API?
Цитата:
его дело заниматься формированием разметки а не устанавливать статус коды/отправлять заголовки и т.п,
его дело представить данные с сервера. Статус коды тоже данные
Цитата:
для этого должен быть Response, который и должен возвращать сформированную View API разметку(если это требуется) + заголовки.
где сказано что он должен быть? На курсах програмирования? мы обсуждаем принцип а не единственное решение которое ты видел в жизни
Цитата:
Более того, раз уж перекидываешь отправку ответа на шею View, то смотри: тебе надо отправить клиенту json и ничего более, разве логично отправлять его через View? Здесь нет никакого представления, это всего лишь json.
все что отвечает за представление данных клиенту и есть ПРЕДСТАВЛЕНИЕ. потому оно так и называется.
нигде не сказано что представление это обязательно html код. А есkи вместо json аяксом ушел HTML - это представление или нет?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.