Маршрутизация и архитектура

Определения

URL - обозначает Uniform Resource Locator. URL это адрес в сети Интернет, который выдан уникальному ресурсу, сайту или его странице.

MVC - Model-View-Controller (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения, и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо

Запрос - Отправка данных по http/https протоколу, на определенный URL сайта, с целью получения результата в виде ответа, это может быть страница, изображение или любой другой контент. В запросе могут содержаться переменные, которые в свою очередь передаются методом GET или POST.

Ядро(Core) - Центральная и ключевая часть всей системы, которая отвечает за связность всех компонентов системы, их взаимодействие и слаженную работу(своеобразны дирижер, менеджер). Ядро системы запускается при каждом запросе к ней, при выполнении любой операции. В ядре принимаются решения какой драйвер для базы данных загрузить, подключаются функции управления маршрутами и делегирования задач, принимается решение о загрузки тех или иных классов компонентов и шаблонов системы. Осуществляется ряд системных проверок.

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

Модель(Model) - Отдельная часть системы, которая выбирается и загружается в зависимости от указанного маршрута(URL, назначения компонента и т.д.). У каждого раздела сайта своя модель или даже несколько, в зависимости от наличия подразделов(секций) и т.д. Модель отвечает за работу с базой данных(а именно операции извлечения, вставки и удаление данных), а также за работу с входящими данными от пользователей.

Представление(View) - Отдельная часть системы, представляющая собой HTML шаблон, которые выводится в зависимости от указанного маршрута(URL, назначения компонента и т.д.). У каждого раздела свой HTML шаблон, также внутри раздела у секцию тоже могут быть свои шаблоны.

Глобальный шаблон(Theme) - Несмотря на то, что у каждого раздела(компонента), есть свой шаблон, сайм сайт строится на основе одного глобального HTML шаблона, который также включает в себя CSS, JS, шрифты и изображения. Именно в этот глобальный шаблон, в область вывода контента раздела, вставляется и выводится шаблон отдельно взятого компонента(View).

Компонент(Component) - Отдельная часть системы, раздел. Который включает в себя секции, модели и предоставления для них. То есть, компонент это обобщение раздела целиком. Например папка /theme/component/contacts/ это компонент, а файлы в этой папке .model.php - модель, и default.php - представление.

Секция(Section) - Часть компонента. Компонент может состоять из множества секций, каждая из которых может иметь только одну свою модель и одно представление. Таким образом папка /theme/component/contacts/ это компонент, файлы в этой папке .model.php и default.php файлы одной секции, а файлы .model.ajax.php и ajax.php другой секции. Запросы к этим двум секциям в рамках одного компонента осуществляется по разным URL, например /index.php?route=contacts и /index.php?route=contacts/ajax

Маршрутизация

Часто познание любого скрипта CMS или фреймворка, начинается с маршрутизации, это позволяет быстро понять, какие файлы, папки, скрипты и классы задействуются при запросе определенного URL(при переходе на определенную страницу или раздел).

Архитектура MVC - Model, View, Controller.

Логическая структура маршрута загрузки и включение классов выглядит так:

Запрос URL(GET/POST) -> Ядро -> Контроллер -> Модель -> Представление.

Все запросы переадресуются на единую точку входа, скрипт index.php, который отвечает за загрузку Ядра, всех нужных для работы классов и файла конфигурации (config.php).

Пример 1

Давайте рассмотрим маршрутизацию на примере следующего URL(вызов страницы контактов):

/index.php?route=contacts

или (если включен режим ЧПУ):

/contacts/

Данный запрос URL загружает Ядро системы(Core),и контроллер (Controller), которые в свою очередь разбирают URL и загружают компонент под названием “contacts”, компонент размещен в папке:

/theme/component/contacts/

Основной файл компонента, т.е. скрипт(Model) который будет загружен по умолчанию:

/theme/component/contacts/.model.php (данный скрипт в свою очередь содержит PHP Class: Component_Contacts, который будет обработан системой).

Вместе с моделью(Model), будет загружен HTML шаблон отображения(View), расположенный

/theme/component/contacts/default.php (т.к. не указана секция компонента, model.php и default.php это секция компонента по умолчанию, Default).

Пример 2

Рассмотрим маршрутизацию на примере следующего URL(вызов страницы пополнения баланса аккаунта):

/index.php?route=account/payments

или (если включен режим ЧПУ):

/account/payments/

Данный запрос URL загружает Ядро системы(Core),и контроллер (Controller), которые в свою очередь разбирают URL и загружают компонент под названием “account”, далее внутри компонента он ищет секцию “payments”(за что отвечает отдельный класс и файл скрипта) компонент размещен в папке:

/theme/component/account/

Файл компонента, т.е. скрипт(Model) который будет загружен, в отличии от Примера 1:

/theme/component/account/.model.payments.php (данный скрипт в свою очередь содержит PHP Class: Section_Payments, который будет обработан системой).

Также обратите внимание на название класса модели, в отличии от секции по умолчанию(в главной секции компонента), где этот класс называется Component_Account(начинается с Component), в остальных секциях класс моделей называется Section_Payments(начинается с Section_).

Вместе с моделью(Model), будет загружен HTML шаблон отображения(View), расположенный

/theme/component/contacts/payments.php (так как в URL запросе явно указана секция компонента Payments, именно она и будет загружена, вместо Default).

Пример 3

Рассмотрим маршрутизацию на примере предыдущего URL(вызов страницы пополнения баланса аккаунта) но с добавлением пользовательских переменных GET в запрос:

/index.php?route=account/payments&page=1&value=2

или (если включен режим ЧПУ):

/account/payments/?page=1&value=2

В этом примере будет загружена секция компонента аналогично Примеру 2, но при этом в неё будет переданы значения переменных GET запрос, page и value. Такая передача параметров используется для постраничной навигации или других операцию внутри компонента.