1: 设置
在本教程中,您将构建 Phlo Poll:一个小型投票应用程序,询问“哪个技术栈获胜?”。您从一个空文件夹开始,最终得到一个样式化的、多语言的、实时的投票应用。每一章都增加一层:一个 route,一个 view,CSS,数据,投票,async 更新,翻译和实时结果。在第一章中,您将安装 Phlo,编写您的第一个 route,并在浏览器中查看它。
1.1: 使用 Docker 安装
运行 Phlo 的最快方法是使用官方 Docker 镜像。它包含 PHP、FrankenPHP 网络服务器和位于 /phlo 的 Phlo 引擎。将一个新应用程序搭建到 ./app 中:
docker run -it -v $(pwd)/app:/app ghcr.io/q-ainl/phlo php /phlo/install.php /app
安装程序会询问几个问题。请这样回答:
App name: Poll
Host: localhost
Purpose (one line): Which stack wins?
Resources (comma-separated, empty for none): <press enter>
Create "Poll" in /app for host localhost? y
现在将资源留空;当应用程序需要它们时再添加。安装程序会生成项目结构(app.phlo、www/app.php、data/app.json),并以干净的构建完成,因此您总是从零开始。
1.2: 启动服务器
作为网络服务器运行相同的镜像:
docker run -p 80:80 -v $(pwd)/app:/app ghcr.io/q-ainl/phlo
在浏览器中打开 http://localhost。您会看到带有应用名称和您的单行目的的占位符主页。该页面来自于已搭建的 app.phlo,其中已经包含了一个 route、一个 view 和一个样式块。保持原样;投票将有自己的文件。
1.3: 您的第一个 route
每个 .phlo 文件编译为一个 PHP 类,名称与文件相同。创建 app/poll.phlo(与 app.phlo 在同一目录下),内容为一行:
route GET hello => view('Hello')
需要注意三点:
- 路由路径使用空格,而不是斜杠。
route GET poll vote匹配/poll/vote。 - 没有分号。 行结束符在 Phlo 中终止语句。
view(...)渲染并终止。 路由必须以view()、apply()或location()结束。裸返回值会被丢弃,因此route GET hello => 'Hello'会匹配但渲染一个空页面。
来自所有文件的路由会自动收集;脚手架生成的 app.phlo 使用 app::route() 激活它们。保存文件并重新加载浏览器:没有任何错误,新路由只是尚未构建。
1.4: 构建和检查
在开发中(build: true),Phlo 会在每个请求时重建更改的源代码,因此重新加载浏览器通常就足够了。CLI 明确提供相同的构建,并进行 lint 检查。CLI 在容器内运行,因为 www/app.php 指向位于 /phlo 的引擎:
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
第一个命令打印它编译的文件:
["*app.php","+poll.php","*classmap.php","*sourcemap.php"]
再次运行它时返回 []:一切都已构建,没有更改。build::lint 也必须返回 [];这意味着编译后的 PHP 可以干净地解析。从这里开始,各章将使用简短形式 php www/app.php build::run;如果您使用 Docker 设置,请在前面加上上述 Docker 命令。
现在打开 http://localhost/hello。浏览器显示一个包含文本 Hello 的最小页面。一行 Phlo,一个路由,一个页面。在下一章中,您将用一个真实的视图替换它。