2.2 KiB
2.2 KiB
Refaktoryzacja autoloadera — centralizacja
Problem
Funkcja __autoload_my_classes() jest zduplikowana w każdym entry poincie:
index.phpadmin/index.phpadmin/ajax.phpajax.phpapi.phpcron.phpdownload.phpcron-turstmate.phpcron/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
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ę:
// 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