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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
grafillo
Отправлено: 18 Марта, 2015 - 15:30:19
Post Id


Посетитель


Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




Не могу разобраться с моделью мвц, я так понимаю за отображение должен отвечать класс виев, поэтому когда в модели из базы данных получаю список новостей как их передать в виев?

раньше я делал так:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function getName($topic){
  3.        
  4.                
  5.         $link = mysql_connect($server,$this->username,$this->password);
  6.         $dbselected = mysql_select_db ($this->dbname);
  7.         //return array($topic);
  8.         $view_array = array();
  9.        
  10.         $req_news = mysql_query("SELECT * from tb_news WHERE category='$topic'");
  11.         while($myrow = mysql_fetch_array($req_news))
  12.         $view_arr .= '<td>Категория:'. $myrow['category'].'<br><h1>'.$myrow['zagolovok'].
  13. '<h1><br>'.$myrow['text'].'</td>';
  14.        
  15.        
  16.         return $view_arr;
  17.         }
  18.  
  19.  

но в мвц так делать нельзя, так как html разметку можно писать только в классе виев, как это решается ?
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Марта, 2015 - 16:13:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




grafillo пишет:
виев


Вот первый: http://www[dot]kinopoisk[dot]ru/film/45771/
Вот второй: http://www[dot]kinopoisk[dot]ru/film/229069/

Правильно: "Вью"

И вообще почему на каждый чих новый коннект к БД?
 
 Top
grafillo
Отправлено: 18 Марта, 2015 - 18:06:09
Post Id


Посетитель


Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




DeepVarvar пишет:
И вообще почему на каждый чих новый коннект к БД?


ну так я и спрашиваю как правильно делать?
 
 Top
esterio
Отправлено: 18 Марта, 2015 - 18:43:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Вот пример, причем работоспособность не проверял.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. define('DS', DIRECTORY_SEPARATOR);
  3. define('ROOT', __DIR__.DS);
  4. define('DB_DSN',  'mysql:host=localhost;dbname=test;charset=utf8');
  5. define('DB_USER', 'root');
  6. define('DB_PASS', '');
  7.  
  8. class DB
  9. {
  10.         protected static $_instance = null;
  11.  
  12.         protected $_pdo = null;
  13.  
  14.         public static function getInstance()
  15.         {
  16.                 if(self::$_instance === null)
  17.                 {
  18.                         self::$_instance = new self();
  19.                 }
  20.  
  21.                 return self::$_instance;
  22.         }
  23.  
  24.         protected function __construct()
  25.         {
  26.                 $this->_pdo = new PDO(DB_DSN, DB_USER, DB_PASS);
  27.         }
  28.  
  29.         protected function __clone() {}
  30.  
  31.         public function getPDO()
  32.         {
  33.                 return $this->_pdo;
  34.         }
  35. }
  36.  
  37. class View
  38. {
  39.         public static function render($view, $data)
  40.         {
  41.                 extract($data);
  42.  
  43.                 ob_start();
  44.                 include($view);
  45.                 return ob_get_clean();
  46.         }
  47. }
  48.  
  49. class Router
  50. {
  51.         public static function run($uri)
  52.         {
  53.                 $route = explode('/', $uri);
  54.                 $controllerName = $route[0].'Controller';
  55.                 $actionName = $route[0].'Controller';
  56.  
  57.                 $controller = new $controllerName();
  58.                 $viewData = $controller->{$actionName}();
  59.  
  60.                 $viewFile = ROOT.'views'.DS.$viewData[0].'php';
  61.  
  62.                 echo View::render($viewFile, $viewData[1]);
  63.         }
  64. }
  65.  
  66. class Model
  67. {
  68.  
  69. }
  70.  
  71. class Films extends Model
  72. {
  73.         public function getList()
  74.         {
  75.                 $pdo = DB::getInstance()->getPDO();
  76.                 $stmt = $pdo->query('SELECT id, name FROM films');
  77.                 $result = array();
  78.                 while ($row = $stmt->fetch())
  79.                 {
  80.                     $result[(int)$row['id']] = $row['name'];
  81.                 }
  82.  
  83.                 return $result;
  84.         }
  85. }
  86.  
  87. class Controller
  88. {
  89.         public function indexAction() {}
  90. }
  91.  
  92. class FilmsController extends Controller
  93. {
  94.         public function indexAction()
  95.         {
  96.                 $model = new Films();
  97.                 $films = $model->getList();
  98.  
  99.                 return array('films', array(
  100.                         'fims' => $films
  101.                 ));
  102.         }
  103. }
  104.  
  105. Router::run('films/index');
 
 Top
