跳转到主要内容

简介

Laravel Prompts 是一个为命令行应用添加美观易用交互式表单的 PHP 扩展包。 它提供了接近浏览器表单体验的占位符文本、校验等能力。 由于可以在 Artisan 命令代码中直接调用,因此写出的与用户交互的代码既简洁又直观。
Laravel Prompts 支持 macOS、Linux 与 Windows(WSL)。 在不支持的环境中会自动降级到备用行为。

安装

Laravel Prompts 已随 Laravel 本体一起分发,无需单独安装。 若在其他 PHP 项目中使用,通过 Composer 安装即可。

基础 Prompt 函数

text — 文本输入

text() 用来让用户输入一个字符串。
可以设置占位符、默认值和提示。
指定 required 可将输入设为必填,并自定义错误提示。
validate 闭包用来做额外校验。返回错误消息即校验失败,返回 null 表示通过。
也可以以数组形式使用 Laravel 校验规则。

textarea — 多行文本输入

textarea() 接受多行输入。

number — 数字输入

number() 用于接收数字,可通过上下方向键调整数值。

password — 密码输入

password() 用法与文本输入相同,但输入内容不会显示在屏幕上。

confirm — 是/否确认

confirm() 让用户在两个选项中做出选择,返回 truefalse
可以自定义默认值和标签文案。

select — 单选列表

select() 让用户从列表中选一个。
如果传入关联数组,返回值就是键而不是展示的标签。
scroll 用来指定滚动前显示的选项数量(默认 5)。

multiselect — 多选

multiselect() 让用户同时选择多个选项。
指定 required 可要求至少选择一个。

suggest — 带自动补全的输入

suggest() 会给出提示同时允许自由输入。
传入闭包时可以根据输入动态过滤候选项。

search — 动态检索

search() 会在用户每次输入时刷新候选列表。闭包返回的数组即为候选。

multisearch — 动态多选

multisearch() 允许在动态搜索的基础上进行多选。

pause — 暂停

pause() 用来让用户按下 Enter 键,暂停执行。

autocomplete — 内联补全

autocomplete() 会以 ghost text(灰色影子文本)形式展示候选。与 suggest() 不同的是,它在用户每次输入时以 ghost text 显示匹配项,通过 Tab 或右方向键确认补全。
同样可以设置占位符、默认值和提示。
传入闭包可根据输入动态生成候选。

校验

所有 Prompt 函数都可以通过 validate 参数进行校验。
闭包返回字符串会作为错误显示并要求重新输入。返回 null 则表示校验通过。 也可以以数组形式使用 Laravel 校验规则。
若要在校验前先转换输入,使用 transform 参数。

表单

form() 可以把多个 Prompt 打包成一个表单,用户可以在完成之前统一取消。

信息输出

以下函数用于输出带样式的信息。

Callout(提示框)

callout() 会用边框把标签和内容框起来。适合突出显示部署总结、错误详情、状态更新等重要信息。
type 参数中传入 'warning''error' 可以改变视觉样式。
通过 info 参数可以添加尾行。方便展示 ID、时间戳等元数据。

富内容

以数组代替字符串时,可以构造结构化的富内容 callout。Element 类提供了创建标题、无序列表、有序列表、键值列表和链接的工厂方法。
Element::keyValueList 可以展示带标签的数据。
在支持 OSC 8 的终端中,Element::link 可以生成可点击的超链接。可以只传 URL,也可以传 URL 和自定义标签。
省略标签时,URL 本身会作为链接文本显示。

表格显示

table() 用于以表格形式展示数据。

Spin(加载中动画)

spin() 会在闭包执行期间显示加载指示器。
使用 spin() 需要 pcntl PHP 扩展。若环境不支持,则不会显示 spinner。

进度条

progress() 可视化地展示循环处理进度。
也可以手动控制进度条。

任务(Task)

task() 会在回调执行期间显示 spinner 和可滚动的实时输出区。非常适合包装依赖安装、部署脚本等长时间任务,可实时了解发生了什么。
回调会收到一个 Logger 实例,你可以实时输出日志或状态。
task() 需要 pcntl PHP 扩展。若环境不支持,会降级为静态显示。

输出日志行

line 方法逐行写入可滚动输出区。

状态消息

successwarningerror 可以在滚动区上方展示带高亮的固定消息。

更新标签

label 方法可以在运行期间更新任务标签。subLabel 方法用来设置显示在标签下方的浅色副标签,传空字符串可清除副标签。也可以通过 subLabel 参数指定初始副标签。

流式输出文本

对于类似 AI 逐步生成响应的场景,可以用 partial 方法一段段流式输出。全部完成后调用 commitPartial 提交。

输出上限与保留总结

默认最多显示 10 行滚动输出,可以通过 limit 参数自定义。想在任务结束后仍保留状态消息,请传 keepSummary: true

Stream(流式输出)

stream() 可以将文本逐步展示到终端。非常适合展示 AI 生成的内容或分块到达的数据。
append 方法以淡入效果向流中追加文本。全部内容 stream 完毕后调用 close 完成输出并恢复光标。

终端操作

设置终端标题

传入空字符串可以恢复默认标题。

清屏

终端注意事项

终端宽度:当标签、选项或校验消息超过终端列宽时会自动截断。若面向 80 列终端,建议控制在 74 个字符以内。 终端高度:对支持 scroll 参数的 Prompt,会自动计算以留出校验消息的空间,确保能装进终端高度。

降级(Fallback)

在不支持的环境(如非 WSL 的 Windows)中会自动降级。 默认情况下会调用 Laravel 内置的 $this->ask()$this->choice() 等方法。

测试

Laravel Prompts 可以与 Pest 或 PHPUnit 结合使用。
使用 Laravel 的 Artisan 测试辅助方法,也可以对信息输出函数进行断言。

相关页面

Artisan 控制台

在 Artisan 命令中使用 Prompts
最后修改于 2026年7月18日