Skip to main content

前言

Laravel Prompts 是為命令列應用程式加入美觀好用的互動式表單的 PHP 套件。 提供類似瀏覽器表單的體驗,如佔位文字、驗證等。 由於可直接在 Artisan 指令的程式碼中呼叫,能簡潔而直覺地寫出對使用者的問答。
Laravel Prompts 支援 macOS、Linux、Windows(WSL)。 在不支援的環境會自動切換為 fallback 行為。

安裝

Laravel Prompts 已隨 Laravel 本體一併提供,無需另行安裝。 若要在其他 PHP 專案使用,可透過 Composer 安裝:

基本 prompt 函式

text — 文字輸入

text() 要求使用者輸入字串。
可設定佔位文字、預設值、提示:
指定 required 可將輸入設為必填。也可自訂驗證訊息。
可用 validate closure 追加驗證。回傳錯誤訊息,或於合格時回傳 null
也可以以陣列形式指定 Laravel 的驗證規則。

textarea — 多行文字輸入

textarea() 接受多行輸入。

number — 數字輸入

number() 接受數字。可用上下方向鍵增減值。

password — 密碼輸入

password() 與文字輸入類似,但輸入內容不會顯示在畫面上。

confirm — Yes/No 確認

confirm() 讓使用者做二擇一的確認。回傳 truefalse
可自訂預設值與標籤文字。

select — 選擇清單

select() 讓使用者從清單中選一個。
使用關聯陣列時,回傳值會是 key 而非顯示的 label。
可用 scroll 變更卷動前顯示的選項數量(預設 5 個)。

multiselect — 複選

multiselect() 讓使用者同時選多個選項。
指定 required 可要求至少選一個。

suggest — 附自動完成的輸入

suggest() 在提供候選的同時也接受自由輸入。
傳入 closure 可依輸入內容動態篩選候選。

search — 動態搜尋

search() 會在每次輸入時更新候選清單。closure 回傳的陣列即為候選。

multisearch — 動態複選

multisearch() 可透過動態搜尋進行複選。

pause — 暫停

pause() 提示使用者按下 Enter 鍵,暫停處理流程。

autocomplete — 行內補全

autocomplete() 是以 ghost text 顯示候選的行內補全函式。與 suggest() 不同,使用者每次輸入時符合的候選會以 ghost text 顯示,按 Tab 或右方向鍵即可確定補全。
可設定佔位文字、預設值、提示。
傳入 closure 可依輸入內容動態產生候選。

驗證

所有 prompt 函式皆可透過 validate 引數設定驗證。
若 closure 回傳字串會顯示為錯誤,提示重新輸入。回傳 null 表示驗證通過。 也可以陣列形式使用 Laravel 的驗證規則。
要在驗證前轉換輸入,可使用 transform 引數。

Form

使用 form() 可將多個 prompt 合為一組,在完成前可整批取消。

資訊輸出

提供帶樣式輸出文字訊息的函式。

Callout

callout() 會將標籤與內容以框線顯示。適合突出顯示部署摘要、錯誤詳情、狀態更新等重要資訊。
type 引數指定 'warning''error',可變更視覺樣式。
可用 info 引數加入頁尾行。便於顯示 ID 或時間戳等中繼資料。

豐富內容

以陣列取代字串,可製作結構化的豐富 callout。Element 類別提供建立標題、項目符號清單、編號清單、鍵值清單與連結的 factory 方法。
Element::keyValueList 顯示附標籤的資料。
Element::link 會在支援 OSC 8 的終端機中產生可點擊的超連結。可只傳 URL,或傳 URL 加自訂 label。
若省略 label,URL 會作為連結文字顯示。

表格顯示

table() 可以表格形式顯示資料。

Spin(載入顯示)

spin() 會在 closure 執行期間顯示載入指示器。
使用 spin() 需要 pcntl PHP 擴充功能。在無法使用的環境中不會顯示 spinner。

進度條

progress() 可視覺化顯示反覆處理的進度。
也可以手動控制進度條。

Task

task() 會在 callback 執行期間顯示 spinner 與可捲動的即時輸出區域。非常適合包裝依賴安裝或部署腳本等長時間執行的處理,可即時看到發生的事。
callback 會收到 Logger 實例,可即時顯示日誌行或狀態訊息。
使用 task() 需要 pcntl PHP 擴充功能。在無法使用的環境中會 fallback 為靜態顯示。

輸出日誌行

line 方法逐行寫入捲動輸出區。

狀態訊息

使用 successwarningerror 可在捲動日誌區的上方顯示固定的高亮訊息。

更新標籤

label 方法可在執行中更新任務標籤。subLabel 方法會設定顯示在標籤下方的淡色 sub label。傳入空字串可清除 sub label。也能用 subLabel 引數指定初始 sub label。

文字串流

對於像 AI 生成回應那樣階段性產生的輸出,可用 partial 方法逐個串流文字。串流完成後呼叫 commitPartial 進行確定。

輸出上限與 summary 的保留

預設最多顯示 10 行捲動輸出。可用 limit 引數自訂。若要在任務完成後仍將狀態訊息保留在畫面上,可傳入 keepSummary: true

Stream

stream() 會將文字階段性顯示到終端機。適合顯示 AI 生成內容或以 chunk 形式抵達的資料。
append 方法會以 fade-in 效果將文字加入 stream。所有內容 stream 完後呼叫 close,即可確定輸出並復原游標。

終端機操作

設定終端機標題

傳入空字串可重設為預設標題。

清除終端機

終端機相關考量

終端機寬度:當標籤、選項、驗證訊息超過終端機欄數時,會自動被截斷。若以 80 欄為前提,建議控制在 74 字元以內。 終端機高度:接受 scroll 引數的 prompt 會自動調整值,使其含驗證訊息空間也能容納於終端機高度內。

Fallback

在不支援的環境(如 Windows non-WSL)會自動 fallback。 預設會改用 Laravel 的 $this->ask()$this->choice() 等內建方法。

測試

Laravel Prompts 可與 Pest 或 PHPUnit 的測試整合。
使用 Laravel 的 Artisan 測試 helper,也能對資訊輸出函式撰寫斷言。

相關頁面

Artisan Console

在 Artisan 指令中活用 Prompts
最後修改於 2026年8月2日