ПТО
Отправлено: 19 Марта, 2015 - 08:19:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




Данные из модели во вью передает контроллер.

вот так:
PHP:
скопировать код в буфер обмена
  1. class Controller(){
  2.    function myFunc(){
  3.       $this->view->myVar = $this->model->getSomeVar();
  4.       $this->view->render("somePage.php");
  5.    }
  6. }



в контроллере вы обращаетесь к объекту view (вью) и создаете в нем переменную myVar, значение которой берете из модели model, вызвав метод getSomeVar().
Затем вы вызвываете метод render() (или иное другое название, как сами напишете), включаете название php странички, в этой страничке вы и будете обращаться к полученной переменной myVar вот так :

т.к. обращение идет из объекта view (вью)
 
 Top
DelphinPRO
Отправлено: 19 Марта, 2015 - 10:17:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ПТО пишет:
Данные из модели во вью передает контроллер.

Зачем же так категорично? Почему вью не может сам обратиться к модели?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 19 Марта, 2015 - 13:08:40
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Зачем же так категорично? Почему вью не может сам обратиться к модели?


Вообще то он и должен обращатся если по уму. Ведь кто как не вью который рендерит страницу лучше знает какие ему надо данные


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
ПТО
Отправлено: 19 Марта, 2015 - 15:07:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




caballero пишет:
Вообще то он и должен обращатся если по уму. Ведь кто как не вью который рендерит страницу лучше знает какие ему надо данные

Сам же знаешь, что есть данные,работа с которыми до первого вывода информации в браузер(заголовки, куки). Зачем такое говоришь?
 
 Top
grafillo
Отправлено: 19 Марта, 2015 - 17:54:15
Post Id


Посетитель


Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




вопрос в том что получается многомерный ассоциативный массив, если я допустим хочу вывести список новостей в каждой новости: категория текст картинка. Получается что переводить mysql_query в многомерный массив не имеет смысла, так как потом всё равно его придётся разобрать в классе вью, приходится чтоли передавать результат mysql_query?
кто как делает? и как вообще принято?
 
 Top
teddy
Отправлено: 19 Марта, 2015 - 18:19:22
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DelphinPRO пишет:
Зачем же так категорично? Почему вью не может сам обратиться к модели?

Потому что MVC подразумевает отделение мух от котлет.

caballero пишет:
Вообще то он и должен обращатся если по уму

Не нужно забывать, что работа с моделью подразумевает не только получение, но и изменение/добавление/удаление уже существующих данных, а эти задачи выходят за рамки view. К тому же, модель может не иметь данных для вью, а делать какие нибудь внутренние операции с данными, которые не подлежат представлению, что опять же не приемлемо для выполнения этих операций во вью. Так же есть ситуации, где во view работать с моделью уже будет поздно, например в том случае, как написали выше, если требуется отправить заголовки на основе извлеченных данных. А если действовать по обстоятельствам в отношении работы с моделью, это приведет к неоднозначности что отрицательно отразится на качестве кода.

Более того, очень часто приходится брать параметры из роутера, и на основе этих параметров извлекать данные из модели. Это означает, что во вью придется давать доступ в том числе и к роутеру, что не приемлемо, потому как вью не должен знать о роутере. Исключением может быть формирование ссылок по имени роута, и то обычно это делается через плагины вью, а не через прямое общение с роутером.

Можно ещё поговорить о том, почему не нужно работать с моделью во вью, но думаю этого достаточно.

(Отредактировано автором: 19 Марта, 2015 - 18:30:24)

 
 Top
DelphinPRO
Отправлено: 19 Марта, 2015 - 21:29:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




teddy пишет:
Потому что MVC подразумевает отделение мух от котлет.

а я утверждал обратное?
модель генерит данные, вьюха их забирает и рендерит.
(Добавление)
Давайте я вам примерчик приведу.

Например есть у нас страница. Она показывает имя пользователя
Мы пишем

в модели: getName() { bla bla }
в контроллере $this->view->set('name', $model->getName())
во вьюхе: echo $this->name

Потом подумали: "а ведь модель у нас продвинутая, она же еще и возраст возвращает. Давай его тоже на страницу выведем".
Что делаем? Редактируем шаблон, потом еще и контроллер. Хотя, казалось бы, при чем здесь контроллер. Мы же всего лишь данных на страницу добавили.

