Datamodel & databases¶
De Atraxion-webshop gebruikt meerdere MySQL-databases (MariaDB-compatibel). Elke database heeft een duidelijk afgebakende verantwoordelijkheid. De toegangslaag bestaat uit twee systemen naast elkaar: Doctrine ORM/DBAL voor de modernere entiteiten en een legacy DAO-laag (GenericDAO) voor de oudere tabellen.
Databases en hun rol¶
De databases worden bij installatie aangemaakt vanuit de SQL-dumps in _data/ (zie INSTALL.md:26). Hieronder een overzicht:
| Database | Inhoud / rol |
|---|---|
atx_www |
Hoofddatabase. Bevat alle kernentiteiten: artikelen (banden, velgen, accessoires), bestellingen, klanten, channels, CMS-content (cms_text, cms_template), loyaliteitspunten, coupons, transportprijzen, leveranciers, voertuigtabellen (vehicle_*), e-mailsjablonen, enzovoort. |
atx_3d |
3D-velgensimulator: voertuiglooks, verven, achtergrondsafbeeldingen (threed_*). |
atx_dwh |
Data warehouse: statistieken, paginatellers, zoekhistoriek, voorraadgeschiedenis (counter, sales, search, stock_history2). |
atx_log |
Logboeken: IP-blacklist, cache-fallback, inlogfouten, middlewarelogs, request/response-logs, klantenvalidatielogs. |
atx_queue |
Queue-systeem voor achtergrondverwerking: app_queue, job, queue, r6_queue, r6_queue_async. |
channel |
(seed-bestand bij installatie) — de operationele channeldata zit in atx_www.channel en gerelateerde tabellen; deze losse database is slechts een initialisatiebron. |
cms_text |
(seed-bestand bij installatie) — vertaalteksten worden operationeel bijgehouden in atx_www.cms_text; TextDAO::Table() verwijst expliciet naar atx_www.cms_text. |
customer |
(seed-bestand bij installatie) — klanthoofdrecords (customer-tabel). Operationele klantdata zit in atx_www. |
customer_category |
(seed-bestand bij installatie) — klantcategorieën (code A–Z, bijv. Bandenhandelaar, Garage, Importeur). Operationeel opgeslagen in atx_www. |
customer_user |
(seed-bestand bij installatie) — logingegevens van klantgebruikers: gebruikersnaam, bcrypt-wachtwoord, rol, taalvoorkeur, geboortedatum, 2FA-status. Operationeel beheerd in atx_www. |
language |
(seed-bestand bij installatie) — ondersteunde talen: nl, fr, en, du. Operationeel opgeslagen in atx_www. |
setting |
(seed-bestand bij installatie) — applicatie-instellingen (zie Configuratie & environment). Operationeel beheerd in atx_www. |
vehicle_bodytype |
Voertuigcarrosserietypes. |
vehicle_bodytype_order |
Sorteervolgorde per carrosserietype. |
vehicle_brand |
Voertuigmerken (gekoppeld aan DriveRight). |
De constanten voor de databasenamen staan in _www/appconfig/constants.php:
// _www/appconfig/constants.php:71–74
const APP_DB_WWW = 'atx_www';
const APP_DB_LOG = 'atx_log';
const APP_DB_QUEUE = 'atx_queue';
const APP_DB_DWH = 'atx_dwh';
De databaseverbinding wordt opgezet door atx\Db (_core/model/classes/atx/Db.php), een singleton die zowel PDO als Doctrine DBAL aanbiedt:
// _core/model/classes/atx/Db.php:55
$dsn = sprintf('mysql:host=%s;dbname=%s;charset=%s', APP_DB_HOST, APP_DB_WWW, DB_CHARSET);
De primaire verbinding richt zich altijd op atx_www; andere databases worden via cross-database SQL-queries (atx_log.log_error, atx_dwh.sales, …) bereikt.
Channel-datamodel¶
Het channel-concept is technisch centraal: elk request hoort bij één channel (atx\channels\Channel, _core/model/classes/atx/channels/Channel.php).
ChannelType = 1(WEB): standaard webshop (www.atraxion.com, ID 14) en mini-shops (*.tyrecloud.be,*.wheelcloud.be). Een mini-shop is een WEB-channel met een ingevuldOwnedByCustomer-veld (koppeling naarcustomer.Klantnr).ChannelType = 2(PLATFORM): externe verkoopplatformen zoals Tyre24. Een platform-channel heeft een gekoppeldechannel_platform-record.
Constanten in _core/model/classes/atx/channels/Channel.php:
// Channel.php:19–44
const WEB = 1;
const PLATFORM = 2;
const DEFAULT_CHANNEL_NAME = 'www.atraxion.com';
const DEFAULT_CHANNEL = 14;
Het ORM-mapping-bestand _core/config/doctrine/channels.Channel.orm.xml beschrijft het volledige schema: channelnaam, subdomain, mini-shop-vlag (MiniShop), homepage-teksten per taal, verborgen merken, en de many-to-one relatie naar customer via OwnedByCustomer.
Het actieve channel wordt bij bootstrap bepaald in _www/appconfig/constants.php:51–57 via APP_CHANNEL (hostname-based lookup).
Doctrine ORM/DBAL¶
De Doctrine-integratie wordt beheerd door atx\doctrine\DoctrineService (_core/model/classes/atx/doctrine/DoctrineService.php). De EntityManager wordt aangemaakt via ORMSetup::createConfiguration() en gebruikt Simplified XML Driver voor de ORM-mappings.
Mapping-locaties¶
ORM-mappings worden op meerdere plaatsen bijgehouden (DoctrineService.php:83–98):
| Pad | Namespace |
|---|---|
_core/config/doctrine/ |
atx (alle legacy entiteiten) |
src/Atraxion/Advert/Resources/doctrine |
Atraxion\Advert\Entity |
src/Atraxion/Api/Resources/doctrine |
Atraxion\Api\Entity |
src/Atraxion/Coupon/Resources/doctrine |
Atraxion\Coupon\Entity |
src/Atraxion/Edi/Resources/doctrine |
Atraxion\Edi\Entity |
src/Atraxion/Logo/Resources/doctrine |
Atraxion\Logo\Entity |
src/Atraxion/Loyalty/Resources/doctrine |
Atraxion\Loyalty\Entity |
src/Atraxion/Model/Product/Resources/doctrine |
Atraxion\Model\Product\Entity |
src/Atraxion/WheelSet/Resources/doctrine |
Atraxion\WheelSet\Entity |
src/Atraxion/Platform/Resources/doctrine |
Atraxion\Platform\Model |
src/Odoo/Resources/doctrine |
Odoo\Entity |
src/Qweon/Resources/doctrine |
Qweon\Entity |
Kern-entiteiten in _core/config/doctrine/¶
De ORM-bestanden zijn genaamd naar hun entiteitspad, bijv. articles.Article.orm.xml, channels.Channel.orm.xml, orders.Order.orm.xml. Voorbeelden van groepen:
- Artikelen:
Article,ArticleCategory,ArticleBrand,Tyre,TyreType,Wheel,acc.Acc,stock.Stock,stock.Export - Kanalen:
Channel,ChannelCustomer,ChannelRanking,platforms.Platform,platforms.PlatformExport - Klanten:
Customer,CustomerCat,CustomerMargin,Login,cart.CartArticle,cart.CartSet - Bestellingen:
Order,OrderArticle,OrderAddress,OrderSet,ReturnRequest,Transport - Leveranciers:
Supplier,suppliers.stock.SupplierStock,suppliers.stock.SupplierImportSettings - Voertuigen:
VehicleBrand,VehicleModel,VehicleChassis,VehicleMotor,driveright.Tf_Vehicle - CMS:
cms.Template,cms.BlogPost,pages.Slide - Facturen:
invoices.Invoice,invoices.ShipmentTracking
De basisentiteit atx\DoctrineGeneric (mapping: DoctrineGeneric.orm.xml) voegt de standaardvelden Active, Added, AddedBy, Updated, UpdatedBy toe aan alle subklassen.
Migrations¶
Doctrine-migraties staan in _core/config/doctrine/migrations/ (georganiseerd per jaar en maand). Ze worden uitgevoerd via:
./bin/doctrine m:m -n
Nieuwe migraties worden aangemaakt met ./bin/doctrine migrations:generate (niet migrations:diff). SQL wordt handmatig geschreven. De versietabel is atx_www.doctrine_migration_versions.
Legacy DAO-laag¶
Naast Doctrine bestaat er een legacy DAO-laag die rechtstreeks PDO gebruikt. De abstracte basis is atx\GenericDAO (_core/model/dbclasses/atx/GenericDAO.php), die hulpmethoden biedt voor selectObjects, selectArray, insertObject, insertObjects, insertIgnoreObject, insertUpdateObject, updateObject, updateObjects, deleteObject, deleteObjects en een ingebouwde cache-array. Er zijn geen kale insert-, update- of delete-methoden.
DAO-klassen bevinden zich in _core/model/dbclasses/atx/ en zijn georganiseerd per domein:
| Submap | Voorbeelden |
|---|---|
articles/ |
ArticleDAO.php, ArticleSearchDAO.php, PricelistDAO.php, tyres/, wheels/, acc/, stock/ |
orders/ |
OrderDAO.php, OrderArticleDAO.php, ReservationDAO.php, TransportDAO.php |
customers/ |
(klantgerelateerde DAO's) |
channels/ |
(channelgerelateerde DAO's) |
cms/ |
TextDAO.php (vertaalteksten), PageDAO.php, TemplateDAO.php |
system/ |
SettingDAO.php (applicatie-instellingen) |
suppliers/ |
SupplierDAO.php |
logs/ |
LogUpdateDAO.php |
Een DAO bepaalt zijn tabel via de statische methode Table():
// _core/model/dbclasses/atx/cms/TextDAO.php:32
public static function Table()
{
return APP_DB_WWW . '.cms_text';
}
De DAO-laag en Doctrine bestaan naast elkaar: sommige modules (bijv. TextDAO, SettingDAO) gebruiken de legacy-laag, terwijl nieuwe modules Doctrine Repositories gebruiken.
Mermaid: datalagen¶
graph TD
Req[HTTP Request] --> ServiceReg[ServiceRegistry]
ServiceReg --> DocSvc[DoctrineService]
ServiceReg --> DAO[Legacy GenericDAO]
DocSvc --> EM[EntityManager]
EM --> XMLMap[ORM XML mappings]
DAO --> PDO[atx\\Db PDO singleton]
PDO --> MySQL[(atx_www / MySQL)]
EM --> MySQL
MySQL --> atx_log[(atx_log)]
MySQL --> atx_dwh[(atx_dwh)]
MySQL --> atx_queue[(atx_queue)]
MySQL --> atx_3d[(atx_3d)]