Общая информация о принципе действия Joomla
Кратко рассмотрим общий принцип действия Joomla, начиная с загрузки файла index.php и заканчивая отображением страницы в обозревателе.
Оглавление
Принцип действия Joomla основан на выполнении различных типов приложений. Эти типы разделены на две основные части: веб-приложения и приложение командной строки.
Типы приложений
Каждый тип приложения отвечает за работу определенной части CMS и имеет свой класс. Классы расположены в libraries/src/Application.
Приложение административной части
Веб-приложение, предназначено для выполнения административной части веб-сайта. Является частью CMS приложения. Точка входа: /administrator/index.php.
Приложение публичной части
Веб-приложение, предназначено для выполнения публичной части веб-сайта. Является частью CMS приложения. Точка входа: /index.php.
Приложение командной строки
CLI приложение, предназначено для выполнения расширений из командной строки. Точка входа: /cli.
Командная строка (или консоль) предназначена для выполнения текстовых команд посредством терминала (например, программы Putty на Windows или ssh на Linux). Чаще всего она не доступна на традиционных shared хостингах.
API приложение
Доступно в Joomla 4. Веб-приложение для поддержки веб-сервиса REST. Точка входа: /api/index.php.
Daemon приложение
Класс для для превращения CLI приложения в службу (демона).
Пример порядка выполнения веб-приложения
Joomla по сути ничем не отличается от типичных CMS, поэтому загрузка веб-приложения начинается с загрузки файла index.php, либо из корня установки Joomla для выполнения публичной части веб-сайта, либо из папки /administrator для выполнения административной части веб-сайта. В целом их цикл выполнения не отличается, есть только небольшие отличия в реализации этапов. Ниже мы рассмотрим порядок выполнения публичной части веб-сайта Joomla 3.
Подготовка к выполнению приложения
Начальный этап - это подготовка к выполнению приложения. На этом этапе происходят различные проверки и подключение необходимых классов.
- Проверка минимальной версии PHP и среды выполнения
- Сохранение времени старта и использования памяти
- Подключение defines.php
- Определение мест расположения файлов
- Определения констант
- Подключение framework.php
- Установка magic_quotes_runtime в значение 0
- Подключение import.legacy.php для загрузки устаревших классов
- Подключение cms.php для загрузки CMS классов
- Установка обработчика ошибок
- Проверка на стадию установки CMS
- Подключение файла конфигурации configuration.php
- Установка режима отображения ошибок
- Установка константы
JDEBUG
- Профилирование: установка времени старта и использования памяти, установка отметки afterLoad
- Регистрация приложения в фабрике через вызов
$app = JFactory::getApplication('site')
- Создание объекта CMS приложения публичной части через вызов
CMSApplication::getInstance
- Регистрация логгера для приложения
- Создание объекта CMS приложения публичной части через вызов
- Выполнение приложения:
$app->execute()
Инициализация (Initialisation)
Непосредственно выполнение приложения начинается с его инициализации.
- Вызов
SiteApplication::initialiseApp
- Первый вызов
\JFactory::getUser()
: инициализация объекта пользователя- Первый вызов
Factory::getSession()
: инициализация сессии
- Первый вызов
- Присвоение группы guest пользователю, если он гость
- Определение языка
- Первый вызов
- Вызов
parent::initialiseApp
- Первый вызов
\JFactory::getConfig()
: инициализация объекта конфигурации - Инициализация объекта языка и регистрация в фабрике
Factory
- Загрузка языковых файлов библиотек
- Установка редактора на основе предпочтений пользователя (если доступно)
- Импорт системных плагинов: вызов
\JPluginHelper::importPlugin('system')
- Вызов события: onAfterInitialise
- Первый вызов
- Профилирование: установка отметки afterInitialise
Маршрутизация и авторизация (Routing & Authorisation)
Второй шаг выполнения - это маршрутизация и выполнение определенных действий с пользователем.
- Вызов
SiteApplication::route
- Вызов
parent::route
- Разбор (парсинг) URI: преобразование URL в массив команд
- Обработка пункта меню типа alias. Перенаправление с кодом 301 (если необходимо).
- Сохранение массива команд в объекте переменных запроса
Input
- Импорт системных плагинов: вызов
\JPluginHelper::importPlugin('system')
- Вызов события: onAfterRoute
- Вызов
SiteApplication:authorise
- Проверка, уполномочен ли текущий пользователь просматривать этот пункт меню
- Вызов
- Профилирование: установка отметки afterRoute
- Вызов
CMSApplication::checkUserRequireReset
- Проверка, требуется ли пользователю сбросить свой пароль.
- Перенаправление на страницу сброса пароля (если необходимо).
Диспетчеризация (Dispatching)
Третий шаг выполнения - это диспетчеризация, в процессе которой происходит выполнение компонента и подготовка объекта документа для рендеринга.
- Вызов
SiteApplication::dispatch
- Определение компонента из переменной запроса
option
- Первый вызов
\JFactory::getDocument()
: инициализация объекта документа и регистрация в фабрикеFactory
- Установка мета-данных, заголовка и описания.
- Сохранение названия шаблона и его параметров в конфиге приложения
- Выполнение компонента через
ComponentHelper::renderComponent
и сохранение в компонентной части документа - Импорт системных плагинов: вызов
\JPluginHelper::importPlugin('system')
- Вызов события: onAfterDispatch
- Определение компонента из переменной запроса
- Профилирование: установка отметки afterDispatch
Рендеринг (Rendering)
Если объект документа установлен, то происходит четвертый шаг выполнения - рендеринг приложения. Здесь происходит отправка буферов документа в плейсхолдеры (специальные теги jdoc
) шаблона, получение данных из документа и их отправка в тело (body) приложения.
Вызов SiteApplication::render
- Установка файла шаблона для рендеринга
- Вызов
parent::render
- Установка опций для объекта документа
- Разбор (парсинг) документа
- Подключение файла шаблона
- Загрузка языковых файлов шаблона
- Получение содержимого файла шаблона
- Разбор файла шаблона: создание массива тегов шаблона со всеми элементами разметки
jdoc:include
(с информацией о заголовке, компоненте, модулях, сообщениях и отладке)
- Импорт системных плагинов: вызов
\JPluginHelper::importPlugin('system')
- Вызов события: onBeforeRender
- Проверка необходимости кэширования
- Рендеринг документа
- Обход массива тегов шаблона: вызов
getBuffer
документа для каждого тега- Загрузка необходимого типа рендерера: head, component, module / modules, message.
- Установка в буфер документа результата рендеринга. Вызов события onBeforeCompileHead в head рендерере.
- Замена тегов шаблона соответствующим содержимым документа
- Обход массива тегов шаблона: вызов
- Установка полученных данных рендеринга в тело (body) приложения
- Вызов события: onAfterRender
- Профилирование: установка отметки afterRender
Вывод (Response)
Завершающий, пятый этап выполнения приложения.
- Применение сжатия (если необходимо): вызов
WebApplication::compress
и вызов события onAfterCompress - Вызов
WebApplication::respond
- Установка и отправка заголовков
- Вывод тела приложения веб-клиенту (обозревателю)
- Вызов события: onAfterRespond
Схема цикла выполнения
Ниже визуализация порядка выполнения веб-приложения публичной части Joomla с ключевыми действиями процесса выполнения и вызовами событий.
Оригинал статьи: https://jpath.ru/docs/basics/joomla-internals/obshchaya-informatsiya-o-printsipe-dejstviya-joomla#dispetcherizatsiya-dispatching