Ga naar inhoud

Autoloading & namespaces

De webshop gebruikt drie autoload-mechanismen naast elkaar. Ze zijn elk verantwoordelijk voor een andere laag van de codebase en mogen niet door elkaar gehaald worden.


Mechanisme 1: Composer PSR-0 voor src/

Alle moderne code staat in src/ en wordt geautoload via Composer PSR-0, zoals gedefinieerd in composer.json:110–134:

"autoload": {
    "psr-0": {
        "Amazon\\":     "src/",
        "Arteel\\":     "src/",
        "Atraxion\\":   "src/",
        "Autodoc\\":    "src/",
        "Cloudflare\\": "src/",
        "Evox\\":       "src/",
        "Facebook\\":   "src/",
        "Matomo\\":     "src/",
        "Maxityre\\":   "src/",
        "Odoo\\":       "src/",
        "Qweon\\":      "src/",
        "Rhinoman\\":   "src/",
        "Transsmart\\": "src/",
        "Tyre24\\":     "src/",
        "VirusTotal\\": "src/",
        "Wheelpope\\":  "src/"
    },
    "files": [
        "src/functions.php",
        "src/legacy_functions.php",
        "src/namespaced_functions.php"
    ]
}

Werkwijze PSR-0: de namespace-scheiding \\ wordt omgezet naar mapscheiding /. Atraxion\Mail\SendMailFactorysrc/Atraxion/Mail/SendMailFactory.php.

Automatisch geladen bestanden (altijd):

Bestand Inhoud
src/functions.php Globale hulpfuncties (trans(), redirect(), url(), json(), is_prod(), is_ajax(), checkManage(), …)
src/legacy_functions.php Functies voor achterwaartse compatibiliteit
src/namespaced_functions.php Genaamruimde hulpfuncties (bijv. Atraxion\service(), Atraxion\load_page(), …)

Na composer dump-autoload wordt vendor/autoload.php geregenereerd. Dit bestand wordt als eerste geladen in _www/appconfig/bootstrap.php:8.


Mechanisme 2: Legacy atx\-suffix-autoloader

Alle legacy-code in _core/ en _admin/ — klassen onder de atx\-namespace — wordt geautoload via een eigen spl_autoload_register-functie gedefinieerd in _core/config/autoload_classes.php.

Registratie

// _core/config/autoload_classes.php:71–72
spl_autoload_extensions('.php');
spl_autoload_register('autoloader');

Dit wordt geladen via _www/appconfig/bootstrap.php:10:

require_once APP_CORE_PATH . '/config/autoload_classes.php';

Suffix-naar-map-mapping

De autoloader bepaalt de submap op basis van het suffix van de klassenaam (_core/config/autoload_classes.php:28–39):

Suffix van de klasse Submap
Controller of Worker controller/
View view/
Trait trait/
(al het andere) model/

Klassen die eindigen op DAO krijgen een extra prefix db voor de classes/-map: dbclasses/ (_core/config/autoload_classes.php:50).

Bestandspad-constructie

Voor een klasse atx\articles\wheels\WheelSearchController:

  1. Suffix = Controller → submap = controller/
  2. Namespace = atx\articles\wheels → pad = atx/articles/wheels/
  3. Klassenaam = WheelSearchController
  4. Zoekpad (core): APP_CORE_PATH/controller/classes/atx/articles/wheels/WheelSearchController.php
  5. Indien niet gevonden in core: zelfde structuur in APP_ADMIN_PATH/controller/... (autoload_classes.php:56–59)

Zoekolgorde

// _core/config/autoload_classes.php:56–60
if (file_exists(APP_CORE_PATH . DIRECTORY_SEPARATOR . $sType . $sFileName)) {
    require_once APP_CORE_PATH . DIRECTORY_SEPARATOR . $sType . $sFileName;
} elseif (file_exists(APP_ADMIN_PATH . DIRECTORY_SEPARATOR . $sType . $sFileName)) {
    require_once APP_ADMIN_PATH . DIRECTORY_SEPARATOR . $sType . $sFileName;
}

Eerst _core/, dan _admin/. Gevonden bestanden worden met require_once geladen.

Bekende beperking: geen ondersteuning voor ongesuffixte klassen

De autoloader verwacht een suffix. Een klasse als atx\articles\Helper (geen Controller/View/Trait/DAO) valt in de model/-map, maar een klasse atx\Helper zonder namespace-pad zou al kunnen mislopen. Nieuwe PHP-klassen die geen van de erkende suffixen hebben, horen in src/ (Composer PSR-0), niet in de atx\-structuur. Dit is gedocumenteerd als MEMORY-noot feedback_new_classes_in_src.


Mechanisme 3: Doctrine entiteiten

Doctrine ORM laadt entiteiten via eigen mappingconfiguratie, los van de twee autoloaders hierboven. De Doctrine-service wordt geconfigureerd via Atraxion\Common\ServiceProvider\DoctrineServiceProvider (geregistreerd in _core/config/service-providers.php:2).

De Doctrine-service wordt geconfigureerd via een SimplifiedXmlDriver met de volgende pad-naar-namespace-mapping (_core/model/classes/atx/doctrine/DoctrineService.php:84–96):

Map Namespace
_core/config/doctrine/ atx\ — verreweg de meeste (legacy) entiteiten
src/Atraxion/<Module>/Resources/doctrine/ Atraxion\<Module>\Entity — bijv. Loyalty, Edi, Coupon, Advert, WheelSet
src/Odoo/Resources/doctrine/ Odoo\Entity
src/Qweon/Resources/doctrine/ Qweon\Entity

src/Atraxion/Model/ bevat uitsluitend abstracte hulpklassen (CustomIdGeneratorAbstract, IdentityTrait, AbstractManager) — geen Doctrine-entiteitsdefinities. De EntityManager is beschikbaar via ServiceRegistry::getEntityManager().


Overzicht drie mechanismen

graph TD
    A[require vendor/autoload.php] -->|PSR-0 src/*| B[src/Atraxion/..., src/Amazon/..., etc.]
    A -->|files| C[functions.php, legacy_functions.php, namespaced_functions.php]
    D[spl_autoload_register autoloader] -->|suffix → submap| E[_core/controller/classes/atx/...]
    D -->|suffix → submap| F[_core/model/classes/atx/...]
    D -->|suffix → submap| G[_core/view/classes/atx/...]
    D -->|suffix → submap| H[_admin/controller/classes/atx/...]
    I[DoctrineService] -->|EntityManager| J["_core/config/doctrine/ (atx\\) + src/Atraxion/*/Resources/doctrine/"]

Wanneer gebruik je welk mechanisme?

Situatie Mechanisme
Nieuwe service, module, integratie-client PSR-0 in src/
Bestaande atx\...Controller aanpassen Legacy autoloader (_core/controller/)
Nieuwe controller voor bestaande pagina Legacy autoloader (suffix Controller)
Nieuwe entiteit voor Doctrine ORM PSR-0 in src/Atraxion/<Module>/Resources/doctrine/ + XML-mapping; klasse in src/Atraxion/<Module>/Entity/
Globale hulpfunctie src/functions.php of src/namespaced_functions.php

Namespace-conventies

Prefix Locatie Autoloader
atx\ _core/ en _admin/ Suffix-autoloader
Atraxion\ src/Atraxion/ Composer PSR-0
Amazon\, Arteel\, Odoo\, … src/<Naam>/ Composer PSR-0
AtraxionTest\ tests/ Composer PSR-0 (dev)

Zie ook: Repository-structuur · Service container & bootstrap