1: Inleiding
Phlo is een geïntegreerd platform met zijn eigen full-stack taal. Je schrijft .phlo bronbestanden; Phlo transpileert ze naar PHP, CSS en JavaScript die je kunt openen en lezen, met elke runtime-fout die terugwijst naar de .phlo regel die je hebt geschreven. Dezelfde taal heeft vier lagen: de taal zelf, het applicatieplatform (backend resources plus de phlo.js SPA-engine), het serverplatform (FrankenPHP, de Phlo Daemon, Phlo Realtime, Phlo WhatsApp) en het operations platform (de Phlo Dashboard). Deze gids behandelt ze allemaal. De productie-release draait op een gedeelde runtime, meestal in /opt/phlo/, terwijl elke app zijn eigen bron, data, gegenereerde PHP en webroot behoudt.
1.1: Filosofie
- Bron eerst: je werkt in
.phlo, niet in gegenereerde PHP, CSS of JavaScript. - Een kleine runtime: het web entrypoint laadt
/opt/phlo/phlo.phpen start de app metphlo_app(...). - Expliciete runtime resources:
data/app.jsonselecteert welke Phlo resources een app laadt uit de runtime catalogus; app code blijft in de app. - Dev en release gescheiden: dev builds, debugt en kan auth gebruiken; release gebruikt de gegenereerde output.
- HTML, routes en gedrag dicht bij elkaar: een route, view, stijl of script kan in hetzelfde onderwerp bestand leven wanneer dat de app duidelijker maakt.
- Server-gedreven frontend: markeer een formulier
<form.async>of een link<a.async>en Phlo onderschept de submit of klik, plaatst een post naar je route, en patcht de DOM met de respons. Je schrijft routes en views, nietfetchaanroepen of client-side status.
1.2: Installatie
Phlo vereist PHP 8.3 of hoger; de CLI build draait op dezelfde PHP. Voor productie is FrankenPHP de aanbevolen runtime (ingebouwde webserver, worker modus); klassieke PHP-FPM achter Nginx werkt ook.
Haal de runtime op en scaffold je eerste app met de meegeleverde installer:
git clone https://github.com/q-ainl/phlo.git /opt/phlo
php /opt/phlo/install.php /var/www/example.nl/
De installer vraagt om een naam, host en doel, toont de runtime catalogus en laat je bronnen kiezen (hun @ requires worden automatisch inbegrepen), schrijft de entrypoint, data/app.json, data/app.md, een eerste route en .gitignore, en is pas klaar na een schone build met concrete volgende stappen.
Geef je de voorkeur aan een kopie die zichzelf opruimt? Kopieer install.php naar de nieuwe app-directory en voer het daar uit; na een succesvolle installatie verwijdert het zichzelf:
cp /opt/phlo/install.php /var/www/example.nl/ && cd /var/www/example.nl && php install.php
De volgende secties beschrijven wat de installer voor je instelt en hoe je hetzelfde handmatig kunt bouwen.
1.3: Projectstructuur
Een typische app:
/var/www/example.nl/
app.phlo
page.home.phlo
data/
app.json
auth.ini
creds.ini
php/
app.php
classmap.php
release/
www/
app.php
www/
app.php
php/, www/app.js, www/app.css en release/ zijn buildoutput. Wijzig ze alleen via de bron en bouw opnieuw.
1.4: Toegangspunt
Dev entrypoint in www/app.php:
<?php
require('/opt/phlo/phlo.php');
phlo_app (
id: 'Example',
host: 'dev.example.nl',
auth: true,
build: true,
debug: true,
app: '/var/www/example.nl/',
data: '/var/www/example.nl/data/',
);
Release entrypoint in release/www/app.php:
<?php
require('/opt/phlo/phlo.php');
phlo_app (
id: 'Example',
host: 'stage.example.nl',
app: '/var/www/example.nl/release/',
php: '/var/www/example.nl/release/',
data: '/var/www/example.nl/data/',
);1.5: Build
Tijdens de ontwikkeling worden alle gewijzigde bronnen automatisch opnieuw opgebouwd bij elke aanvraag, dus een browserherlaad is alles wat een wijziging nodig heeft. De CLI geeft dezelfde build expliciet, voor scripts, CI en agents:
php www/app.php build::run
php www/app.php build::lint
php www/app.php build::release
build::run transpileert de ontwikkelingsuitvoer, build::lint controleert de gegenereerde PHP, en build::release schrijft de release-uitvoer.
1.6: Webserver
De webserver wijst naar www/ voor ontwikkeling en naar release/www/ voor stage/productie. Onbekende paden worden herschreven naar app.php.
Voor FrankenPHP (aanbevolen) is een enkele Caddyfile-blok voldoende:
example.nl {
root * /var/www/example.nl/release/www
php_server
}
Voor Nginx:
root /var/www/example.nl/release/www;
location / {
try_files $uri $uri/ /app.php?$query_string;
}