Вопрос у меня не конкретно к какому-то фреймворку, а в целом, так скажем по теории.
Многие фреймворки в документациях приводят пример, когда модель возвращает непосредственно объект какой-либо таблицы, но чаще в проектах модели так же производят какие-то вычисления и могут возвращать помимо полей таблиц еще множество данных.
Раньше, скажем в PHP, это решалось просто, к возвращенному массиву просто добавляли новые значения и возвращали весь список, а как решать эту проблему на уровне текущих абстракций фреймворков? В класс (отражающий таблицу) добавлять дополнительные поля? Или же создать отдельный класс, который включает как вычисляемые данные, так и объект с БД?
Теоретический вопрос о моделях в MVC фреймворках и способе возврата вычисляемых данны
-
- Сообщения: 2
- Зарегистрирован: 19 апр 2015, 17:05
Версия вопроса 2.0 (с кодом).
Условие, после обработки из БД формируется результат в виде некого объекта класса Post, в котором описаны поля таблиц (ORM иди ActiveRecord не важно).
Вопрос.
Как с точки зрения ООП дизайна поступить, то есть что вернуть контроллеру?
1) Просто вернуть массив, где одно значение это объект Post (результат из БД), а второй вычисленные данные.
2) Создать какой-то выше по уровню класс типа OverPost, которые бы включал в себя объект (результат из БД), и вычисленные данные (по сути тот же массив только в обертке ООП со всеми плюшками).
3) Заранее расширить класс Post, чтобы он содержал данные не только с таблиц БД, а так же вычисляемые данные.
В общем какой вариант будет правильней, с точки зрения дизайна кода, с точки зрения MVC и с точки зрения нынешнего стиля фреймворков?
Условие, после обработки из БД формируется результат в виде некого объекта класса Post, в котором описаны поля таблиц (ORM иди ActiveRecord не важно).
Вопрос.
Как с точки зрения ООП дизайна поступить, то есть что вернуть контроллеру?
1) Просто вернуть массив, где одно значение это объект Post (результат из БД), а второй вычисленные данные.
Код: Выделить всё
class Model {
public function getData(){
$query = "Query";
$post = $store->get($query);
$result = [
'post' => $post,
'smthParams' => $this->calculateSmth()
];
return $result;
}
...
}
Код: Выделить всё
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 расклад такой.LukiDuki1980 писал(а):с точки зрения MVC
Model - это то, что складывается в хранилище. Этот набор сообщений на форуме хранится в одной таблице. То есть модель одна.
View - это способ отображения данных. Тут их минимум 4 варианта: версия для печати, линейный, древовидный и комбинированный способ отображения ветки.
Control - это способ связи View c Model'ю. В нем осуществляются все функции ограничения доступа.
То есть. Модель - хранит всё, что в неё положат. Представление - показывает всё, что ему предложат. А контроллер осуществляет контроль над тем, что можно положить в модель и над тем, что можно показать в представлении в зависимости от роли пользователя.
Таким образом, хорошая MVC система допускает применение нескольких контролеров для одной и той же пары модель-представление.
Соответственно расширять нужно не модель, а контроллер

Даже самый дурацкий замысел можно воплотить мастерски