Лично я думаю, что ваш контроллер несет ответственность за слишком много. Инстанцирование модели и вида внутри контроллера «кажется» неправильным. Контроллер должен нести ответственность только за получение данных от Model и передачу их в View. Прямо сейчас Контроллер отвечает за создание Модели И он эффективно действует как Представление, включая HTML.
Важной частью здесь является то, что каждый объект в идеале несет особую ответственность.
- Модель = данные, содержащие ваше приложение (это действительно слой, а не объект)
- Просмотр = окончательный вывод, отправленный пользователю
- Контроллер = дать материал для просмотра из модели
Я рекомендую вам создать какой-то объект типа "front controller", который обрабатывает соответствующие экземпляры объектов и отвечает за настройку всех различных частей.
Ах, хорошо, но как контроллер "передает" данные представлению?
Ну, это действительно будет зависеть от конкретной архитектуры, которую использует ваша конкретная реализация. MVC выходит далеко за рамки простого шаблона проектирования и может интерпретироваться различными способами. Я предпочитаю что-то похожее на ...
class Controller {
protected $viewData = array();
public function index() {
$data = $this->Model->getData();
$this->giveToView('data', $data);
}
public function getViewData() {
return $this->viewData;
}
protected function giveToView($key, $value) {
$this->viewData[$key] = $value;
}
}
Итак, контроллер все еще получает данные из Model, но теперь вместо включения файла представления мы просто сохраняем данные и позволяем другому классу позаботиться о фактическом рендеринге вывода.
class View {
protected $viewData;
public function setViewData(array $data) {
$this->viewData = $data;
}
public function renderViewFile($filePath) {
// from example the variable $data is now available in this scope
// to include the $filePath
extract($this->viewData);
include $filePath;
}
}
Очевидно, что это упрощенный пример, но основная предпосылка остается прежней.