6.1 KiB
ARCHITECTURE
Scope
Dokument opisuje aktualna architekture runtime projektu shopPRO:
- warstwy aplikacji i ich odpowiedzialnosci,
- przeplywy requestow (admin/front/api),
- Dependency Injection i miejsca wiringu,
- konwencje autoloadera i namespace,
- granice miedzy nowa architektura a pozostalosciami legacy.
High-level layout
Kod aplikacji jest podzielony na 4 glowne warstwy:
autoload/Domain/- logika biznesowa i dostep do danych (28 modulow)autoload/admin/- panel administracyjny (router + kontrolery + form system)autoload/front/- frontend sklepu (router + layout engine + kontrolery/widoki)autoload/api/- REST API (api.php,ApiRouter, kontrolery endpointow)
Komponenty wspoldzielone sa trzymane w autoload/Shared/.
Directory map (runtime)
autoload/
Domain/ # 28 modulow domenowych
Shared/ # Cache, Helpers, Tpl, Html, Email, Image
admin/
App.php # routing + DI factories
Controllers/ # 28 kontrolerow admin
Support/ # formularze/tabele
Validation/ # walidacja formularzy
ViewModels/ # modele widokow
front/
App.php # routing + DI factories + fallback legacy
LayoutEngine.php # silnik layoutu frontend
Controllers/ # 8 kontrolerow frontend
Views/ # 11 statycznych klas widokow
api/
ApiRouter.php # auth + endpoint dispatch
Controllers/ # 4 kontrolery API
Entry points i przeplyw
Admin (admin/index.php)
- Bootstrap (sesja, DB, autoload)
admin\App::update()- uruchamia pending migracjeadmin\App::special_actions()- logowanie/wylogowanie/2FAadmin\App::render():- auth gate (lub formularz logowania),
route()-> kontroler + akcja,- render przez
Shared\Tpl\Tpl.
Front (index.php)
- Bootstrap (sesja, DB, autoload, jezyk)
- Mapowanie URL (redirecty + routes)
front\App::checkUrlParams()front\App::route():- artykul/produkt/kategoria,
- nowe kontrolery DI,
- fallback do
front\controls\*(legacy, jesli istnieje)
front\LayoutEngine::show()sklada finalny HTML.
API (api.php)
- Bootstrap (bez sesji biznesowej)
- Tworzenie
\api\ApiRouter ApiRouter::handle():- auth przez
X-Api-Key, - walidacja
endpointiaction, - dispatch do kontrolera API,
- JSON response przez
sendSuccess()/sendError().
- auth przez
Szczegolowa specyfikacja endpointow: .paul/docs/API.md.
Dependency Injection (manual factories)
DI jest realizowane recznie w mapach factory:
- admin:
autoload/admin/App.php->getControllerFactories() - front:
autoload/front/App.php->getControllerFactories() - api:
autoload/api/ApiRouter.php->getControllerFactories()
Wzorzec:
- router tworzy repozytoria domenowe,
- repozytoria sa wstrzykiwane do kontrolerow przez konstruktor,
- kontroler wywoluje metody domenowe i zwraca HTML/JSON.
Autoloader i namespace rules
Kazdy entry point korzysta z custom autoloadera:
autoload/{namespace}/class.{ClassName}.php(legacy)autoload/{namespace}/{ClassName}.php(nowy format)
Mapowanie namespace -> katalog (case-sensitive na Linux):
\Domain\->autoload/Domain/\Shared\->autoload/Shared/\admin\->autoload/admin/(malea)\front\->autoload/front/\api\->autoload/api/
Nie uzywac \Admin\ (duze A), bo katalog runtime to admin/.
Domain layer (28 modulow)
Aktualne moduly:
Article, Attribute, Banner, Basket, Cache, Category, Client, Coupon, CronJob, Dashboard, Dictionaries, Integrations, Languages, Layouts, Newsletter, Order, Pages, PaymentMethod, Producer, Product, ProductSet, Promotion, Scontainers, Settings, ShopStatus, Transport, Update, User.
Zasada: logika biznesowa i dostep do danych sa w Domain, bez duplikowania osobnych warstw "admin service" i "front service" dla tych samych przypadkow (wyjatki tylko tam, gdzie historycznie juz istnieja, np. OrderAdminService).
Admin architecture
- Router:
admin\App - Kontrolery:
autoload/admin/Controllers/*.php(28 klas) - Form system:
admin\ViewModels\Forms\*admin\Support\Forms\FormRequestHandleradmin\Support\Forms\FormFieldRendereradmin\Validation\FormValidator- template:
admin/templates/components/form-edit.php
Admin ma pelne DI i nie korzysta z fallbacku na legacy kontrolery.
Front architecture
- Router:
front\App - Layout engine:
front\LayoutEngine - Kontrolery DI:
autoload/front/Controllers/*.php(8 klas) - Widoki statyczne:
autoload/front/Views/*.php(11 klas)
Wazne: frontend nadal ma fallback do \front\controls\*, wiec architektura jest hybrydowa (new DI + remaining legacy paths).
API architecture
- Router:
api\ApiRouter - Endpointy:
orders,products,dictionaries,categories - Kontrolery:
autoload/api/Controllers/*ApiController.php(4 klasy) - API jest stateless, autoryzowane naglowkiem
X-Api-Key
Source-of-truth API to runtime:
api.phpautoload/api/ApiRouter.phpautoload/api/Controllers/*
Shared components
Najwazniejsze klasy wspoldzielone:
Shared\Cache\CacheHandler,Shared\Cache\RedisConnectionShared\Helpers\HelpersShared\Tpl\TplShared\Html\HtmlShared\Email\EmailShared\Image\ImageManipulator
Data and cache conventions
- ORM: Medoo (
$mdb) - Prefix tabel:
pp_ - Cache: Redis, domyslnie TTL
86400 - Dane cache czesto serializowane (
serialize/unserialize) - Czyszczenie cache produktu: pattern
shop\\product:{id}:*
Security boundaries
- Admin:
- sesja uzytkownika admina,
- CSRF token w akcjach POST,
- 2FA email flow (pending session + verify).
- API:
X-Api-Keyporownywany przezhash_equals(),- brak logiki sesyjnej.
- Front:
- sesja klienta + walidacja przeplywow frontendowych.
Source files
Najwazniejsze pliki do szybkiej orientacji:
autoload/admin/App.phpautoload/front/App.phpautoload/front/LayoutEngine.phpautoload/api/ApiRouter.php.paul/docs/API.mddocs/PROJECT_STRUCTURE.md