1: Instellen
In deze tutorial bouw je Phlo Poll: een kleine poll-app die vraagt "Welke stack wint?". Je begint met een lege map en eindigt met een gestylede, meertalige, realtime poll. Elk hoofdstuk voegt een laag toe: een route, een view, CSS, data, stemmen, async updates, vertalingen en live resultaten. In dit eerste hoofdstuk installeer je Phlo, schrijf je je eerste route en zie je deze in de browser.
1.1: Installeer met Docker
De snelste manier om Phlo uit te voeren is de officiële Docker-image. Het bevat PHP, de FrankenPHP-webserver en de Phlo-engine op /phlo. Scaffold een nieuwe app in ./app:
docker run -it -v $(pwd)/app:/app ghcr.io/q-ainl/phlo php /phlo/install.php /app
De installer stelt een paar vragen. Beantwoord ze als volgt:
App name: Poll
Host: localhost
Purpose (one line): Which stack wins?
Resources (comma-separated, empty for none): <druk op enter>
Create "Poll" in /app for host localhost? y
Laat de resources voorlopig leeg; je voegt ze toe wanneer de app ze nodig heeft. De installer genereert de projectstructuur (app.phlo, www/app.php, data/app.json) en eindigt met een schone build, zodat je altijd met een schone lei begint.
1.2: Start de server
Voer dezelfde afbeelding uit als een webserver:
docker run -p 80:80 -v $(pwd)/app:/app ghcr.io/q-ainl/phlo
Open http://localhost in je browser. Je ziet de tijdelijke startpagina met de app-naam en je eenregelige doel. Die pagina komt van de gestructureerde app.phlo, die al een route, een view en een stijlblok bevat. Laat het zoals het is; de poll krijgt zijn eigen bestand.
1.3: Je eerste route
Elke .phlo-bestand compileert naar precies één PHP-klasse, genoemd naar het bestand. Maak app/poll.phlo (naast app.phlo) met één regel:
route GET hello => view('Hello')
Drie dingen om op te letten:
- Routepaden gebruiken spaties, geen schuine strepen.
route GET poll votekomt overeen met/poll/vote. - Geen puntkomma's. Een regelafsluiting beëindigt een verklaring in Phlo.
view(...)rendert en beëindigt. Een route moet eindigen inview(),apply(), oflocation(). Een blote returnwaarde wordt weggegooid, dusroute GET hello => 'Hello'zou overeenkomen maar een lege pagina renderen.
Routes van alle bestanden worden automatisch verzameld; de gestructureerde app.phlo activeert ze met app::route(). Sla het bestand op en herlaad de browser: er gaat niets mis, de nieuwe route is gewoon nog niet gebouwd.
1.4: Bouw en controleer
In ontwikkeling (build: true) bouwt Phlo gewijzigde bronnen bij elke aanvraag opnieuw, dus het opnieuw laden van de browser is meestal voldoende. De CLI geeft je dezelfde build expliciet, plus een lintcontrole. De CLI draait binnen de container, omdat www/app.php naar de engine op /phlo wijst:
docker run --rm -v $(pwd)/app:/app ghcr.io/q-ainl/phlo php /app/www/app.php build::run
docker run --rm -v $(pwd)/app:/app ghcr.io/q-ainl/phlo php /app/www/app.php build::lint
De eerste opdracht print de bestanden die het heeft gecompileerd:
["*app.php","+poll.php","*classmap.php","*sourcemap.php"]
Voer het opnieuw uit en het retourneert []: alles is gebouwd, er is niets veranderd. build::lint moet ook [] retourneren; dat betekent dat de gecompileerde PHP schoon wordt geparsed. Voortaan schrijven de hoofdstukken de korte vorm php www/app.php build::run; prefix het met de Docker-opdracht hierboven als je de Docker-setup gebruikt.
Open nu http://localhost/hello. De browser toont een minimale pagina met de tekst Hello. Eén regel van Phlo, één route, één pagina. In het volgende hoofdstuk vervang je het door een echte view.