---
phase: 01-infrastructure
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- composer.json
- autoload/autoloader.php
- index.php
- admin/index.php
- ajax.php
- api.php
- cron.php
- download.php
autonomous: true
delegation: off
---
## Goal
Scentralizować autoloader w jednym pliku, dodać PSR-4 mapowanie w composer.json dla Domain\, Shared\, Admin\, Frontend\, i zastąpić zduplikowane __autoload_my_classes() we wszystkich entry pointach.
## Purpose
Fundament dla całej refaktoryzacji — bez działającego PSR-4 autoloadera nie można dodawać nowych klas w Admin\ i Frontend\ namespace'ach.
## Output
- Centralny autoload/autoloader.php (hybrydowy: PSR-4 + legacy class.*.php)
- Zaktualizowany composer.json z PSR-4 mapowaniem
- Wszystkie entry pointy używają jednego autoloadera
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
## Source Files
@composer.json
@index.php (zawiera __autoload_my_classes)
@admin/index.php (zawiera duplikat __autoload_my_classes)
@ajax.php, api.php, cron.php, download.php (kolejne duplikaty)
## Reference
shopPRO composer.json — PSR-4 mapping: Domain\, Admin\, Frontend\, Shared\ → autoload/
## AC-1: Centralny autoloader
```gherkin
Given plik autoload/autoloader.php istnieje
When jest załadowany przez require_once
Then rejestruje spl_autoload_register z obsługą zarówno PSR-4 (ClassName.php) jak i legacy (class.ClassName.php)
```
## AC-2: composer.json PSR-4
```gherkin
Given composer.json ma sekcję autoload.psr-4
When uruchomię composer dump-autoload
Then namespace'y Domain\, Shared\, Admin\, Frontend\ mapują do autoload/Domain/, autoload/Shared/, autoload/Admin/, autoload/Frontend/
```
## AC-3: Entry pointy używają centralnego autoloadera
```gherkin
Given index.php, admin/index.php, ajax.php, api.php, cron.php, download.php
When sprawdzę ich kod
Then każdy zawiera require_once do autoload/autoloader.php (lub ../autoload/autoloader.php)
And żaden nie zawiera zduplikowanej funkcji __autoload_my_classes
```
## AC-4: Istniejące klasy działają
```gherkin
Given klasy Domain\Articles\ArticlesRepository, Shared\Cache\CacheHandler etc. istnieją
When autoloader próbuje je załadować
Then klasy ładują się poprawnie (brak Fatal Error)
```
Task 1: Utworzenie centralnego autoloadera
autoload/autoloader.php
Utworzyć plik autoload/autoloader.php:
- Funkcja __autoload_my_classes($class) obsługująca:
1. Zamiana namespace separator \ na /
2. Próba załadowania: autoload/{path}/class.{ClassName}.php (legacy)
3. Próba załadowania: autoload/{path}/{ClassName}.php (PSR-4)
- spl_autoload_register('__autoload_my_classes')
- Bazowy katalog ustalany przez __DIR__ . '/' (relatywnie do autoload/)
- Obsługa klas bez namespace (legacy) — szukanie w autoload/class.{name}.php
Wzorować się na istniejącej logice z index.php, ale:
- Używać __DIR__ zamiast ścieżek relatywnych do entry pointa
- Jeden plik obsługuje WSZYSTKIE entry pointy
Sprawdzić że plik istnieje i zawiera spl_autoload_register
AC-1 satisfied: Centralny autoloader z obsługą PSR-4 i legacy
Task 2: Aktualizacja composer.json
composer.json
Dodać sekcję autoload.psr-4 do composer.json:
```json
"autoload": {
"psr-4": {
"Domain\\": "autoload/Domain/",
"Shared\\": "autoload/Shared/",
"Admin\\": "autoload/Admin/",
"Frontend\\": "autoload/Frontend/"
}
}
```
Zachować istniejący autoload-dev.
Sprawdzić że composer.json zawiera poprawne mapowanie PSR-4
AC-2 satisfied: composer.json z PSR-4 mapowaniem
Task 3: Migracja entry pointów
index.php, admin/index.php, ajax.php, api.php, cron.php, download.php
W każdym entry poincie:
1. USUNĄĆ definicję funkcji __autoload_my_classes() i jej spl_autoload_register
2. DODAĆ na początku (po
Grep po wszystkich entry pointach: brak __autoload_my_classes definicji, jest require autoloader.php
AC-3 satisfied: Wszystkie entry pointy używają centralnego autoloadera
## DO NOT CHANGE
- autoload/Domain/* (istniejące klasy Domain — nie modyfikować)
- autoload/Shared/* (istniejące klasy Shared — nie modyfikować)
- config.php (konfiguracja bazy danych)
- libraries/* (zewnętrzne biblioteki)
## SCOPE LIMITS
- Tylko autoloader — nie refaktoryzować żadnych klas
- Nie dodawać nowych klas Admin\ ani Frontend\ (to w kolejnych fazach)
- Nie zmieniać logiki biznesowej w entry pointach
Before declaring plan complete:
- [ ] autoload/autoloader.php istnieje i zawiera spl_autoload_register
- [ ] composer.json ma sekcję autoload.psr-4 z 4 namespace'ami
- [ ] Żaden entry point nie zawiera zduplikowanej funkcji __autoload_my_classes
- [ ] Wszystkie entry pointy mają require_once autoloader.php
- [ ] Istniejące testy PHPUnit przechodzą (jeśli są)
- All acceptance criteria met
- Centralny autoloader działa dla PSR-4 i legacy class.*.php
- Wszystkie entry pointy korzystają z jednego autoloadera
- Zero regresji — istniejący kod działa bez zmian