Кратко рассмотрим общий принцип действия 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
    • Регистрация логгера для приложения
  • Выполнение приложения: $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 с ключевыми действиями процесса выполнения и вызовами событий.

Схема цикла выполнения веб-приложения публичной части Joomla

Оригинал статьи: https://jpath.ru/docs/basics/joomla-internals/obshchaya-informatsiya-o-printsipe-dejstviya-joomla#dispetcherizatsiya-dispatching