10: 工具和 CLI

Phlo 应用程序具有用于 build、lint、release 和 reflection 的 CLI 层。始终通过应用程序的开发入口点使用它。

10.1: 构建命令

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 应该返回一个空数组:

[]

如果 lint 报告错误,请修复 .phlo 源文件并重新构建。切勿修补生成的 PHP。

命令 返回值
build::run 触发构建;返回更改的文件路径
build::lint 转换文件中的 PHP 解析错误;空数组 = 干净
build::release 使用发布钩子转换发布构建
build::config 来自 data/app.json 的完整构建配置
build::changed 自上次构建以来更改的源文件
build::buildFiles 所有转换后的输出路径(php/ + www/
build::releaseFiles 发布构建的转换输出路径
build::flush 删除所有转换后的文件
build::traceShadow functions.php 重新生成 functions.trace.php
build::help 所有方法及其签名和描述

10.2: 反射命令

反射帮助你在更改应用程序之前理解它:

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

这些命令返回 JSON,并且旨在开发环境中使用 build: true

相同的自省驱动了 Phlo 控制中心的图形视图:您的应用程序的每个类、资源和依赖边缘,实时呈现自 reflect::graph

控制中心图形视图:您的应用程序的类、资源和依赖边缘,实时呈现自 reflect::graph

完整参考:

命令 返回
reflect::context 单次调用快照:身份、路由/视图计数、包、最近错误。最佳首选调用。
reflect::appInfo data/app.md 的内容,或 null
reflect::runtime 运行时常量:主机、路径、功能标志、自定义参数
reflect::errors [limit] 最近的运行时错误(默认 10;0 = 全部)
reflect::compactRoutes 带有文件、行、方法、依赖使用的路由图
reflect::compactViews 带有名称、文件、行的视图列表
reflect::routes 所有路由节点的完整细节和注释
reflect::views [withBody] 所有视图节点;传递 true 以获取主体
reflect::sourceFiles 所有 .phlo 源文件路径
reflect::sourceNodes [withBody] 所有源文件的完整解析 AST
reflect::fileContent <relPath> 按显示路径获取源文件内容
reflect::find <type> [name] [withBody] [scope] 一种类型的节点;范围 app/resources/all
reflect::nodeBody <name> [type] 命名节点的主体(默认类型为 method
reflect::search <query> [scope] [maxHits] [contextLines] .phlo 文件中进行文本搜索
reflect::graph 类型化后端图:节点和语义边
reflect::selectorGraph 类型化前端图:样式/脚本/选择器边
reflect::resourceDependencies <name> [transitive] [full] @ requires 获取的所需资源
reflect::fileDependencies phlo()Class:: 调用生成的每个文件依赖图
reflect::functionIndex 所有函数的签名、源、组、加载状态
reflect::objectIndex 所有资源对象的函数、属性、构造函数、元数据
reflect::resourceSummary 包计数、函数/对象总数、外部要求
reflect::resourceFiles 所有资源文件路径
reflect::availableResources 所有可发现的资源,带有类型、种类、加载状态
reflect::editorIndex 函数、对象、路由、视图的综合索引
reflect::findFunction <name> 按名称查找函数的资源条目,或 null
reflect::findClass <name> 按名称或别名查找类的资源条目,或 null
reflect::help 所有方法的签名和描述

10.3: 通用 CLI 调度

build::reflect:: 只是一个更通用机制的两个例子。Phlo 的 CLI 可以调用您应用中的 任何 static、method 或 function:

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

三种模式:

模式 调度 示例
Class::method args 类上的静态方法 tasks::run, backup::nightly
object.method args 通过 phlo(object) 的实例方法 app.heartbeat, cms.reindex
function args 全局函数 answer "question"

输出以 JSON 格式发送到 stdout,错误以非零退出代码发送到 stderr。这使得您应用中的每个例程都可以直接从 cron、部署脚本、监控或终端中使用,而无需为此构建单独的 CLI 层。

phlo_eval: 在实时应用中运行 Phlo

最强大的函数调度是 phlo_eval,它将一串 Phlo 转换并在实时应用中运行。它是 reflect:: 的运行时补充:反射读取静态源,phlo_eval 则针对真实数据、资源和视图执行。

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 %app->error('boom')"     # raw HTML, not JSON

单行自动返回就像 => 箭头主体,因此您只需编写表达式,无需 return(除非它以 return/apply/echo/unset/yield 开头);只有多行块需要自己的 returnreturn 将值作为 JSON 打印(类型安全、非标量,错误格式为 {"error": ...});echo 原样打印到 stdout,方便查看渲染的标记。

phlo_eval 以完整的应用权限运行任意代码:它可以读取机密并修改数据库。它仅限于 CLI 和构建,永远不会出现在发布/生产环境中。将其输入视为仅由开发者编写,绝不要信任。

仅在 www/app.php 中使用 build: true 可用。请勿在实时生产环境中运行。

10.4: 调试助手

phlo_app(...) 中设置 debug: true 时,Phlo 会激活一组用于开发期间检查的助手。在生产环境中,它们是无效的。

助手 目的 行为
d(...$args) 将值转储到响应中,继续运行 收集在 %res->dump 中;在请求结束时渲染到浏览器控制台。在没有 debug: true 的情况下无效
dx(...$args) 转储 + 停止 同步:完整的调试页面,包含源映射的 .phlo 文件和行号。异步/CLI/流:转储通过 apply 负载到达浏览器控制台。安全的 Worker:抛出异常而不是调用 die()
debug($msg) 将一行附加到调试日志;不带参数的 debug() 返回所有收集到的内容 记录到浏览器控制台,包含请求统计信息
error($msg, $code = 500) Phlo 异常处理程序的运行时错误 抛出 PhloException,记录在 data/errors.json
trace($node, $args) 手动跟踪事件(仅在 trace: true 时激活) 向跟踪日志添加事件,详见 Trace 章节

生命周期:助手在请求期间收集(%res->dump%res->debug);在同步页面结束时,内联脚本将所有内容记录到浏览器控制台,并附带内存、持续时间和跟踪元数据,异步响应在其 apply 负载中携带相同的数据。对象通过 objInfo() 解包。运行时错误累积在 data/errors.json 中(消息、源映射文件和行号、计数、最后一次发生);可以通过 reflect::errors 或在 Phlo Control Center 中读取它们。

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

dx() 是您在开发过程中主要的“停下来看看有什么”的工具。忘记在发布代码中添加 dx()?在 debug: false 模式下,它的行为就像 error() 一样,不会静默通过。

10.5: 工作流程

在开发环境中,Phlo Control Center(位于 /phlo)将整个循环放入浏览器中:源代码、构建、发布和错误,每个文件只需点击一下即可访问:

Phlo Control Center 源视图:每个 .phlo 文件高亮并可搜索,距离构建、发布和错误仅一步之遥

  1. 首先阅读源代码和反射输出。
  2. 仅修改 .phlodata/app.json 或入口点。
  3. 运行 build::run
  4. 运行 build::lint
  5. 测试相关的 HTTP routes。
  6. 当阶段/发布输出需要更新时,运行 build::release

10.6: 开发、阶段和生产

开发人员通常具有:

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

在 build+debug 模式下,内置控制 UI 默认位于 /phlo;在 phlo_app(...) 中使用 control: 'path' 可以选择不同的路径。阶段/生产通常在没有构建和调试的情况下运行。Web 根目录指向 release/www/

10.7: HEAD 和 async

当前运行时支持正常的 HTTP 方法,包括 HEAD。异步请求由前端资源处理,并使用与同步请求相同的 routes,除非您明确声明其他 route。

我们使用必要的cookie来使该网站正常工作。在您的许可下,我们还使用分析工具来改善网站。