Учитывая концепцию «тощих контроллеров, толстых моделей» и общее признание того, что представления могут напрямую вызывать модели, когда требуются данные для вывода, следует ли рассматривать обработку частей «получить и отобразить» запросов в представлениях, а не контроллер? Например (попытка сделать код достаточно общим):
контроллер
<?php
class Invoice extends Base_Controller {
/**
* Get all the invoices for this month
*/
public function current_month() {
// as there's no user input let's keep the controller very skinny,
// DON'T get data from the Model here, just load the view
$this->load->view('invoice/current_month');
}
}
Посмотреть
<?php
// directly retrieve current month invoices here
$invoices = $this->invoice_model->get_current_month();
// get some other display-only data, e.g. a list of users for a separate list somewhere on the page
$users = $this->user_model->get_users();
?>
<h1>This month's invoices</h1>
<ul>
<?php foreach ($invoices as $invoice) { ?>
<li><?php echo $invoice['ref']; ?></li>
<?php } ?>
</ul>
Для меня это имеет некоторый смысл в тех случаях, когда запрос по сути является просто представлением. Почему Контроллер должен собирать и передавать данные в View, если он может просто извлечь их сам? Это оставляет контроллер открытым только для обработки на уровне приложения (например, обработка запросов GET / POST, управление правами доступа и разрешениями и т. Д.), А также для сохранения возможности многократного использования моделей и других полезных вещей.
Если этот пример был расширен, чтобы позволить пользователю фильтровать результаты, контроллер просто обработает POST из формы и передаст фильтры представлению, которое затем снова запросит данные, на этот раз с фильтрами.
Это правильный подход к разработке приложения MVC? Или я упускаю из виду важную роль, которую должен играть Контроллер?
источник
offers_model->get_latest()
быть сделан вызов ? Добавление этого в каждый метод в контроллере (как я глупо пытался раньше) кажется излишним и явно не СУХИМЫМ.offers_model->get_latest()
кProductViewModel
базовому классу или что - то подобное.Нет, это не правильно. Просмотр не может напрямую вызывать модели. Представления не должны иметь доступа к объектам модели, если только по какой-то причине программист не предоставил эти объекты представлению.
Это в основном стирает Контроллер, и побеждает смысл их наличия.
Контроллер не собирает данные. Модель осуществляет сбор данных. Контроллер решает , следует ли передавать эти данные в представление. Представление только делает представление данных.
Нет.
Контроллер проверяет, являются ли данные POSTed действительными, затем передает эти данные в качестве параметров в Модель, которая затем запрашивает источник данных и возвращает данные, а Контроллер передает их в представление.
Контроллер работает как обработчик запросов от браузера. Диспетчер отправляет запрос действию контроллера, который, в свою очередь, распространяет запрос на Модели. Модели содержат всю бизнес-логику (это жирная часть) и возвращают данные контроллеру. Затем контроллер может упростить и скорректировать данные, чтобы представлению было проще их представить.
Смысл этого представления состоит в том, чтобы отделить структуру и зависимость между представлением HTML и источником данных. Хотя это может быть сложно. Представления не всегда представляют данные, полученные непосредственно из модели. Контроллер часто добавляет дополнительные данные, которые актуальны.
Я уверен, что есть много учебных пособий по MVC. Я бы рекомендовал прочитать некоторые из них.
источник
Я нашел ваш вопрос очень интересным, потому что недавно столкнулся с той же проблемой, изучая Python.
Хотя приведенные ответы являются убедительным аргументом, я подумал, что хотел бы добавить еще одно мнение, с которым я столкнулся, в котором представление получает состояние модели без прохождения через контроллер.
Я не в состоянии сказать, какое из мнений является «правильным», и, честно говоря, я немного запутался после прочтения ответов здесь и связанной статьи.
Полный текст статьи здесь .
источник
Еще одна вещь, которую следует учитывать, - это то, что вы, кажется, автоматически загрузили
user_model
иinvoice_model
разрешили представлению доступ к ним. Для того, чтобы это работало надежно, вы, вероятно, автоматически загружаете все свои модели (потому что$this->load->model()
просто выглядит неправильно в представлении, не так ли ...)Это излишне раздувает ваш стек, загружая кучу вещей, которые могут никогда не привыкнуть. Одной из причин наличия нескольких моделей является возможность инкапсулировать связанную логику и загружать только то, что вам нужно для данной задачи.
Это похоже на CodeIgniter. Я много занимался разработкой CI, и я могу поделиться своим личным опытом, что вы действительно не хотите загружать больше, чем нужно. Попробуйте добавить
$this->output->enable_profiler(TRUE);
конструктор контроллера и возиться с автозагрузкой (включая вспомогательные функции, напримерdatabase
): вы, вероятно, увидите значительное изменение во времени загрузки и выполнения, но особенно в распределении памяти.источник
load->model
во многих контроллерах и методах есть то же самое. Отсутствие надлежащей функции автозагрузки - одна из вещей, которые мне больше всего не нравятся в обратной совместимости CI, но это совсем другое обсуждение ...Короткий ответ: форма вашего кода обманчиво интуитивно понятна. Казалось бы, это «легкий для ума» путь.
Проблема № 1
Ваши
Model
иView
объекты будут тесно связаны.Если вам когда-либо придется добавлять или удалять методы в
Model
, то вам, возможно, придется изменить ихView
соответствующим образом.По сути, MVC основан на шаблонах Command и Observer . Вам нужна независимая «Модель», которой манипулируют через интерфейс / API, который
Controller
может подключаться (т.е. делегировать).Зачастую это означает внедрение
Model
иView
экземпляры вController
и сохранение их как свойств указанногоController
. Затем, используя методController
(то есть команду) в качестве рабочей области, передайте данные в aView
изModel
( после того, как `Модель закончила обновление состояния приложения ).Попутный данные (массивы, Iterable объектов, безотносительно) продолжает сшивающий между
Model
иView
случаями потерять . Если вы внедрилиModel
экземпляр вView
, см. Проблему № 1 выше.Помните, что это
Views
может быть HTML, JSON, Text, XML, заголовки HTTP, YAML или почти что угодно, в соответствии с методологией передачи состояния представления (REST) .Таким образом, ключ к пониманию того, как управлять отношениями между
Model
и,Views
состоит в том, чтобы видеть отношения такими, какие они есть, один ко многим (потенциально)! Это именно то, для чего был разработан шаблон Observer .В то время как большинство установок имеют только одно представление, которое нужно учитывать одновременно, ничто не мешает архитектурному шаблону MVC обновлять несколько представлений одновременно! Работа с традиционными веб-приложениями CRUD заставляет людей думать один на один , но это наименьший пример того, как может работать шаблон Observer ( один ко многим - другой ).
Таким образом, если у вас было одно
Model
и несколькоViews
, потенциальная головная боль обновления всегоViews'
кода реализации, потому что вы изменили что-то вModel's
API / методах, теперь становится острой .Передавать данные
Views
, а не экземплярыModels
.источник