laravel/prompts 安装后不能直接使用,因其无服务提供者且不自动注册命令,需在 Artisan 命令的 handle() 中显式调用 Prompt::xxx() 静态方法,并注意终端兼容性与中断处理。

Composer 安装 laravel/prompts 很简单,但直接 composer require laravel/prompts 后常发现命令行没反应、样式错乱、或提示“class not found”——根本原因不是装错了,而是它**不自动注册服务提供者,也不自带命令绑定**,得手动接入。
为什么 composer require laravel/prompts 装完不能直接用
这个包是纯工具函数库,没有 ServiceProvider,不往 Laravel 的命令生命周期里注入任何东西。它只提供一堆静态方法(比如 Prompt::confirm()、Prompt::search()),你得在自己的 Artisan 命令里显式调用。
- 装完后不会自动出现在
php artisan list里 - 不会覆盖默认的
$this->ask()等方法,那些还是原生 Laravel 的朴素输入 - 如果你在非 Laravel 环境(比如纯 PHP CLI 脚本)里用,也完全没问题,但得自己处理颜色支持和终端兼容性
在 Laravel Artisan 命令中正确调用 Prompt 类
必须确保使用了 use Laravel\Prompts\Prompt;,且调用发生在命令执行逻辑中(比如 handle() 方法内),而不是构造函数或属性初始化阶段。
- 别写成
protected $prompt = Prompt::confirm(...)—— 属性初始化时终端可能还没就绪,会报STDIN is not a TTY - 推荐写法:
$continue = Prompt::confirm('继续?', default: true); - 如果项目用了 Laravel 11+,注意
Prompt默认依赖系统支持真彩色(24-bit),老旧终端(如 Windows 7 cmd)可能显示异常,可加force: true强制启用 ANSI
常见终端兼容性问题与绕过方式
laravel/prompts 依赖 symfony/console 的输出能力,但某些环境(Docker 容器、CI 流水线、Git Bash)会误判为非交互终端,导致所有提示直接跳过或报错。
- 错误现象:
Prompt::text()立刻返回空字符串,无等待;或抛出RuntimeException: Aborted. - 检查方式:运行
php -r "var_dump(stream_isatty(STDIN));",返回false就是终端未被识别 - 临时解决:在命令启动前加环境变量
PHP_CLI_PROMPT_FORCE=1,或代码中调用前设$_SERVER['TERM'] = 'xterm-256color'; - CI 场景建议:改用
if ($this->confirm('...'))这类 Laravel 原生方法兜底,别强依赖Prompt
最常被忽略的是:它不处理 Ctrl+C 中断后的清理,连续多次调用 Prompt::multiselect() 可能残留光标位置错乱——这不是 bug,是设计使然;真要健壮,得自己捕获 Illuminate\Console\Events\ArtisanStarting 或封装一层重试逻辑。


















