Паттерн 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 шт):
Любой паттерн построен на общем понимании ООП - объектно-оринетированном программировании, где каждый объект/класс/тип имеет свое предназначение и свою роль при решении задачи.
Вот и давайте зайдем со стороны ООП. Что такое паттерн 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);
}
}