Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Теоретический вопрос о моделях в MVC фреймворках, и способе возврата вычисляемых данных 
:(
    Опции темы
LukiDuki1980
Дата 19.4.2015, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.4.2015

Репутация: нет
Всего: нет



Вопрос у меня не конкретно к какому-то фреймворку, а в целом, так скажем по теории.

Многие фреймворки в документациях приводят пример, когда модель возвращает непосредственно объект какой-либо таблицы, но чаще в проектах модели так же производят какие-то вычисления и могут возвращать помимо полей таблиц еще множество данных.

Раньше, скажем в PHP, это решалось просто, к возвращенному массиву просто добавляли новые значения и возвращали весь список, а как решать эту проблему на уровне текущих абстракций фреймворков? В класс (отражающий таблицу) добавлять дополнительные поля? Или же создать отдельный класс, который включает как вычисляемые данные, так и объект с БД?
PM MAIL   Вверх
SamDark
Дата 19.4.2015, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 10
Всего: 38



Смотря что вычисляется и относится ли это к самой модели.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
ksnk
Дата 19.4.2015, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(LukiDuki1980 @  19.4.2015,  16:45 Найти цитируемый пост)
а как решать эту проблему на уровне текущих абстракций фреймворков?

Самыми современными средствами - магией  smile __call, __get и т.д. Магическими методами можно реализовать ленивую загрузку...

Если аналогии искать, то PHP - это, с точки зрения скульптора, зубило и молоток. А MVC - это высказывание Микеланджело - "Я беру камень и отсекаю всё лишнее". С точки зрения эстетики - красиво, с точки зрения практики - малоприменимо. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
LukiDuki1980
Дата 20.4.2015, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.4.2015

Репутация: нет
Всего: нет



Версия вопроса 2.0 (с кодом).
Условие, после обработки из БД формируется результат в виде некого объекта класса Post, в котором описаны поля таблиц (ORM иди ActiveRecord не важно).
Вопрос.
Как с точки зрения ООП дизайна поступить, то есть что вернуть контроллеру?


1) Просто вернуть массив, где одно значение это объект Post (результат из БД), а второй вычисленные данные.
Код
class Model {

public function getData(){
  $query = "Query";
  $post = $store->get($query);
  $result = [
    'post' => $post,
    'smthParams' => $this->calculateSmth()
  ];
  
  return $result;
}
...
}


2) Создать какой-то выше по уровню класс типа OverPost, которые бы включал в себя объект (результат из БД), и вычисленные данные (по сути тот же массив только в обертке ООП со всеми плюшками).
Код
class Model {

public function getData(){
  $query = "Query";
  $post = $store->get($query);
  $result = new OverPost()
  $result->setPostData($post);
  $result->setSmthParam($this->calculateSmth())
  
  return $result;
}
...
}



3) Заранее расширить класс Post, чтобы он содержал данные не только с таблиц БД, а так же вычисляемые данные.

Код
class Model {

public function getData(){
  $query = "Query";
  $post = $store->get($query);
  $post->setSmthParam($this->calculateSmth());
  return $post;
}
...
}


В общем какой вариант будет правильней, с точки зрения дизайна кода, с точки зрения MVC и с точки зрения нынешнего стиля фреймворков?
PM MAIL   Вверх
Spiker
Дата 20.4.2015, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 25.5.2005
Где: Спортзал

Репутация: -2
Всего: -2



Модель должна производить коммуникацию с ДБ. 

Оригинальная MVC модель говорит о том что изначально коммуникация идет в Контроллер, затем в модель и после в "View".
 
Но на практике MVC контроллер ведёт коммуникацию со "View". Контроллер, используя параметры POST / GET, отправляет их в Модель и Библиотеки для того чтобы вывести резултать во "View"

"The Model represents your data structures. Typically your model classes will contain functions that help you retrieve, insert, and update information in your database."
https://ellislab.com/codeigniter/user-guide...erview/mvc.html

То-есть модель используется для коммуникаций с ДБ. после того как ты получил резултать с Модели это резултать поступает в Библиотеку и делает нужную операцию и затем "View" это все показывает.


Это сообщение отредактировал(а) Spiker - 20.4.2015, 16:50


--------------------
Даваите жить дружно! (Леопольд.) :shy67:
PM MAIL MSN   Вверх
ksnk
Дата 20.4.2015, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Spiker @  20.4.2015,  16:49 Найти цитируемый пост)
Модель должна производить коммуникацию с ДБ. 

Вот только не надо путать объект доступа к данным и MVC-модель. MVC-модель может получить все данные, которые требуются для View. Если взять, для примера, карточку товара в магазине, то вместе со свойствами самого товара, объект должен  уметь выдать описание бренда (другая таблица), список "с этим товаром обычно покупают" - отдельный список товаров, список категорий товара - отдельная таблица и т.д.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Spiker
Дата 20.4.2015, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 25.5.2005
Где: Спортзал

