Шаблоны проектирования MVC и Front Controller

Шаблоны проектирования (Паттерны) MVC и Front Controller




Паттерн Front Controller

Файл .htaccess

Паттерн MVC (Model View Controller)

Front Controller + MVC

Файловая структура



Паттерн проектирования - это архитектурная конструкция, представляющая собой решение проблемы проектирования .

При создании программ, перед разными разработчиками, часто возникают одни и те же типичные задачи.

При этом существует множество способов их решения. Почти наверняка, подобные задачи уже решались ранее и существует, хорошо продуманное решение, составленное экспертами.

Если эти решения описать, систематизировать, то они станут доступны менее опытным разработчикам, которые смогут их использовать как образцы для решения своих задач.

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

В сфере веб-разработки на PHP повсеместно применяются паттерны Front Controller и MVC.




Паттерн Front Controller




index.php - Фронт контроллер - через этот файл будут проходить все запросы.

Основываясь на определенных правилах, он сам решит, какой файл должен обрабатывать конкретный запрос. Такая схема нам позволит использовать ЧПУ (Человекопонятный URL ).


Создадим проект test1 (OSPanel->domains->test1) и в нем создадим файл index.php


Содержание проекта test1:


MVC-1-1




Файл .htaccess




Настраиваем сервер так, чтобы он отправлял все запросы на файл index.php

Для этого создадим файл .htaccess и добавим в него определенные настройки.


Файл .htaccess:


-- файл .htaccess --

# устанавливаем кодировку
AddDefaultCharset utf-8

# разрешаем перенаправление
RewriteEngine On

# записываем базовую директорию нашего сайта (OSPanel->domains->test1)
RewriteBase /

# указываем, что все запросы нужно перенаправлять на файл index.php
RewriteRule ^(.*)$ index.php





Файл index.php:


-- файл index.php --

<?php
// FRONT CONTROLLER
echo 'front controller';
?>
Выведет:
front controller





- все запросы перенаправляются на файл index.php


Теперь, в этом файле, мы можем получить информацию о нашем запросе. Например - строку запроса, используя суперглобальный массив $_SERVER с определенным ключем ['REQUEST_URI'] - URI, который был предоставлен для доступа к этой странице.


Файл index.php:


-- файл index.php --

<?php
// FRONT CONTROLLER
echo 'front controller <br>';

// получаем информацию о нашем запросе
echo 'your request: ' . $_SERVER['REQUEST_URI'];
?>
Выведет:
your request: /





- мы получили часть запроса по которому пользователь пришел на наш сайт.

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

Это и есть принцип работы фронтконтроллера:

- получить запрос,
- проанализировать его,
- и передать управление на другой файл.




Паттерн MVC (Model View Controller)




Сам MVC является связкой из трех паттернов: модель, вид и контроллер.

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


M - Model - под моделью обычно подразумевается та часть программы, которая работает с данными; часто говорят, что модель реализует бизнес-логику.

На практике модель часто реализуется как класс, у которого есть методы для работы с определенным нобором данных, например - с записями в таблице базы данных (запросы к базе данных, возвращение ответов из базы данных).


При этом сама модель не имеет никакого отношения к тому, как будут выглядеть данные на странице - будет ли это нумерованный список, таблица или что-то другое.

Модель выполняет манипуляции над данными, и все.


V - View - вид (также используют слово - представление).

Представление отвечает за отображение информации, то-есть за ее визуализацию.

На вход представление получает необходимую информацию, например, массив с данными и реализует ее отображение необходимым образом. Например, отображение товаров в интернет-магазине - списком (первый вариант) или плиткой (второй вариант). При этом данные, которые поступают в наш вид, абсолютно одинаковые.

Отличается лишь то, как мы их показываем пользователю.


C - Controller - обеспечивает связь между пользователем и системой.

Он обрабатывает запрос пользователя,

на основе информации из запроса получает данные из модели,

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

После этого пользователь получает необходимую страницу.


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

Цепочка 1 - отвечает за работу раздела новости: NewsController(Контроллер)- News(Модель)- view.php(Представление),

Цепочка 2 - отвечает за работу раздела товара: ProductController(Контроллер)- Product(Модель)- list.php(Представление).




Front Controller + MVC




Классическая схема применения паттерна MVC и Front Controller.


MVC-1-2



- Пользователь послал определенный запрос.

- Этот запрос будет переадресован на наш фронтконтроллер.

- Он является единой точкой входа, и он один на весь сайт.

Здесь мы проводим общие настройки, например, соединение с базой данных.

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

Роутер определит: какой именно контроллер должен обработать запрос. После этого фронтконтроллер передает управление на нужный контроллер, например, на NewsController.

- Этот контроллер из запроса получит информацию о том, какие новости хочет пользователь,

- далее обратится к модели за нужными данными.

- После получения данных, контроллер использует представления для нужной визиулизации этих данных.

- После этих действий будет отправлен ответ пользователю, то-есть нужная ему страница.




Файловая структура




Файловая структура (FRONT CONTROLLER и ROUTER ) сайта test2:


MVC-1-3



В корне сайта лежит файл index.php - это наш фронтконтроллер, на который перенаправляются все запросы.

Контроллеры хранятся в папке controllers и имеют названия, которые заканчиваются словом Controller: NewsController, ProductController, ArticleController.

Модели содержатся в папке models и имеют названия, которые соответствуют их сути: News, Product, Article.

Представления находятся в папке views.


Логично, например, что раздел "новости" может содержать разные страницы, но все они относятся к новостям. Например, список новостей, страница для просмотра конкретной новости, архив новостей и др. Следовательно, один и тот же контроллер (NewsController) может иметь разные представления для этих страниц: index.php - для списка новостей, view.php - для просмотра одной новости, archive.php - список архивных новостей.

Для избежания путаницы эти представления мы будем хранить в одной папке - news.

Точно также поступим и для других представлений.


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

Данный способ не является единственно верным. Существует множество подходов к построению Web-сайтов.

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





Наверх Наверх