--- 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 After completion, create `.paul/phases/01-infrastructure/01-01-SUMMARY.md`