EE_FrameWork — это PHP-фреймворк с MVC-ядром, встроенным административным контуром, гибкой контентной моделью и upgrade-safe слоем проектной кастомизации через custom/.
Проект ориентирован на разработку не шаблонных сайтов, а систем, где важны:
- управляемая архитектура без избыточной магии;
- быстрый старт для нового разработчика;
- встроенная админ-панель;
- гибкая модель сущностей, свойств, категорий и страниц;
- расширяемость без правок ядра;
- готовность к реальному production-использованию.
EE_FrameWork объединяет в одном репозитории:
- HTTP entrypoint и MVC-поток обработки запроса;
- Router, View, Cache, Hook, Auth и logging-слой;
- административный модуль для управления контентом и системой;
- проектный слой
custom/, который не должен теряться при обновлении ядра; - встроенные механизмы для поиска, фильтрации, lifecycle-синхронизации, агентного cron и работы со свойствами сущностей.
Это не микрофреймворк и не “голая CMS-тема”. Это основа для развития собственных проектов и сложных контентных систем.
Поток запроса остаётся прозрачным:
URL -> Router -> Controller -> Model -> View -> Layout -> Response
Это упрощает:
- отладку;
- онбординг новых разработчиков;
- развитие проекта без скрытых магических слоёв.
В проект уже входит admin-модуль, который покрывает:
- пользователей и роли;
- свойства, типы свойств и наборы;
- типы категорий, категории и страницы;
- импорт;
- логи;
- системные инструменты;
- health/operational сценарии.
Дополнительно в ядре предусмотрены role-based auth hooks, которые позволяют проекту управлять разделением контуров /admin, /manager и /user через custom/hooks.php, не зашивая project policy в core.
EE_FrameWork поддерживает связку:
property types -> properties -> sets -> category types -> categories -> pages
Это позволяет строить сложные модели данных без жёсткой привязки к одной предметной области.
В property layer поддерживаются как простые поля, так и структурные значения вроде date-range и вложенных repeatable-group.
В платформе есть штатная поддержка двух обязательных документов:
- Политика в отношении обработки персональных данных;
- Согласие на обработку персональных данных.
Отдельно доступен шаблон согласия на обработку персональных данных, разрешённых для распространения. Он не входит в обязательный registration gate по умолчанию и подключается проектом там, где пользователь публикует контактные данные, изображения или иные материалы.
Для пользователя сохраняется не только сам факт принятия, но и metadata:
- дата и время;
- IP;
- user-agent;
- версия документа.
Это работает и в обычной регистрации, и в обязательном consent-gate для существующих аккаунтов.
Проектный код не должен жить в ядре.
Для этого есть:
app/— маршруты, контроллеры, views, модульныеjs/css;custom/— project-specific hooks, bootstrap и сервисные классы, которые не нужно терять при обновлении платформы.
В ядре уже предусмотрены:
- кэширование;
- логирование;
- аутентификация и доступ;
- routing cache и HTML cache;
- агентный cron и очереди фоновой обработки;
- резервное копирование через очередь и offsite targets SFTP/FTP;
- lifecycle jobs;
- операции обслуживания системы;
- поисковая и фильтрационная подсистемы.
EE_FrameWork особенно хорошо подходит для:
- кастомных CMS и контентных платформ;
- каталогов и экспертных систем;
- информационных проектов со сложной структурой сущностей;
- административных back-office систем;
- платформ, которые должны эволюционировать в сторону маркетплейса, кабинетов, интеграций и тяжёлой бизнес-логики.
- PHP
8.0+ - MySQL/MariaDB
- PHP-расширения:
mysqlimbstringjsonsessionfileinfoopensslcurl
- Redis опционален, если нужен Redis backend для кэша
Веб-процесс должен иметь доступ на запись в:
cache/logs/uploads/
Установщик подготавливает обязательные runtime-директории:
cache/logs/logs/errors/uploads/uploads/tmp/uploads/tmp/backups/uploads/files/uploads/images/uploads/images/avatars/
Практически лучше использовать:
- общего владельца или общую группу для CLI и web;
- SGID/наследование группы для
logs/иcache/, чтобы фоновые задачи и веб не конфликтовали по правам.
Важно:
- после клона разработчик не должен править ядро;
inc/configuration.phpсоздаётся установщиком и не хранится в публичном репозитории;- для репозитория используется
inc/configuration.sample.php; - если runtime-папка отсутствует или недоступна для записи, установка завершится явной ошибкой.
Первичная установка выполняется через web-мастер:
/install/
Или через CLI:
php inc/cli.php install:run \
--site-host=example.com \
--site-author="Site owner" \
--site-email=mail@example.com \
--admin-email=mail@example.com \
--db-name=project_db \
--db-user=project_user \
--db-pass=secretУстановщик:
- создаёт
inc/configuration.phpизinc/configuration.sample.php; - проверяет подключение к базе данных;
- при необходимости создаёт БД и пользователя;
- разворачивает таблицы и стартовые данные;
- создаёт bootstrap-пользователей;
- проверяет состояние системы;
- блокирует повторный запуск через web-интерфейс.
Настройки ENV_PROTO_LANGUAGE, ENV_CONTENT_LANGS, ENV_BOOTSTRAP533_CDN и ENV_FONT_AWESOME_CDN задаются в установщике как часть конфигурации проекта.
Для первого локального smoke-теста достаточно:
php -S 127.0.0.1:8080 -t .После этого можно проверить:
http://127.0.0.1:8080/install/php inc/cli.php help
Важно:
- встроенный сервер удобен для запуска установщика;
- для полноценных красивых URL нужен Apache/Nginx с rewrite-правилами.
На верхнем уровне запрос проходит так:
index.phpпроверяет окружение;- запрос
/install/передаётся установщику до обычного runtime bootstrap; - для установленного проекта подключается
inc/bootstrap.php; inc/bootstrap.phpзагружает config изinc/configuration.php, вычисляет runtime-константы и подключаетinc/startup.php;- вызывается runtime bootstrap;
- поднимаются core-сервисы и
custom/; Routerопределяет контроллер и action;- управление передаётся контроллеру.
Важно:
inc/configuration.phpпредназначен только для настроек;- runtime-хелперы, вычисляемые значения, redirect-политика и ранний bootstrap живут в
inc/bootstrap.php.
Схема БД разворачивается только явным запуском установщика.
Что это значит на практике:
- web-мастер
/install/и CLI-командаinstall:runвыполняют один и тот же сценарий установки; - таблицы и стартовые данные создаются только во время установки;
- обычные web/CLI-запросы не создают таблицы автоматически;
- если проект не установлен, runtime сообщает об ошибке установки вместо автоматического развёртывания схемы.
Источник развёртывания один: установщик проекта.
В GitHub-репозиторий должны попадать:
- ядро фреймворка;
custom/как project layer;- документация;
- hand-crafted артефакты проекта, если они нужны как часть исходников.
В репозиторий не должны попадать:
cache/logs/uploads/- экспортные ZIP-пакеты
- боевой
inc/configuration.php
В репозиторий должен попадать inc/configuration.sample.php: это шаблон, из которого установщик создаёт рабочий конфиг конкретного сайта.
.gitignore уже настроен под этот сценарий.
Production-развёртывание EE_FrameWork строится вокруг front controller:
- публичная PHP-точка входа для HTTP - только
index.php; error.phpиспользуется как внутренний error endpoint;- PHP во внутренних директориях не должен исполняться напрямую через HTTP;
ENV_DEBUG=false,display_errors=0;- в webroot не должно быть
phpinfo(), экспортов, SQL dump, тест-планов и operational notes; inc/,classes/,layouts/,config/,custom/,app/cron/,data/,exports/,testplan/,logs/иcache/закрываются на уровне веб-сервера;- security headers задаются в Apache/Nginx;
- admin API keys выдаются только доверенным интеграциям;
- публичный rich text выводится только после allowlist sanitization.
Подробный чеклист hardened-развёртывания лежит в Security и production hardening.
Продуктовая документация лежит в custom/docs/.
Базовые разделы уже включают:
- архитектуру;
- routing;
- content model;
- импорт;
- cron-агенты;
- backup;
- debug/health;
- security и production hardening.
README.md должен оставаться короткой входной точкой для разработчика, а подробные сценарии поддержки и эксплуатации — жить в custom/docs/.
Быстрый способ добавить собственный маршрут — новый модуль в app/.
Пример структуры:
app/hello/
├─ index.php
├─ views/
│ └─ v_index.php
├─ js/
└─ css/
Пример контроллера:
<?php
use classes\system\ControllerBase;
class ControllerHello extends ControllerBase {
public function index($params = []): void {
$this->view->set('message', 'Hello from EE_FrameWork');
$this->html = $this->view->read('v_index');
$this->parameters_layout['layout_content'] = $this->html;
$this->showLayout($this->parameters_layout);
}
}Пример шаблона:
<?php if (!defined('ENV_SITE')) exit(header('Location: /', true, 301)); ?>
<h1><?= htmlspecialchars((string) ($message ?? ''), ENT_QUOTES) ?></h1>После этого маршрут будет доступен по:
/hello
/index.php HTTP entrypoint
/inc/ bootstrap, шаблон конфигурации, core hooks, language files
/inc/installer/ web/service-layer установщика
/inc/cli_commands/ CLI-команды установки, diagnostics, ops и cron
/classes/system/ ядро платформы
/classes/helpers/ helper- и service-классы
/app/ модули, контроллеры, views, js/css, модели
/app/docs/ docs-модуль как обычный маршрут
/custom/ upgrade-safe слой проектной логики
/custom/docs/ исходники пользовательской документации
/layouts/ layout-шаблоны
/assets/ фронтовые и редакторские ассеты
/uploads/ пользовательские файлы
/app/cron/ только scheduler-wrapper'ы для реальных cron-задач
/inc/cli.php единый CLI entrypoint для install, cron, diagnostics и ops
/error.php штатная обработка ошибок
В app/:
- маршруты;
- контроллеры;
- views;
- модульные
js/css; - модели, относящиеся к конкретному модулю.
В custom/:
- проектные hooks;
- custom bootstrap;
- сервисные классы проекта;
- интеграционная логика, которую нельзя терять при обновлении ядра.
В ядре (inc/, classes/) стоит менять код только тогда, когда вы действительно развиваете сам фреймворк, а не отдельный проект на нём.
Отвечает за преобразование URL в:
- модуль;
- контроллер;
- action;
- аргументы.
Поддерживает route cache и debug-диагностику.
Общий базовый слой контроллеров:
- работа с
View; - layout rendering;
- доступ и redirect-сценарии;
- интеграция с пользователем, языком и общими параметрами страницы.
Модели инкапсулируют:
- SQL;
- валидацию данных;
- lifecycle-операции;
- транзакционную логику;
OperationResultдля мутаций.
Отвечают за:
- передачу данных в шаблон;
- рендер view;
- сборку layout;
- частичный кэш блоков;
- безопасный вывод данных.
Система хуков позволяет расширять поведение без правок core hooks:
Hook::add(...)Hook::run(...)Hook::filter(...)Hook::until(...)
Проектные callback-ы регистрируются через custom/hooks.php.
В платформе есть отдельный auth-слой с:
- пользователями;
- ролями;
- credential/session/challenge-моделью;
- проверкой доступа на уровне контроллеров и административных маршрутов.
Общий cache-слой поддерживает:
- file backend;
- Redis backend;
- route cache;
- HTML cache;
- block cache;
- namespace/version изоляцию.
Система логирования ориентирована на production-эксплуатацию:
- уровни логов;
- каналы;
request_id;- контекст запроса;
- ротация;
- удобный просмотр логов в админке.
Для ручного запуска служебных команд и диагностики используется единый entrypoint:
php inc/cli.php helpЧерез него запускаются:
- установка проекта;
- scheduler-команды;
- diagnostics-команды;
- operational health-check сценарии.
Основные команды установки:
php inc/cli.php install:status
php inc/cli.php install:run --helpКаталог app/cron/ оставлен только для реальных scheduler-wrapper файлов, которые можно ставить в cron напрямую.
В production используется один минутный entrypoint:
php app/cron/run.phpОн не содержит бизнес-логики сам по себе. Вместо этого:
- расписание задач хранится в БД;
- handler-код живёт в проекте;
- агентами управляет админка
/admin/cron_agents; - scheduler сам учитывает блокировки, лимиты нагрузки и stale recovery.
Обязательные системные агенты для работы платформы создаются установщиком при развёртывании.
- Поток запроса легко читать в коде.
- Проектный слой отделён от ядра.
- Админка, lifecycle, поиск и фильтры уже встроены.
- Большая часть системы не требует “догадок” о том, где лежит логика.
- Есть понятные точки расширения:
app/для модулей и маршрутовcustom/для project-specific поведенияhooksдля точечного расширения
Подробная документация лежит в custom/docs/ и доступна как в репозитории, так и через docs-модуль.
- README / карта документации
- Быстрый старт
- Установщик проекта
- Архитектура
- Маршрутизация
- Модели
- Контентная модель
- Views и Layouts
- Hooks и custom-слой
- Импорт типов, свойств и наборов
- Auth и доступ
- Cron-агенты и scheduler
- Кэширование
- Отладка
- Security и production hardening
- Content API v1
- API Reference
Если вы только знакомитесь с проектом, лучше идти именно в этом порядке.
- Не кладите проектную логику в
inc/hooks.phpиinc/startup.php. - Используйте
custom/как upgrade-safe слой. - Не смешивайте SQL, HTML и сценарную логику в одном месте.
- Для мутаций моделей придерживайтесь
OperationResult. - Используйте hooks для расширения, а не как замену нормальной архитектуре.
- Не считайте кэш источником истины.
- Держите
logs/,cache/иuploads/в корректных правах ещё до первых тестов.
EE_FrameWork развивается как реальная production-oriented платформа, а не как демонстрационный skeleton.
В репозитории уже есть:
- административный модуль;
- пользовательская документация;
- кэширование;
- логирование;
- auth и доступ;
- docs-модуль;
- import и lifecycle-контур;
- поисковая и фильтрационная подсистемы;
- custom-layer для upgrade-safe развития проекта.
Это хорошая база для дальнейшего развития публичного фронта, project-specific бизнес-логики и интеграций.
См. LICENSE.md.