Это реально неудобно. Сам так писал.

Хотя это, конечно, спорный момент.


PS. Блин, в конце предложений вместо точки уже на автомате ставлю точку-с-запятой Улыбка

(Отредактировано автором: 19 Марта, 2015 - 21:40:44)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
caballero
Отправлено: 19 Марта, 2015 - 22:04:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Сам же знаешь, что есть данные,работа с которыми до первого вывода информации в браузер(заголовки, куки). Зачем такое говоришь?

И где тут противоречие?

Цитата:
Не нужно забывать, что работа с моделью подразумевает не только получение, но и изменение/добавление/удаление уже существующих данных, а эти задачи выходят за рамки view.


в теме идет речь от ОТОБРАЖЕНИИ данных

Цитата:
Так же есть ситуации, где во view работать с моделью уже будет поздно, например в том случае, как написали выше, если требуется отправить заголовки на основе извлеченных данных.

глупость выше я уже прокоментировал - что мешает view отправить щзаголовки а потом рендерить собственно страницу?

Цитата:
Можно ещё поговорить о том, почему не нужно работать с моделью во вью, но думаю этого достаточно.

не надо говорить - полстраницы бессмысленых рассуждений достаточно.


Цитата:
Хотя это, конечно, спорный момент.

Не спорный. Нужно просто отличать изменение данных модели в соответствии с командой, выполняемой контроллером, и отображением данных. Нет никаких причин чтобы контролер был перевалочным пунктом между моделью и view
(Добавление)
Цитата:
кто как делает? и как вообще принято?

никак не принято - кто как хочет так и делает.
есть масса библиотек более высокого уровня для работы с БД - они уже возвращают ассоциативные массивы.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
teddy
Отправлено: 20 Марта, 2015 - 00:36:04
Post Id


Участник


Покинул форум
Сообщений всего: 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.

Псевдокод для нормального ответа:
PHP:
скопировать код в буфер обмена
  1.  
  2. $response->setHeaders(...);
  3. $response->setBody($view->getMarkup());
  4. $response->send();
  5.  


Спойлер (Отобразить)

(Отредактировано автором: 20 Марта, 2015 - 00:37:49)

 
 Top
grafillo
Отправлено: 20 Марта, 2015 - 22:14:18
Post Id


Посетитель


Покинул форум
Сообщений всего: 280
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




я понимаю что холивар это кулл. но ответьте на мои вопросы пожалуйста:
В каком классе надо подключаться к бд.
Как передавать mysql_query в класс вью, его надо разбирать в ассоциативнй массив или как и можно пример кода?
 
 Top
caballero
Отправлено: 20 Марта, 2015 - 23:05:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
я понимаю что холивар это кулл. но ответьте на мои вопросы пожалуйста:

на вопросы непонятно о чем ответят только непонятно как

Цитата:
В каком классе надо подключаться к бд.

Що значит в каком? Каком по счету на диске?

Цитата:
Как передавать mysql_query в класс вью, его надо разбирать в ассоциативнй массив или как и можно пример кода?

так же как передавать в любое другое место
(Добавление)
Цитата:
А я понял. И получится у тебя неоднозначная логика.

в чем неоднозначная?

Цитата:
Технически ничего не мешает, но это не логично.

что именно не логично

Цитата:
Вью(имеется ввиду не шаблон а API который формирует разметку)

а где было сказано что имеется ввиду и при чем тут какое то API? А если не API?

Цитата:
его дело заниматься формированием разметки а не устанавливать статус коды/отправлять заголовки и т.п,

его дело представить данные с сервера. Статус коды тоже данные


Цитата:
для этого должен быть Response, который и должен возвращать сформированную View API разметку(если это требуется) + заголовки.

где сказано что он должен быть? На курсах програмирования? мы обсуждаем принцип а не единственное решение которое ты видел в жизни


Цитата:
Более того, раз уж перекидываешь отправку ответа на шею View, то смотри: тебе надо отправить клиенту json и ничего более, разве логично отправлять его через View? Здесь нет никакого представления, это всего лишь json.


все что отвечает за представление данных клиенту и есть ПРЕДСТАВЛЕНИЕ. потому оно так и называется.
нигде не сказано что представление это обязательно html код. А есkи вместо json аяксом ушел HTML - это представление или нет?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB