refactor: centralny autoloader, Shared\Email i Shared\Security
- Utworzono autoload/autoloader.php (hybrydowy PSR-4 + legacy) - Zmigrowano 7 entry pointów do centralnego autoloadera - Dodano PSR-4 mapowanie w composer.json (Domain, Shared, Admin, Frontend) - Utworzono Shared\Email\Email (PHPMailer, migracja z Helpers) - Utworzono Shared\Security\CsrfToken (random_bytes + hash_equals) - Wrappery w Helpers delegują do nowych klas - Zaktualizowano docs/PROJECT_STRUCTURE.md - Inicjalizacja PAUL (.paul/) z roadmapą 19 faz refaktoryzacji Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
176
.paul/phases/01-infrastructure/01-01-PLAN.md
Normal file
176
.paul/phases/01-infrastructure/01-01-PLAN.md
Normal file
@@ -0,0 +1,176 @@
|
||||
---
|
||||
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
|
||||
---
|
||||
|
||||
<objective>
|
||||
## 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
|
||||
</objective>
|
||||
|
||||
<context>
|
||||
## 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/
|
||||
</context>
|
||||
|
||||
<acceptance_criteria>
|
||||
|
||||
## 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)
|
||||
```
|
||||
|
||||
</acceptance_criteria>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Utworzenie centralnego autoloadera</name>
|
||||
<files>autoload/autoloader.php</files>
|
||||
<action>
|
||||
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
|
||||
</action>
|
||||
<verify>Sprawdzić że plik istnieje i zawiera spl_autoload_register</verify>
|
||||
<done>AC-1 satisfied: Centralny autoloader z obsługą PSR-4 i legacy</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Aktualizacja composer.json</name>
|
||||
<files>composer.json</files>
|
||||
<action>
|
||||
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.
|
||||
</action>
|
||||
<verify>Sprawdzić że composer.json zawiera poprawne mapowanie PSR-4</verify>
|
||||
<done>AC-2 satisfied: composer.json z PSR-4 mapowaniem</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 3: Migracja entry pointów</name>
|
||||
<files>index.php, admin/index.php, ajax.php, api.php, cron.php, download.php</files>
|
||||
<action>
|
||||
W każdym entry poincie:
|
||||
1. USUNĄĆ definicję funkcji __autoload_my_classes() i jej spl_autoload_register
|
||||
2. DODAĆ na początku (po <?php): require_once __DIR__ . '/autoload/autoloader.php';
|
||||
Dla admin/index.php: require_once __DIR__ . '/../autoload/autoloader.php';
|
||||
3. Zachować resztę kodu bez zmian (config.php, medoo, session etc.)
|
||||
|
||||
NIE zmieniać niczego innego w tych plikach — tylko autoloader.
|
||||
</action>
|
||||
<verify>Grep po wszystkich entry pointach: brak __autoload_my_classes definicji, jest require autoloader.php</verify>
|
||||
<done>AC-3 satisfied: Wszystkie entry pointy używają centralnego autoloadera</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<boundaries>
|
||||
|
||||
## 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
|
||||
|
||||
</boundaries>
|
||||
|
||||
<verification>
|
||||
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
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- 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
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.paul/phases/01-infrastructure/01-01-SUMMARY.md`
|
||||
</output>
|
||||
110
.paul/phases/01-infrastructure/01-01-SUMMARY.md
Normal file
110
.paul/phases/01-infrastructure/01-01-SUMMARY.md
Normal file
@@ -0,0 +1,110 @@
|
||||
---
|
||||
phase: 01-infrastructure
|
||||
plan: 01
|
||||
subsystem: infra
|
||||
tags: [autoloader, psr-4, composer]
|
||||
|
||||
requires: []
|
||||
provides:
|
||||
- Centralny hybrydowy autoloader (PSR-4 + legacy)
|
||||
- composer.json z PSR-4 mapowaniem namespace'ów
|
||||
affects: [all future phases - every new class uses this autoloader]
|
||||
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns: [centralny autoloader z __DIR__, hybrydowy PSR-4 + legacy]
|
||||
|
||||
key-files:
|
||||
created: [autoload/autoloader.php]
|
||||
modified: [composer.json, index.php, admin/index.php, admin/ajax.php, ajax.php, api.php, cron.php, download.php]
|
||||
|
||||
key-decisions:
|
||||
- "Centralny autoloader zamiast duplikatów w entry pointach (ulepszenie vs shopPRO)"
|
||||
- "Savant3 special case przeniesiony do centralnego autoloadera"
|
||||
|
||||
patterns-established:
|
||||
- "Jeden autoloader dla wszystkich entry pointów — __DIR__ based paths"
|
||||
- "Hybrydowe ładowanie: legacy class.*.php → PSR-4 ClassName.php"
|
||||
|
||||
duration: ~10min
|
||||
completed: 2026-04-04
|
||||
---
|
||||
|
||||
# Phase 1 Plan 01: Infrastructure & Autoloader Summary
|
||||
|
||||
**Centralny hybrydowy autoloader (PSR-4 + legacy) zastępujący 7 zduplikowanych kopii w entry pointach.**
|
||||
|
||||
## Performance
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Duration | ~10min |
|
||||
| Completed | 2026-04-04 |
|
||||
| Tasks | 3 completed |
|
||||
| Files modified | 8 |
|
||||
|
||||
## Acceptance Criteria Results
|
||||
|
||||
| Criterion | Status | Notes |
|
||||
|-----------|--------|-------|
|
||||
| AC-1: Centralny autoloader | Pass | autoload/autoloader.php z spl_autoload_register, __DIR__ paths |
|
||||
| AC-2: composer.json PSR-4 | Pass | Domain\, Shared\, Admin\, Frontend\ mapped |
|
||||
| AC-3: Entry pointy zmigrowane | Pass | 7 entry pointów, 0 duplikatów __autoload_my_classes |
|
||||
| AC-4: Istniejące klasy działają | Pass | Autoloader obsługuje legacy + PSR-4 format |
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- Utworzono centralny `autoload/autoloader.php` z obsługą legacy (class.*.php) i PSR-4 (ClassName.php)
|
||||
- Zaktualizowano `composer.json` z PSR-4 mapowaniem dla 4 namespace'ów
|
||||
- Zmigrowano 7 entry pointów (index.php, admin/index.php, admin/ajax.php, ajax.php, api.php, cron.php, download.php)
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
| File | Change | Purpose |
|
||||
|------|--------|---------|
|
||||
| `autoload/autoloader.php` | Created | Centralny hybrydowy autoloader |
|
||||
| `composer.json` | Modified | PSR-4 mapping dla Domain\, Shared\, Admin\, Frontend\ |
|
||||
| `index.php` | Modified | require_once autoloader.php |
|
||||
| `admin/index.php` | Modified | require_once ../autoloader.php |
|
||||
| `admin/ajax.php` | Modified | require_once ../autoloader.php (Savant3 przeniesiony) |
|
||||
| `ajax.php` | Modified | require_once autoloader.php |
|
||||
| `api.php` | Modified | require_once autoloader.php |
|
||||
| `cron.php` | Modified | require_once autoloader.php |
|
||||
| `download.php` | Modified | require_once autoloader.php |
|
||||
|
||||
## Decisions Made
|
||||
|
||||
| Decision | Rationale | Impact |
|
||||
|----------|-----------|--------|
|
||||
| Centralny autoloader (vs duplikaty jak w shopPRO) | DRY, łatwiejsze utrzymanie, jednorazowa poprawka | Ulepszenie vs shopPRO — notatka dodana do shopPRO/docs |
|
||||
| Savant3 special case w centralnym autoloaderze | Był tylko w admin/ajax.php, powinien działać globalnie | Brak regresji |
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
### Summary
|
||||
|
||||
| Type | Count | Impact |
|
||||
|------|-------|--------|
|
||||
| Scope additions | 1 | Minimal — admin/ajax.php (7th entry point) |
|
||||
|
||||
Plan zakładał 6 entry pointów, ale znaleziono 7 (admin/ajax.php nie był wymieniony w planie). Zmigrowany bez problemów.
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
None.
|
||||
|
||||
## Next Phase Readiness
|
||||
|
||||
**Ready:**
|
||||
- Autoloader obsługuje wszystkie namespace'y potrzebne dla faz 2-19
|
||||
- Nowe klasy w Admin\, Frontend\ będą automatycznie ładowane
|
||||
|
||||
**Concerns:**
|
||||
- AC-4 zweryfikowane statycznie (kod autoloadera) — runtime test wymaga uruchomienia aplikacji
|
||||
|
||||
**Blockers:**
|
||||
- None
|
||||
|
||||
---
|
||||
*Phase: 01-infrastructure, Plan: 01*
|
||||
*Completed: 2026-04-04*
|
||||
Reference in New Issue
Block a user