🔄 Жизненный цикл запроса
Каждый запрос начинается в index.php
- Определение констант (
ROOT,APP,CONFIG) - Загрузка вспомогательных функций
- Проверка установки (существует ли
config/database.php?) - Если не установлен → перенаправление на
/install/ - Загрузка конфигурации БД + хелперов, запуск сессии
- Вычисление пути запроса (обработка установки в подкаталогах)
- Диспетчеризация через
app/router.php
Маршрутизатор
app/router.php — это плоская таблица диспетчеризации с сопоставлением шаблонов. Шаблоны компилируются в регулярные выражения и сопоставляются с путём запроса. Группы захвата передаются как аргументы метода контроллера.
Аутентификация
Большинство контроллеров вызывают require_auth(), который перенаправляет неаутентифицированных пользователей на /login. Эндпоинты только для администраторов используют require_admin(), возвращающий JSON 403.
Сессии заполняются при входе значениями user_id, workspace_id, role и пересоздаются для предотвращения фиксации сессии.
Подключение к базе данных
PDO-подключение создаётся лениво при первом запросе (синглтон). Используется ERRMODE_EXCEPTION и настоящие подготовленные выражения (EMULATE_PREPARES = false).
Форматы ответов
- HTML-страницы: Контроллер устанавливает
$pageи подключаетlayout.php - JSON API:
json_response()устанавливает Content-Type, выводит JSON, завершает выполнение - Поток SSE: Постоянный цикл с
text/event-stream, ping каждые 2 с, завершение через 55 с