Паттерн MVC. Сложности с пониманием

Здравствуй, участник сообщества! Изучаю паттерн MVC в PHP. Начал с простого. Нашёл пример для разбора.

<?php
class Model
{
    public $string;
 
    public function __construct(){
        $this->string = "MVC + PHP = Awesome!";
    }
}
<?php
class View
{
    private $model;
    private $controller;
 
    public function __construct($controller,$model) {
        $this->controller = $controller;
        $this->model = $model;
    }
     
    public function output(){
        return "<p>" . $this->model->string . "</p>";
    }
}
<?php
class Controller
{
    private $model;
 
    public function __construct($model) {
        $this->model = $model;
    }
}

Возник вопрос: зачем в классе View вызывать и контроллер и модель? Ведь View работает только с контроллером. Немного запутался. Подскажите, пожалуйста.


Ответы (1 шт):

Автор решения: Alexander Chernin

Любой паттерн построен на общем понимании ООП - объектно-оринетированном программировании, где каждый объект/класс/тип имеет свое предназначение и свою роль при решении задачи.

Вот и давайте зайдем со стороны ООП. Что такое паттерн MVC? Это архитектурный шаблон (некий общий подход), связывающий три основных и часто встречающихся абстракции/сущности в программировании, а именно: Данные (из БД, с диска, сети, списков и т.д.), Отображение этих данных (и не обязательно на экран) и связь между этими частями, который называется Контроллер.

//Модель данных:
class Model {
    //Данные
    public function getData(/*какие-либо условия*/) {
        return $data;
    }
}

//Отображение:
class View {

    public function showData($data) {
        // Как-то отображаем
    }
}

//Связь:
class Controller {

    private $model;
    private $view;

    public function __construct() {
        $this->model = new Model();
        $this->view = new View();
        }

    // Надо отобразить данные из модели
    // Этот метод может быть реакцией на действия пользователя во вью
    public function viewAction() {
        $data = $this->model->getData(/*какие-либо параметры*/);
        $this->view->showData($data);
    }

    // а этот метод может быть реакцией на изменения
    // в модели данных (например)
    public function modelDataChanged() {
        $data = $this->model->getData(/*какие-либо параметры*/);
        $this->view->showData($data);
    }
}
→ Ссылка