# Pamięć projektu shopPRO Notatki i wnioski zebrane podczas pracy z kodem. Aktualizowane na bieżąco. --- ## Serwer produkcyjny - PHP < 8.0 — unikać `match`, named arguments, union types, `str_contains()` itp. - Zamiast `match` używać operatorów trójargumentowych (ternary) lub `if/else` ## Znane problemy / TODO - `\Shared\Helpers\Helpers::send_email()` i `Shared\Email\Email::send()` — zduplikowana logika PHPMailer. Docelowo zunifikować w `Shared\Email\Email` ## Wzorce potwierdzone w projekcie - Metody frontendowe (z cache Redis) dodawane do istniejących repozytoriów Domain — NIE tworzymy osobnych FrontendService/AdminService - Klasy View (`front\Views\*`) są statyczne i bezstanowe — nie wymagają DI - Kontrolery (`Controllers\*`) są instancyjne z DI przez konstruktor - Autoloader obsługuje dwa formaty plików: `class.X.php` (legacy) i `X.php` (nowy) — oba działają bez zmian w autoloaderze - Nowe katalogi z dużej litery: `Views/`, `Controllers/` (legacy: `view/`, `controls/`, `factory/`) ## Medoo ORM — pułapki - `$mdb->delete()` przyjmuje 2 argumenty (tabela, warunek), NIE 3 — wielokrotnie powodowało bugi (np. `newsletter_unsubscribe`) - `$mdb->get()` zwraca `null` gdy brak rekordu, NIE `false` - Przy `$mdb->insert()` sprawdzać `$mdb->id()` aby potwierdzić sukces ## Redis cache — konwencje - TTL domyślnie 86400 (24h) - Klucze produktów: `shop\product:{id}:{lang}:{permutation_hash}` - Wzorzec czyszczenia: `CacheHandler::deletePattern("shop\\product:{$id}:*")` - Dane w cache są serializowane — wymagają `unserialize()` po `get()` ## Aktualizacje klienckie - Pliki `*.md` NIGDY nie trafiają do ZIP aktualizacji - `updates/changelog.php` to plik serwisowy repozytorium, nie runtime klienta - Główny `.htaccess` wdrażany osobno, poza ZIP aktualizacji - W archiwum ZIP NIE powinno być folderu z nazwą wersji — struktura zaczyna się od katalogów projektu