1. Opzet code

Toolbox is modulair opgebouwd. Dit houdt concreet in dat functionaliteiten opgesplitst zijn in onderdelen - modules.

Deze modules kunnen afhankelijk van elkaar zijn, maar dit is altijd een eenzijdige relatie zijn. Concreet is bijvoorbeeld de factuur-module afhankelijk van de klant-module. Echter heeft de klant-module geen weet van de factuur-module.

De structuur ziet er als volgt uit:

bin

Bevat scripts voor achtergrondtaken, aanmaken van omgevingen, compileren van less-naar-css en meer.

config

Configuratiebestanden.
'config-local.php' is het configuratiebestand voor de huidige installatie
'config.php' bevat generieke configuratie-instellingen. Deze zijn statisch.

context

Het is mogelijk meerdere omgevingen te hebben in 1 installatie. Deze map is een mogelijkheid om Php-code uit te voeren voor een specifieke omgeving.

doc

Beknopte documentatie die gebruikt kan worden bij installatie.

modules

Modules waaruit Toolbox is opgebouwd.

node_modules

Modules NodeJS. Gebruikt voor less

test

Aantal unit-codes

vendor

Composer-map

www

Bootstrap en publieke bestanden


2. Bootstrap

Het is mogelijk Toolbox in een stand-alone modus te draaien, of in een gedeelde omgeving. Met de gedeelde omgeving is het mogelijk meerdere omgevingen te bedienen.

De applicatie start in: www/index.php.
Als het een stand-alone variant is, wordt vervolgens www/start.php aangeroepen.

Vervolgens wordt er een zogeheten 'FilterChain' aangemaakt, en worden de 'Filter's aangeroepen.
Deze filters kijken welke modules zijn geactiveerd, maken verbinding met de database, bepalen de route en voeren de betreffende php-code uit.


3. Modules

In de Context-class wordt bijgehouden welke module-directories er zijn. In de config-local.php kan b.v. een extra module-directory worden toegevoegd middels: ctx()->addModuleDir($dir)

Bij het starten worden alle directories nagelopen en gekeken naar de 'meta.php'. Als een module geactiveerd/enabled is, wordt de 'modules/<module-naam>/autoload.php geladen.

Vanuit deze autoload.php wordt voor de betreffende module alle hooks aangemaakt, updates uitgevoerd, javascript & html toegevoegd, etc.

4. Module opzet

5. Routing

Routing wordt geregeld door de \core\filter\RouteFilter-class.

De volgende url-variabelen bepalen de route:

m - module
c - controller
a - action

6. Classes

6.1 ObjectContainer

De ObjectContainer wordt gebruikt voor het aanmaken van classes. Er wordt geen gebruik gemaakt van Inversion-Of-Control/Dependency Injection, om de flow van programmeercode eenvoudig te houden.

Als een class de interface 'ObjectHookable' implementeerd, wordt er een proxy aangemaakt, wat events genereert bij het aanroepen van functies.

Voor de classes die de '\core\service\ServiceBase'-class implementeren wordt ook automatisch een proxy aangemaakt, en een database transactie gestart. Als de functie voltooid is, wordt automatisch een sql COMMIT-statement aangeroepen. Hierdoor zijn alle database acties in Toolbox transactioneel.

Om makkelijk gebruik te maken vd object-container zijn er helper functies,
object_container_get( ... );
object_container_create( ... );

6.2 BaseController

Controller classes handelen web-requests af. Deze interpreteren GET/POST-requests en sturen ze door naar de betreffende Service-classes.

6.3 ServiceBase

Service-classes bevatten de business-logica. Deze classes moeten worden aangemaakt via de ObjectContainer en zijn transactioneel.

6.4 BaseForm

Formulieren kunnen worden opgebouwd middels de 'BaseForm'-classes te implementeren. Zie bestaande modules voor de voorbeelden.

Er is ook een formulieren-generator waarmee formulieren kunnen worden gebouwd. Zie Codegen => Forms => Forms generator

Ook kunnen er validators worden toegevoegd, waarmee de invoer van 't formulier gecontroleerd wordt.

De filosofie is dat men vrij is zelf invulling te geven - per module - hoe formulieren worden gemaakt. Dit mag dus ook middels een andere weg zijn.