Пример шаблона проектирования MVC в PHP
Шаблон проектирования MVC представляет собой шаблон программной архитектуры «Модель-Представление-Контроллер». MVC — это один из способов организации кода и набор рекомендаций, описывающих ряд правил. Задача MVC заключается в том, чтобы наш код проще воспринимался и читался, а также быстрее обрабатывался компьютером.
Главная идея MVC — отделить внешний вид приложения от его логики. Здесь мы говорим о веб-приложениях, поэтому внешний вид в данном случае — это HTML-разметка и CSS-оформление. А вот под логикой понимаются разнообразные скрипты, классы, функции и пр.
Шаблон MVC стимулирует развитие модульных систем, поэтому разработчики получают возможность ускоренно обновлять, удалять либо добавлять функционал. Давайте рассмотрим главные принципы и определение схемы построения MVC на примере PHP.
Основные составляющие MVC
Как уже было сказано выше, главными составляющими шаблона проектирования MVC являются 3 части: Контроллер, Представление и Модель. Визуально это выглядит следующим образом:
На рисунке изображены односторонний поток данных и путь его следования между разными компонентами, а также их взаимодействие.
Модель
«Модель» — это постоянное хранилище данных, которое используется по всей структуре. Компонент обеспечивает доступ к данным для просмотра, отбора, записи. По сути это мост между другими компонентами: «Контроллер» и «Представление».
«Модель» не «знает», что происходит с данными дальше. Её задачи — поиск и подготовка данных, передаваемых прочим компонентам MVC, а также обработка их в постоянном хранилище. По сути это «привратник», который стоит возле хранилища данных и не задаёт лишних вопросов, однако принимает все запросы, которые поступают. «Модель» — вершина структуры MVC, без неё невозможна связь между «Представлением» и «Контроллером».
Представление
Это часть системы, в которой данным, запрашиваемым у «Модели», задаётся финишный вид их вывода. В веб-приложениях, построенных с помощью MVC, «Представлением» называют компонент, где генерируется и отображается код HTML.
Кроме того, «Представление» перехватывает действия пользователей, которые после передаются «Контроллеру». Характерный пример — кнопка, генерируемая «Представлением». Если пользователь её нажимает, в «Контроллере» запускается действие.
Неправильно говорить, что «Представление» — это файл шаблона, ведь на деле «Представление» — это гораздо больше, чем шаблон. Следует уяснить, что данные не передаются «Представлению» непосредственно «Контролллером», т. к. между ними нет прямой связи, они соединяются посредством «Модели».
Контроллер
Он занимается обработкой данных, которые вводятся пользователем, а также участвует в обновлении «Модели». Этот компонент работает при взаимодействии с пользователем.
«Контроллер» можно назвать сборщиком информации, которая передаётся в «Модель» с последующей организацией хранения. Компонент не содержит другой логики, кроме той, что нужна для сбора входящих данных. Также он подключается лишь к одному «Представлению» и к одной «Модели». Таким образом создаётся система с 1-сторонним потоком данных, с одним выходом и одним входом в точках обмена.
Компонент получает задачи с целью выполнения лишь тогда, когда пользователь осуществляет взаимодействие с «Представлением». При этом не стоит путать «Контроллер» со шлюзом, присваивая ему задачи и функции, относящиеся к «Представлению». Распространённая ошибка — наделение «Контроллера» функциями, отвечающими только за передачу и обработку данных из компонента «Модель» в компонент «Представление».
MVC в PHP
Давайте напишем приложение на PHP с архитектурой MVC. Начнём с примера каркаса:
<?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; } }
Итак, мы имеем проект с несколькими основными классами для каждой из частей шаблона. Давайте настроим между ними взаимосвязь:
<?php $model = new Model(); $controller = new Controller($model); $view = new View($controller, $model); echo $view->output();
В нашем примере PHP MVC отсутствует специфический функционал для контроллера, а всё потому, что в веб-приложении взаимодействия пользователя не определены. Что касается представления, то этот компонент содержит весь функционал, ведь пример предназначен только для демонстрации.
Теперь расширим PHP-пример и покажем, как будем добавлять функционал контроллера, добавляя в приложение взаимодействия:
<?php class Model { public $string; public function __construct(){ $this->string = “MVC + PHP = Awesome, click here!”; } } <?php class 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>"; } } <?php class Controller { private $model; public function __construct($model){ $this->model = $model; } public function clicked() { $this->model->string = “Updated Data, thanks to MVC and PHP!”; } }
Итак, 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-приложения.
Материал подготовлен специально для OTUS на основе статьи «The MVC Pattern and PHP. Part 1».
Хотите знать больше? Записывайтесь на курс "Backend-разработчик на PHP"!