2: Configuratie
data/app.json beschrijft de build: welke resources worden geladen, waar de release-uitvoer naartoe gaat, en welke resources alleen in release of alleen in dev horen.
2.1: Minimale configuratie
Resources verwijzen naar de Phlo runtime catalogus. Dat is frameworkcode, geen plek voor app-specifieke bestanden. Je schrijft appcode als .phlo in het app-pad; alleen generieke runtime-functionaliteit behoort opzettelijk in de catalogus.
2.2: Hulpmiddelen
Veelgebruikte bronnen:
| Bron | Doel |
|---|---|
security/creds |
Referenties uit env- en ini-bestanden |
security/security |
Beveiligingsheaders |
security/token |
Token generatie |
payload |
Lees POST, PUT, PATCH en uploads |
session |
Sessieobject |
cookies |
Cookie-object |
DOM/form |
Asynchrone formulieren |
phlo.async |
Asynchrone frontend verzoeken |
visitors |
Heartbeat/bezoekers tracking |
useragent |
User-agent parsing |
DB/DB, DB/MySQL, DB/model |
Database en ORM |
Gebruik alleen de bronnen die de app daadwerkelijk nodig heeft. Het Phlo Control Center kan beschikbare bronnen en afhankelijkheden tonen.
2.3: Dev uitsluiten
In een lokale dev-build wil je vaak bepaalde tracking- en realtimebronnen uitsluiten:
{
"exclude": [
"visitors",
"useragent",
"wsCast"
]
}
Dit geldt voor de dev-build. De release-build gebruikt deze uitsluiting niet automatisch; bezoekerstracking kan daar dus nog steeds actief zijn.
2.4: Release
De korte vorm is voldoende:
{
"release": "%app/release/"
}
Phlo schrijft vervolgens release PHP naar release/ en webassets naar release/www/.
2.5: Paden
%app/ verwijst naar het app-pad van phlo_app(...). Houd de padconfiguratie in www/app.php en release/www/app.php zoveel mogelijk hetzelfde, zodat data/app.json betrekking heeft op het buildgedrag.
2.6: Namespaces en bundles
Elke <style> en <script> blok compileert naar een bundel per namespace. ns=docs komt terecht in www/docs.css en www/docs.js, ns=app,docs in beide bundels, en blokken zonder ns= in de standaard namespace. Een pagina selecteert zijn bundel met view(..., ns: 'docs').
Drie sleutels in data/app.json regelen dit:
{
"defaultNS": "app,docs",
"phloNS": ["app", "docs"],
"iconNS": "app"
}
defaultNS(standaard"app"): de namespace(s), door komma's gescheiden, voor middelen zonder een explicietens=. Resource-middelen (frontend-hulpmiddelen zoalsonExist, de cookiewall-stijlen) hebben geenns=, dus wanneer je pagina's meerdere namespaces gebruiken, breiddefaultNSuit zodat elke bundel ze krijgt.phloNS(standaard["app"]): de namespaces waarvan de JS-bundel de phlo.js-runtime embed. Elke namespace waarvan de pagina's zelfstandig laden, heeft de runtime nodig, dus noem ze hier allemaal.phloJS: truekeert de lijst om: de runtime gaat dan naar elke namespace die NIET inphloNSstaat.iconNS(standaard"app"): de namespace die de gegenereerde icon-sprite CSS ontvangt wanneer deiconsengine wordt gebruikt.
Twee regels houden een multi-namespace app gezond:
- Werk nooit om een ontbrekende runtime heen door
defer: '/app.js'naarview()te sturen. Bij asynchrone navigatie die de bundel opnieuw in een pagina injecteert die er al een heeft, crasht het met dubbele declaraties. Configureer in plaats daarvanphloNS. - Twee runtimes mogen nooit in één pagina samenkomen. Links die namespaces kruisen (een
apppagina die naar eendocspagina linkt) moeten gewone links zijn, zodat de browser een volledige paginalading uitvoert. Alleen links binnen dezelfde namespace krijgenclass=asyncvoor SPA-navigatie.
2.7: Gegenereerde uitvoer
Bewerk deze bestanden niet met de hand:
php/
www/app.js
www/app.css
release/
Wijzig de .phlo bron, voer build::run uit, controleer met build::lint, en maak vervolgens een release met build::release.
2.8: Inloggegevens
De security/creds resource lost geheimen (API-sleutels, database-inloggegevens, webhook-tokens) en stelt ze bloot als %creds->.... Het leest uit twee bronnen, zodat dezelfde code op een laptop en in productie zonder aanpassingen draait.
Het INI-bestand data/creds.ini is de eenvoudigste bron. Houd het buiten versiebeheer. Een eenvoudig geheim is een top-level sleutel; een gestructureerd geheim is een sectie met sub-sleutels:
OpenAI = sk-...
Claude = sk-ant-...
Grok = xai-...
[mysql]
host = 127.0.0.1
database = app
user = app
password = secret
Je leest ze als %creds->OpenAI (een scalar) en %creds->mysql->host (genest).
Omgevingsvariabelen bieden dezelfde waarden zonder een bestand, wat geschikt is voor CI en containers. De prefix PHLO__ markeert een credential, en __ scheidt de geneste niveaus:
PHLO__OpenAI=sk-...
PHLO__mysql__host=127.0.0.1
Een host-gebonden vorm, PHLO_<HOST>__..., geldt alleen op een bijpassende host. <HOST> is de aanvraaghost in hoofdletters met elke niet-alfanumerieke omgezet in _, zodat factuur.software FACTUUR_SOFTWARE wordt:
PHLO_FACTUUR_SOFTWARE__OpenAI=sk-...
Bronnen worden in volgorde samengevoegd, waarbij elke de vorige overschrijft: eerst data/creds.ini, dan PHLO__ globals, en dan host-gebonden PHLO_<HOST>__ bovenop. Dus een host-gebonden variabele wint van een globale, die wint van het ini-bestand.
Een resource verklaart wat het nodig heeft met @ requires: creds:<name> (bijvoorbeeld creds:OpenAI, creds:mysql). Die regel is informatief: het documenteert de sleutel, het creëert deze niet. Waarden worden als gevoelig opgeslagen, zodat %creds ze maskeert in debug-uitvoer.