Архитектура
ADP следует строгой многослойной архитектуре, где каждый слой имеет чёткие обязанности, а зависимости идут в одном направлении.
Слои
1. Kernel (Ядро)
Основной движок. Независим от фреймворков — зависит только от PSR-интерфейсов и общих PHP-библиотек. Управляет:
- Debugger — Жизненный цикл (старт, сбор, сброс)
- Collectors — Сбор данных через CollectorInterface
AppDevPanel\Kernel\Collector\CollectorInterfaceDebug data collector responsibility is to collect data during application lifecycle. - Storage — Сохранение данных отладки (JSON-файлы по умолчанию) через StorageInterface
AppDevPanel\Kernel\Storage\StorageInterfaceDebug data storage responsibility is to store debug data from collectors added - Proxies — Прозрачный перехват PSR-интерфейсов
2. API
HTTP-слой на PSR-7/15. Предоставляет:
- REST-эндпоинты — Получение записей отладки, данных коллекторов
- SSE — Уведомления в реальном времени о новых записях
- Inspector — Эндпоинты инспекции (конфигурация, маршруты, схема БД и др.)
- MCP — Интеграция с AI-ассистентами через Model Context Protocol
- Ingestion — Приём отладочных данных от внешних (не-PHP) приложений
3. Адаптеры
Мосты к фреймворкам. Каждый адаптер:
- Регистрирует прокси-сервисы в DI-контейнере фреймворка
- Связывает события жизненного цикла фреймворка с Debugger
AppDevPanel\Kernel\DebuggerClass Debugger.::startup()/::shutdown() - Настраивает коллекторы и хранилище с учётом особенностей фреймворка
- Регистрирует API-маршруты (
/debug/api/*,/inspect/api/*) - Отдаёт фронтенд панели отладки по маршруту
/debug - Реализует провайдеры инспектора для фреймворка (конфигурация, маршруты, схема БД)
4. Frontend
React 19 SPA:
- Дизайн-система Material-UI 5
- Redux Toolkit для управления состоянием
- Модульная система (Debug, Inspector, LLM, MCP, OpenAPI, Frames)
Граф зависимостей
┌────────────────────────────────────────────────────────┐
│ Направление зависимостей │
│ │
│ Adapter ──▶ API ──▶ Kernel │
│ │ ▲ │
│ └───────────────────┘ │
│ │
│ Cli ──▶ API ──▶ Kernel │
│ │
│ Frontend ──▶ API (только через HTTP) │
└────────────────────────────────────────────────────────┘- Kernel ни от чего не зависит (только PSR-интерфейсы)
- API зависит только от Kernel
- Cli зависит от Kernel и API
- Adapter зависит от Kernel, API и целевого фреймворка
- Frontend общается через HTTP — нет PHP-зависимостей
Правила зависимостей
Основной принцип: общие модули никогда не должны зависеть от кода, специфичного для фреймворка.
| Модуль | Может зависеть от | Не может зависеть от |
|---|---|---|
| Kernel | Только PSR-интерфейсы | API, Cli, Adapter, любой фреймворк |
| API | Kernel, PSR-интерфейсы | Adapter, любой фреймворк |
| Cli | Kernel, API, Symfony Console | Adapter, любой фреймворк |
| Adapter | Kernel, API, Cli, пакеты фреймворка | Другие адаптеры |
| Frontend | Ничего (только HTTP) | Любой PHP-пакет |
WARNING
Адаптеры не должны зависеть от других адаптеров. Каждый адаптер — независимый мост между Kernel и конкретным фреймворком.
Абстракции
Хранилище и сериализация остаются за интерфейсами для обеспечения подключаемости:
Поток данных
- Приложение запускается с установленным адаптером
- Адаптер регистрирует прокси, перехватывающие PSR-интерфейсы
- Прокси передают данные коллекторам
- По завершении запроса Debugger сбрасывает данные коллекторов в хранилище
- API отдаёт сохранённые данные; SSE уведомляет фронтенд
- Фронтенд рендерит данные
См. Поток данных для полного описания жизненного цикла.
Модульная система фронтенда
Фронтенд использует модульную систему, где каждый модуль реализует ModuleInterface:
interface ModuleInterface {
routes: RouteObject[];
reducers: Record<string, Reducer>;
middlewares: Middleware[];
standalone: boolean;
}Текущие модули: Debug, Inspector, LLM, MCP, OpenAPI, Frames.
Создание нового адаптера
При создании адаптера для нового фреймворка:
- Создайте
libs/Adapter/<FrameworkName>/ - Адаптер должен зависеть от app-dev-panel/kernel
app-dev-panel/kernelView on Packagist - Адаптер может зависеть от app-dev-panel/api
app-dev-panel/apiView on Packagist(для маршрутов и инспектора)
- Адаптер может зависеть от app-dev-panel/cli
app-dev-panel/cliView on Packagist(для CLI-команд)
- Адаптер не должен зависеть от других адаптеров
- Адаптер не должен модифицировать код Kernel или API — только подключаться через конфигурацию
Обязанности адаптера
Эталонные реализации
| Адаптер | Фреймворк | Паттерн |
|---|---|---|
| Symfony | Symfony 6.4–8.x | Bundle + Extension + CompilerPass |
| Yii2 | Yii 2 | Module + BootstrapInterface |
| Yii 3 | Yii 3 | Config plugin + ServiceProvider |
| Laravel | Laravel 11.x–12.x | ServiceProvider (register + boot) |
Минимальный чеклист
composer.jsonс зависимостями app-dev-panel/kernelapp-dev-panel/kernelView on Packagist+ app-dev-panel/api
app-dev-panel/apiView on Packagist- Маппинг событий жизненного цикла → Debugger
AppDevPanel\Kernel\DebuggerClass Debugger.::startup()/::shutdown() - Регистрация PSR-прокси Kernel как декораторов сервисов (логгер, события, HTTP-клиент)
- Подключение FileStorage
AppDevPanel\Kernel\Storage\FileStorageClass FileStorage. с путём, подходящим для фреймворка - Регистрация маршрутов API-контроллеров
- Создание playground-приложения для тестирования и демо