Files
shopPRO/docs/AUTOLOADER_REFACTORING.md
2026-04-16 23:12:41 +02:00

80 lines
2.2 KiB
Markdown

# Refaktoryzacja autoloadera — centralizacja
## Problem
Funkcja `__autoload_my_classes()` jest zduplikowana w każdym entry poincie:
- `index.php`
- `admin/index.php`
- `admin/ajax.php`
- `ajax.php`
- `api.php`
- `cron.php`
- `download.php`
- `cron-turstmate.php`
- `cron/cron-xml.php`
Każdy plik zawiera identyczną (lub prawie identyczną) kopię autoloadera. Warianty różnią się ścieżką bazową (`autoload/` vs `../autoload/`) i drobnymi detalami (np. Savant3 special case tylko w `admin/ajax.php`).
## Rozwiązanie
Utworzyć centralny plik `autoload/autoloader.php` z jedną definicją autoloadera, używając `__DIR__` zamiast ścieżek relatywnych.
### Plik: `autoload/autoloader.php`
```php
<?php
function __autoload_my_classes( $classname )
{
$base = __DIR__ . '/';
$q = explode( '\\', $classname );
$c = array_pop( $q );
// Savant3 — special case
if ( $c == 'Savant3' )
{
$f = $base . 'Savant3.php';
if ( file_exists( $f ) ) { require_once( $f ); return; }
}
$path = implode( '/', $q );
// 1. Legacy: class.ClassName.php
$f = $base . $path . '/class.' . $c . '.php';
if ( file_exists( $f ) ) { require_once( $f ); return; }
// 2. PSR-4: ClassName.php
$f = $base . $path . '/' . $c . '.php';
if ( file_exists( $f ) ) require_once( $f );
}
spl_autoload_register( '__autoload_my_classes' );
```
### Zmiana w entry pointach
Zamienić definicję funkcji + `spl_autoload_register` na jedną linię:
```php
// Root entry points (index.php, ajax.php, api.php, cron.php, download.php):
require_once __DIR__ . '/autoload/autoloader.php';
// Admin entry points (admin/index.php, admin/ajax.php):
require_once __DIR__ . '/../autoload/autoloader.php';
// Cron subdirectory (cron/cron-xml.php):
require_once __DIR__ . '/../autoload/autoloader.php';
```
## Korzyści
- **DRY** — jedna definicja zamiast 9+ kopii
- **Bezpieczeństwo** — poprawka w jednym miejscu działa wszędzie
- **`__DIR__`** — ścieżki absolutne, niezależne od cwd
- **Savant3** — obsłużony centralnie, nie tylko w admin/ajax.php
## Uwagi
- Reszta kodu w entry pointach (config.php, medoo, session) pozostaje bez zmian
- Rozwiązanie wdrożone i przetestowane w cmsPRO