Статьи

Шаблон MVC и PHP, часть 1

Паттерн Model-View-Control (MVC), первоначально сформулированный в конце 1970-х годов, представляет собой паттерн архитектуры программного обеспечения, построенный на основе разделения представления данных от методов, взаимодействующих с данными. Теоретически, хорошо разработанная система MVC должна позволять внешнему разработчику и внутреннему разработчику работать в одной системе без вмешательства, совместного использования или редактирования файлов, над которыми работает любая сторона.

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

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

Понимание MVC

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

MVC Process

На рисунке показано расположение потока данных в отдельности, как оно передается между каждым компонентом и, наконец, как работает связь между каждым компонентом.

модель

Модель — это имя, данное постоянному хранилищу данных, используемых в общем проекте. Он должен предоставлять доступ для просмотра, сбора, записи данных и является мостом между компонентом View и компонентом Controller в общем шаблоне.

Одним из важных аспектов модели является то, что она технически «слепая» — под этим я подразумеваю, что модель не имеет связи или знания о том, что происходит с данными, когда они передаются в компоненты View или Controller. Он не вызывает и не ищет ответа от других частей; его единственная цель — обрабатывать данные в постоянном хранилище или искать и подготавливать данные для передачи в другие части.

Модель, однако, не может быть просто суммирована в качестве базы данных или шлюза в другую систему, которая обрабатывает процесс обработки данных. Модель должна выступать в роли привратника к самим данным, не задавая вопросов, а принимая все запросы, которые возникают. Часто самая сложная часть системы MVC, компонент Model также является вершиной всей системы, поскольку без него нет связи между контроллером и представлением.

Посмотреть

Представление — это место, где просматриваются данные, запрошенные у модели, и определяется их окончательный результат. Традиционно в веб-приложениях, созданных с использованием MVC, представление является частью системы, где генерируется и отображается HTML-код. Представление также запускает реакции пользователя, который затем взаимодействует с контроллером. Основным примером этого является кнопка, сгенерированная представлением, которое пользователь щелкает и запускает действие в контроллере.

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

«Важно отметить, что для правильного применения архитектуры MVC не должно быть взаимодействия между моделями и представлениями: вся логика обрабатывается контроллерами»

Кроме того, описание Views в виде файла шаблона является неточным. Однако, как отмечает Том Батлер, это не ошибка одного человека, а множество ошибок множества разработчиков, в результате которых разработчики неправильно изучают MVC. Затем они продолжают неправильно обучать других. Представление на самом деле гораздо больше, чем просто шаблон, однако современные фреймворки, вдохновленные MVC, сводят представление на нет почти до такой степени, что никому на самом деле не важно, соответствует ли фреймворк правильному шаблону MVC или нет.

Также важно помнить, что часть просмотра никогда не получает данные от контроллера. Как я уже упоминал при обсуждении модели, нет прямой связи между представлением и контроллером без модели между ними.

контроллер

Последний компонент триады — Контроллер. Его задача — обрабатывать данные, которые пользователь вводит или отправляет, и соответственно обновлять модель. Жизненная кровь Контролера — это пользователь; без взаимодействия с пользователем у Контроллера нет цели. Это единственная часть шаблона, с которой пользователь должен взаимодействовать.

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

Важно помнить, что Контроллеру дают только те задачи, которые он выполняет, когда пользователь сначала взаимодействует с View, и что каждая функция Controller является триггером, отключаемым взаимодействием пользователя с View. Самая распространенная ошибка, которую допускают разработчики, — путать контроллер с шлюзом и, в конечном итоге, назначать ему функции и обязанности, которые должен иметь представление (это обычно является результатом того же разработчика, который путает компонент представления просто как шаблон). Кроме того, распространенной ошибкой является предоставление функций контроллера, которые возлагают на него исключительную ответственность за анализ, передачу и обработку данных из модели в представление, тогда как в шаблоне MVC это отношение должно сохраняться между моделью и представлением.

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
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
$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, и создали очень простое приложение MVC, но нам еще предстоит пройти долгий путь, прежде чем мы перейдем к каким-либо элементарным функциям.

Далее в этой серии мы рассмотрим некоторые варианты, с которыми вы сталкиваетесь при попытке создать настоящее приложение MVC в Интернете на PHP. Будьте на связи!

Изображение через Fotolia

Комментарии к этой статье закрыты. У вас есть вопрос о MVC Patterns и PHP? Почему бы не спросить об этом на наших форумах ?