10: Gereedschap & CLI

Phlo-apps hebben een CLI-laag voor build, lint, release en reflection. Gebruik het altijd via de dev entrypoint van de app.

10.1: Bouwopdrachten

php www/app.php build::run
php www/app.php build::lint
php www/app.php build::release
php www/app.php build::config
php www/app.php build::changed

build::lint zou een lege array moeten retourneren:

[]

Als lint fouten rapporteert, corrigeer dan de .phlo bron en bouw opnieuw. Patch nooit de gegenereerde PHP.

Commando Retourneert
build::run Triggers een build; retourneert gewijzigde bestands paden
build::lint PHP parse fouten in getranspileerde bestanden; lege array = schoon
build::release Transpiles een release build met release hooks
build::config Volledige buildconfiguratie van data/app.json
build::changed Bronnen bestanden die zijn gewijzigd sinds de laatste build
build::buildFiles Alle getranspileerde uitvoer paden (php/ + www/)
build::releaseFiles Getranspileerde uitvoer paden voor de release build
build::flush Verwijdert alle getranspileerde bestanden
build::traceShadow Regenerates functions.trace.php van functions.php
build::help Alle methoden met handtekeningen en beschrijvingen

10.2: Reflect commando's

Reflectie helpt je een app te begrijpen voordat je deze wijzigt:

php www/app.php reflect::context
php www/app.php reflect::compactRoutes
php www/app.php reflect::compactViews
php www/app.php reflect::resourceSummary
php www/app.php reflect::objectIndex
php www/app.php reflect::functionIndex

Deze commando's retourneren JSON en zijn bedoeld voor ontwikkelomgevingen met build: true.

Dezelfde introspectie stuurt de Graph view van het Phlo Control Center: elke klasse, resource en afhankelijkheidsrand van je app, live weergegeven vanuit reflect::graph:

De Control Center Graph view: de klassen, resources en afhankelijkheidsranden van je app, live weergegeven vanuit reflect::graph

Volledige referentie:

Commando Retourneert
reflect::context Snapshot van een enkele oproep: identiteit, route/view tellingen, pakketten, recente fouten. Beste eerste oproep.
reflect::appInfo Inhoud van data/app.md, of null
reflect::runtime Runtime constanten: host, paden, functie-vlaggen, aangepaste parameters
reflect::errors [limit] Recente runtime-fouten (standaard 10; 0 = alles)
reflect::compactRoutes Routekaart met bestand, regel, methode, afhankelijkheidsgebruik
reflect::compactViews Lijst van views met naam, bestand, regel
reflect::routes Alle routeknopen met volledige details en opmerkingen
reflect::views [withBody] Alle viewknopen; geef true door voor lichamen
reflect::sourceFiles Alle .phlo bronbestands paden
reflect::sourceNodes [withBody] Volledige geparseerde AST van alle bronbestanden
reflect::fileContent <relPath> Inhoud van het bronbestand op basis van het weergavepad
reflect::find <type> [name] [withBody] [scope] Knopen van een type; scope app/resources/all
reflect::nodeBody <name> [type] Lichaam van een benoemde knoop (standaard type method)
reflect::search <query> [scope] [maxHits] [contextLines] Tekstzoekopdracht in .phlo bestanden
reflect::graph Typed backend grafiek: knopen en semantische randen
reflect::selectorGraph Typed frontend grafiek: stijl/script/selector randen
reflect::resourceDependencies <name> [transitive] [full] Vereiste resources van @ requires
reflect::fileDependencies Afhankelijkheidskaart per bestand van phlo() en Class:: oproepen
reflect::functionIndex Alle functies met handtekeningen, bron, groep, laadstatus
reflect::objectIndex Alle resource-objecten met methoden, props, constructor, metadata
reflect::resourceSummary Pakket tellingen, functie/object totalen, externe vereisten
reflect::resourceFiles Alle resource-bestandspaden
reflect::availableResources Alle ontdekbare resources met type, soort, laadstatus
reflect::editorIndex Gecombineerde index van functies, objecten, routes, views
reflect::findFunction <name> Resource-invoer voor een functie op naam, of null
reflect::findClass <name> Resource klasse-invoer op naam of alias, of null
reflect::help Alle methoden met handtekeningen en beschrijvingen

10.3: General CLI dispatch

build:: and reflect:: are just two examples of a more general mechanism. Phlo's CLI can call any static, method or function in your app:

php www/app.php tasks::run                   # static method on a class
php www/app.php app.heartbeat                # method on a Phlo instance
php www/app.php answer "is an eel a fish"   # global function

Three patterns:

Pattern Dispatch Example
Class::method args Static method on the class tasks::run, backup::nightly
object.method args Instance method via phlo(object) app.heartbeat, cms.reindex
function args Global function answer "question"