Репутация: -2
Всего: -2



пример, контроллер

Код

public function view($id)
{
    $item_info = $this->item_model->getItemById($id); // запрос в ДБ, возвращает array
    
    $item_info[0]['created_on'] = $this->item_library->formatDate($item_info[0]['created_on']); // изменяем формат даты
    
    // находим похожие товары
    $data['related_items'] = $this->related_items_library->findRelatedItemsByItemId($id);

    $data['item_info'] = $item_info;
    
        // отправляем инфо в "view"
    $this->load->view('item/view', $data);
}


Это сообщение отредактировал(а) Spiker - 20.4.2015, 18:42


--------------------
Даваите жить дружно! (Леопольд.) :shy67:
PM MAIL MSN   Вверх
ksnk
Дата 20.4.2015, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Spiker, Итого, для того, чтобы view cмог отобразить "related_items", знание о наличии related_items обязано быть прописано в контролере, в модели, где они собственно и выковыриваются и во view. в 3-х местах.
А вот если использовать "магию", то можно эту сущьность упоминать только в 2-х. Во view будет написано что-то вроде

Код

$related_item=$data->related_item; // или $data->related_item(), в зависимости от цвета магии
foreach...

В магии класса $data определить все необходимые поля, которые нужны view.

Это лучше?

И что тогда станет с контролером? Редуцируется до 1-2 строчек? 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 21.4.2015, 11:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Из MVC можно использовать только дисциплину - все классы обязаны определиться для себя - к какому "классу" они относятся. Если используется JS или HTML - то однозначно view. Если лезем в базу - однозначно - модель. Если лезем в$_GET/$_POST, вероятнее всего, контроллер. А если все сразу -это не MVC  smile 

Цитата(ksnk @  20.4.2015,  22:32 Найти цитируемый пост)
И что тогда станет с контролером? Редуцируется до 1-2 строчек?  

Можно пойти чуть дальше... В простейшем случае, главный контроллер приложения можно свести к конфигурации. Тоесть, он, фактически, кроме случая обработки форм, становится не особенно и велик - сводится к одной функции довольно универсального вида. Функция обязана по виду GET или расположению звезд, определить, какой view необходимо вывести. Данные формировать, фактически, нет необходимости.
MVC-модель тоже можно "редуцировать" до одного единственного объекта. СамойГлавнойМодели. Уже она будет выдавать нам все необходимые данные для именно этого view. Обычно, такое уже есть - объект $APPLICATION, или  Yii::app() и т.д.
Например, для случая вывода карточки товара, контроллер обязан выявить и припрятать в собственных параметрах ID необходимого товара. View первым делом запросит у СамогоГлавногоМодуля - "дай мне текущий товар". А дальше уже примерно ясно.
В итоге получается MVC из 1-й функции контроллера, одного класса MVC-модель и кучи view. Не особенно по классике, но чем не MVC?  smile 


Это сообщение отредактировал(а) ksnk - 21.4.2015, 12:17


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Spiker
Дата 22.4.2015, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 25.5.2005
Где: Спортзал

Репутация: -2
Всего: -2



я создал быстрый пример ящика с сообщениями для обсуждения, я не использовал магические методы, в контроллере есть две возможные операции: просмотр сообщений и просмотр сообщения; написано для CodeIgniter.

Код

    public function index($page = 0) {
        // получем сообщения; контроллер отправляет данные в библиотеку, а та в модель и возвращает результат
        $data['list'] = $this->messages_library->getInbox($page);
        // контроллер отправляет данные в View
         $this->load->view('messages/index', $data);
    }

    public function view($message_id) {
        // проверяем $message_id
        $_POST['message_id'] = $message_id;
    
        $this->form_validation->set_rules('message_id', 'Message ID', 'xss_clean|trim|is_natural_no_zero|callback__message_exists');
                // если сообщение не найдено то выкидываем пользователя
            if ($this->form_validation->run() == FALSE)
         {
                 redirect('/'); 
         }
        
        // получаем сообщение
         $message_id = $this->form_validation->set_value('message_id');

        $data['message'] = $this->messages_library->getMessage($message_id);
        
        // сообщение не найдено
        if($$data['message'] == FALSE){ redirect('/messages/'); }
        // контроллер отправляет данные в View
         $this->load->view('messages/index', $data);
    }


Это сообщение отредактировал(а) Spiker - 22.4.2015, 18:52

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  messages_controller.zip 1,80 Kb


--------------------
Даваите жить дружно! (Леопольд.) :shy67:
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1495 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.