Skip to content

Архитектура

ADP следует строгой многослойной архитектуре, где каждый слой имеет чёткие обязанности, а зависимости идут в одном направлении.

Слои

1. Kernel (Ядро)

Основной движок. Независим от фреймворков — зависит только от PSR-интерфейсов и общих PHP-библиотек. Управляет:

2. API

HTTP-слой на PSR-7/15. Предоставляет:

  • REST-эндпоинты — Получение записей отладки, данных коллекторов
  • SSE — Уведомления в реальном времени о новых записях
  • Inspector — Эндпоинты инспекции (конфигурация, маршруты, схема БД и др.)
  • MCP — Интеграция с AI-ассистентами через Model Context Protocol
  • Ingestion — Приём отладочных данных от внешних (не-PHP) приложений

3. Адаптеры

Мосты к фреймворкам. Каждый адаптер:

  • Регистрирует прокси-сервисы в DI-контейнере фреймворка
  • Связывает события жизненного цикла фреймворка с DebuggerAppDevPanel\Kernel\DebuggerClass Debugger.final Kernel · class::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, любой фреймворк
APIKernel, PSR-интерфейсыAdapter, любой фреймворк
CliKernel, API, Symfony ConsoleAdapter, любой фреймворк
AdapterKernel, API, Cli, пакеты фреймворкаДругие адаптеры
FrontendНичего (только HTTP)Любой PHP-пакет

WARNING

Адаптеры не должны зависеть от других адаптеров. Каждый адаптер — независимый мост между Kernel и конкретным фреймворком.

Абстракции

Хранилище и сериализация остаются за интерфейсами для обеспечения подключаемости:

АспектАбстракцияРеализации
Хранилище данныхStorageInterfaceAppDevPanel\Kernel\Storage\StorageInterfaceDebug data storage responsibility is to store debug data from collectors addedKernel · interfaceFileStorageAppDevPanel\Kernel\Storage\FileStorageClass FileStorage.final Kernel · class · implements StorageInterface, MemoryStorageAppDevPanel\Kernel\Storage\MemoryStorageClass MemoryStorage.final Kernel · class · implements StorageInterface
Сериализация объектовDumperAppDevPanel\Kernel\DumperClass Dumper.final Kernel · classНа основе JSON (встроенная)
Инспекция БДSchemaProviderInterfaceAppDevPanel\Api\Inspector\Database\SchemaProviderInterfaceSchema Provider contract.API · interfaceПо адаптерам: DbSchemaProviderAppDevPanel\Adapter\Yii3\Inspector\DbSchemaProviderProvides Db Schema data.Adapter/Yii3 · class · implements SchemaProviderInterface, DoctrineSchemaProviderAppDevPanel\Adapter\Symfony\Inspector\DoctrineSchemaProviderProvides database schema inspection via Doctrine DBAL.final Adapter/Symfony · class · implements SchemaProviderInterface, LaravelSchemaProviderAppDevPanel\Adapter\Laravel\Inspector\LaravelSchemaProviderProvides database schema inspection via Laravel's Illuminate\Database\Connection.final Adapter/Laravel · class · implements SchemaProviderInterface, NullSchemaProviderAppDevPanel\Adapter\Yii2\Inspector\NullSchemaProviderNo-op schema provider for when no database is configured. Returns empty results instead of causing a 500 error.final Adapter/Yii2 · class · implements SchemaProviderInterface, CycleSchemaProviderAppDevPanel\Adapter\Cycle\Inspector\CycleSchemaProviderProvides Cycle Schema data.Adapter/Cycle · class · implements SchemaProviderInterface

Поток данных

  1. Приложение запускается с установленным адаптером
  2. Адаптер регистрирует прокси, перехватывающие PSR-интерфейсы
  3. Прокси передают данные коллекторам
  4. По завершении запроса Debugger сбрасывает данные коллекторов в хранилище
  5. API отдаёт сохранённые данные; SSE уведомляет фронтенд
  6. Фронтенд рендерит данные