Output goes to stdout as JSON, errors go to stderr with a non-zero exit code. That makes every routine in your app directly usable from cron, deploy scripts, monitoring or a terminal, without building a separate CLI layer for it.

phlo_eval: run Phlo against the live app

The most powerful function dispatch is phlo_eval, which transpiles a string of Phlo and runs it in the live app. It is the runtime complement to reflect::: reflection reads the static source, phlo_eval executes against real data, resources and views.

php www/app.php phlo_eval "user::recordCount()"          # 38, no return keyword
php www/app.php phlo_eval "%app->title"                  # "App"
php www/app.php phlo_eval "echo '<strong>boom</strong>'" # raw HTML, not JSON

A single line auto-returns like a => arrow body, so you write just the expression, no return (unless it starts with return/apply/echo/unset/yield); only a multiline block needs its own return. return prints the value as JSON (type-safe, non-scalar, errors as {"error": ...}); echo prints raw to stdout, handy for viewing rendered markup as-is.

phlo_eval runs arbitrary code with full app privileges: it can read secrets and mutate the database. It is CLI-only and build-only, never present in release/production. Treat its input as developer-authored only, never untrusted.

Only available with build: true in www/app.php. Do not run against a live production environment.

10.4: Debug helpers

Met debug: true in phlo_app(...) activeert Phlo een set helpers voor inspectie tijdens de ontwikkeling. In productie zijn ze inactief.

Helper Doel Gedrag
d(...$args) Waarden dumpen in de respons, doorgaan met uitvoeren Verzameld in %res->dump; weergegeven in de browserconsole aan het einde van het verzoek. Inactief zonder debug: true
dx(...$args) Dump + STOP Sync: volledige debugpagina met het source-mapped .phlo bestand en regel. Async/CLI/streaming: de dump komt in de browserconsole via de apply payload. Worker-veilig: gooit in plaats van die() aan te roepen
debug($msg) Voeg een regel toe aan het debuglog; debug() zonder argumenten retourneert alles wat is verzameld Gelogd in de browserconsole met de verzoekstatistieken
error($msg, $code = 500) Runtimefout voor de Phlo-exceptiehandler Gooit een PhloException, gelogd in data/errors.json
trace($node, $args) Handmatige traceer gebeurtenis (alleen actief met trace: true) Voegt een gebeurtenis toe aan het traceerlog, zie het Trace-hoofdstuk

De levenscyclus: helpers verzamelen tijdens het verzoek (%res->dump, %res->debug); aan het einde van een sync-pagina logt een inline script alles naar de browserconsole samen met geheugen-, duur- en trace-metadata, en async-responsen dragen dezelfde gegevens in hun apply payload. Objecten worden uitgepakt via objInfo(). Runtimefouten worden verzameld in data/errors.json (bericht, source-mapped bestand en regel, aantal, laatste optreden); lees ze met reflect::errors of in het Phlo Control Center.

method buildReport {
	$data = $this->load
	debug('loaded', count: count($data))
	if (!$data) error('No data to report')
	dx($data[0])
}

dx() is je primaire "stop en kijk naar wat er is" tool tijdens de ontwikkeling. Vergeet je een dx() in de code die naar release gaat? In debug: false modus gedraagt het zich net als error(), zonder stille doorgang.

10.5: Workflow

In een ontwikkelomgeving plaatst het Phlo Control Center (op /phlo) deze hele lus in de browser: source, build, release en fouten, met elk bestand één klik verwijderd:

De Phlo Control Center source view: elk .phlo-bestand gemarkeerd en doorzoekbaar, één klik van build, release en fouten

  1. Lees eerst de source en de reflection output.
  2. Wijzig alleen .phlo, data/app.json of entrypoints.
  3. Voer build::run uit.
  4. Voer build::lint uit.
  5. Test de relevante HTTP routes.
  6. Voer build::release uit wanneer de stage/release output moet worden bijgewerkt.

10.6: Ontwikkeling, staging en productie

Dev heeft doorgaans:

auth: true,
build: true,
debug: true,

In build+debug-modus bevindt de ingebouwde controle-UI zich standaard op /phlo; gebruik control: 'path' in phlo_app(...) om een ander pad te kiezen. Staging/productie draait doorgaans zonder build en zonder debug. De webroot wijst naar release/www/.

10.7: HEAD and async

The current runtime supports the normal HTTP methods, including HEAD. Async requests are handled by the frontend resource and use the same routes as sync requests, unless you explicitly declare a route otherwise.


Reference. The core resources are documented per node in the Manual, generated from the resource files so it never drifts from the code.

Laatst bijgewerkt op 23-08-2026

We gebruiken essentiële cookies om deze site te laten werken. Met uw toestemming gebruiken we ook analytics om de site te verbeteren.