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

2.2 KiB

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
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