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\SendMailFactory → src/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:
- Suffix =
Controller→ submap =controller/ - Namespace =
atx\articles\wheels→ pad =atx/articles/wheels/ - Klassenaam =
WheelSearchController - Zoekpad (core):
APP_CORE_PATH/controller/classes/atx/articles/wheels/WheelSearchController.php - 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