См. Поток данных для полного описания жизненного цикла.

Модульная система фронтенда

Фронтенд использует модульную систему, где каждый модуль реализует ModuleInterface:

typescript
interface ModuleInterface {
    routes: RouteObject[];
    reducers: Record<string, Reducer>;
    middlewares: Middleware[];
    standalone: boolean;
}

Текущие модули: Debug, Inspector, LLM, MCP, OpenAPI, Frames.

Создание нового адаптера

При создании адаптера для нового фреймворка:

  1. Создайте libs/Adapter/<FrameworkName>/
  2. Адаптер должен зависеть от app-dev-panel/kernelversiondownloadsapp-dev-panel/kernelView on Packagistversiondownloadslicensephp version
  3. Адаптер может зависеть от app-dev-panel/apiversiondownloadsapp-dev-panel/apiView on Packagistversiondownloadslicensephp version (для маршрутов и инспектора)
  4. Адаптер может зависеть от app-dev-panel/cliversiondownloadsapp-dev-panel/cliView on Packagistversiondownloadslicensephp version (для CLI-команд)
  5. Адаптер не должен зависеть от других адаптеров
  6. Адаптер не должен модифицировать код Kernel или API — только подключаться через конфигурацию

Обязанности адаптера

ОбязанностьОписание
Маппинг жизненного циклаСвязать события фреймворка → DebuggerAppDevPanel\Kernel\DebuggerClass Debugger.final Kernel · class::startup() / ::shutdown()
Подключение проксиЗарегистрировать PSR-прокси Kernel как декораторы сервисов в DI фреймворка
Фреймворк-специфичные проксиСоздать прокси для не-PSR API (напр., SymfonyEventDispatcherProxyAppDevPanel\Adapter\Symfony\Proxy\SymfonyEventDispatcherProxyWraps Symfony's event dispatcher to intercept dispatched events.final Adapter/Symfony · class · implements EventDispatcherInterface)
Конфигурация коллекторовНастроить активные коллекторы и передать параметры фреймворка
Настройка хранилищаПодключить StorageInterfaceAppDevPanel\Kernel\Storage\StorageInterfaceDebug data storage responsibility is to store debug data from collectors addedKernel · interface с путями фреймворка
Регистрация маршрутовЗарегистрировать API-маршруты для /debug/api/*, /inspect/api/* и отдавать фронтенд по /debug
Провайдеры инспектораРеализовать SchemaProviderInterfaceAppDevPanel\Api\Inspector\Database\SchemaProviderInterfaceSchema Provider contract.API · interface, ElasticsearchProviderInterfaceAppDevPanel\Api\Inspector\Elasticsearch\ElasticsearchProviderInterfaceElasticsearch Provider contract.API · interface и др.

Эталонные реализации

АдаптерФреймворкПаттерн
SymfonySymfony 6.4–8.xBundle + Extension + CompilerPass
Yii2Yii 2Module + BootstrapInterface
Yii 3Yii 3Config plugin + ServiceProvider
LaravelLaravel 11.x–12.xServiceProvider (register + boot)

Минимальный чеклист

  1. composer.json с зависимостями app-dev-panel/kernelversiondownloadsapp-dev-panel/kernelView on Packagistversiondownloadslicensephp version + app-dev-panel/apiversiondownloadsapp-dev-panel/apiView on Packagistversiondownloadslicensephp version
  2. Маппинг событий жизненного цикла → DebuggerAppDevPanel\Kernel\DebuggerClass Debugger.final Kernel · class::startup() / ::shutdown()
  3. Регистрация PSR-прокси Kernel как декораторов сервисов (логгер, события, HTTP-клиент)
  4. Подключение FileStorageAppDevPanel\Kernel\Storage\FileStorageClass FileStorage.final Kernel · class · implements StorageInterface с путём, подходящим для фреймворка
  5. Регистрация маршрутов API-контроллеров
  6. Создание playground-приложения для тестирования и демо

Выпущено под лицензией MIT.