80 lines
2.2 KiB
Markdown
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
|