Шаблон проектирования MVC и PHP, Часть 1

Шаблон проектирования Модель-Представление-Контроллер(MVC) — это шаблон программной архитектуры, построенный на основе сохранения представления данных отдельно от способов, которые взаимодействуют с данными.

Не смотря на то, что схема MVC была первоначально разработана для персональных компьютеров, она была адаптирована и широко используется веб-разработчиками из-за точного разграничения задач и функции повторного использования кода. Схема стимулирует развитие модульных систем, что может разработчикам быстро обновлять, добавлять или удалять функционал.

В данной статье я опишу основные принципы, а также рассмотрю определение схемы построения и простой MVC PHP пример.

Что такое MVC

Название шаблона проектирования определяется тремя его основными составляющими частями: Модель, Представление и Контроллер. Визуальное представление шаблона MVC выглядит, как показано на приведенной ниже диаграмме:

Шаблон проектирования MVC и PHP, Часть 1 На рисунке показана структура одностороннего потока данных и пути его следования между разными компонентами, а также их взаимодействие.

Модель

Моделью называют постоянное хранилище данных, используемых во всей структуре. Она должна обеспечивать доступ к данным для их просмотра, отбора или записи. В общей структуре «Модель» будет мостом между компонентами «Представление» и «Контроллер».

При этом «Модель» не имеет в себя никакой связи или информации о том, что происходит с данными, когда они передаются компонентам «Представление» или «Контроллер». Единственная задача «Модели» — обработка данных в постоянном хранилище, поиск и подготовка данных, передаваемых иным составляющим MVC.

«Модель» должна выступать в виде «привратника», стоящего возле хранилища данных и не задающего вопросов, но принимающего все поступающие запросы. Зачастую это наиболее сложная часть системы MVC. Компонент «Модель» — это вершина всей структуры, поскольку без нее невозможна связь между «Контроллером» и «Представлением».

Представление

Представление — это часть системы, в которой данным, запрашиваемым у «Модели», задается окончательный вид их вывода. В веб-приложениях, созданных на основе MVC, «Представление» — это компонент, в котором генерируется и выводится HTML -код.

Представление также перехватывает действие посетителя, которое далее передается «Контроллеру». Характерным примером этого будет кнопка, генерируемая «Представлением». Когда посетитель нажимает ее, запускается действие в «Контроллере».

Существует пару распространенных заблуждений относительно компонента «Представление». К примеру, многие ошибочно полагают, что «Представление» не имеет в себя никакой связи с «Моделью», а все отображаемые данные передаются от «Контроллера». В действительности такая схема потока данных не учитывает теорию, лежащую в основе MVC архитектуры. В вашей статье Фабио Чеваско описывает этот некорректный подход на примере одного из нетрадиционных MVC PHP фреймворков:

«Чтобы правильно применять архитектуру MVC, между «Моделью» и «Представлением» не должно быть никакого взаимодействия: вся логика обрабатывается «Контроллером».

Кроме этого определение «Представления» как файла шаблона также будет неточным. Но это не вина одного человека, а результат множества ошибок разных разработчиков, которые приводят общему заблуждению. После чего они неправильно объясняют это иным. Фактически «Представление» это гораздо больше, чем просто шаблон. Но современные MVC -ориентированные фреймворки до такой степени впитали этот подход, что никто не заботится о том, поддерживается ли верная структура MVC или нет.

Компоненту «Представление» никогда не передаются данные непосредственно «Контроллером». Между «Представлением» и «Контроллером» нет прямой связи — они соединяются при помощи «Модели».

Контроллер

Его задача заключается в обработке данных, которые посетитель вводит и обновлении «Модели». Это единственная часть схемы, для которой надо взаимодействие посетителя.

«Контроллер» можно определить, как сборщик информации, которая далее передается в «Модель» с последующей организацией для хранения. Он не включает никакой другой логики, кроме необходимости собрать входящие данные. «Контроллер» также подключается только к одному «Представлению» и одной «Модели». Это создает систему с односторонним потоком данных с одним входом и одним выходом в точках обмена данными.

«Контроллер» получает задачи на выполнение только когда посетитель взаимодействует с «Представлением», и каждая функцию зависит от взаимодействия посетителя с «Представлением». Наиболее распространенная ошибка разработчиков заключается в том, что они путают «Контроллер» со шлюзом, так что присваивают ему возможности и задачи, которые относятся к «Представлению».

Также распространенной ошибкой будет наделение «Контроллера» возможностями, которые отвечают только за обработку и передачу данных из «Модели» в «Представление». Но согласно структуре MVC паттерна это взаимодействие должно осуществляться между «Моделью» и «Представлением».

MVC в PHP

Напишем на PHP веб-приложение, архитектура которого основана MVC. Давайте начнем с примера каркаса:

<?phpclass Model{ public $string; public function __construct(){ $this->string = "MVC + PHP = Awesome!"; }}<?phpclass 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>";    }}<?phpclass Controller{    private $model;    public function __construct($model) {        $this->model = $model;    }}

У нас есть проект с несколькими основными классами для каждой части шаблона. Сейчас необходимо изменить взаимосвязь между ними:

<?php$model = new Model();$controller = new Controller($model);$view = new View($controller, $model);echo $view->output();

В приведенном выше примере PHP MVC нет никакого специфического функционала для контроллера, так как в приложении не определены взаимодействия посетителя. Представление включает весь функционал, поскольку наш пример предназначен лишь для демонстрации.

Давайте расширим пример, чтобы показать, как мы будем добавлять функционал контроллера, тем самым добавив в приложение взаимодействия:

<?phpclass Model{    public $string;    public function __construct(){        $this->string = “MVC + PHP = Awesome, click here!”;    }}<?phpclass View{    private $model;    private $controller;    public function __construct($controller,$model) {        $this->controller = $controller;        $this->model = $model;    }    public function output() {        return '<p><a href="mvc.php?action=clicked"'. $this->model->string. "</a></p>";    }}<?phpclass Controller{    private $model;    public function __construct($model){        $this->model = $model;    }    public function clicked() {        $this->model->string = “Updated Data, thanks to MVC and PHP!”;    }}

Мы расширили программу базовым функционалом. Параметр взаимодействий между компонентами сейчас выглядит следующим образом:

<?php$model = new Model();$controller = new Controller($model);$view = new View($controller, $model);if(isset($_GET['action']) &&!empty($_GET['action'])) {    $controller->{$_GET['action']}();}echo $view->output();

Запустите код и при нажатии на ссылку вы увидите строку для изменения данных.

Заключение

Мы рассмотрели базовую теорию модели MVC, и реализовали на его основе простое приложение. В следующей статье данной серии мы рассмотрим пару конкретных случаев, с которыми вы можете столкнуться при создании веб-приложений на PHP.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *