Prompts
번역일: 2026년 6월 20일
Prompts
소개
Laravel Prompts는 커맨드라인 애플리케이션에 플레이스홀더 텍스트, 유효성 검사 등 브라우저와 유사한 기능을 갖춘 아름답고 사용하기 편한 입력 폼을 추가할 수 있는 PHP 패키지입니다.
Laravel Prompts는 Artisan 콘솔 커맨드에서 사용자 입력을 받을 때 특히 유용하지만, 일반적인 커맨드라인 PHP 프로젝트에서도 활용할 수 있습니다.
NOTE
Laravel Prompts는 macOS, Linux, 그리고 WSL이 설치된 Windows 환경을 지원합니다. 자세한 내용은 미지원 환경과 폴백 섹션을 참고하세요.
설치
Laravel Prompts는 최신 버전의 Laravel에 기본으로 포함되어 있습니다.
다른 PHP 프로젝트에서 사용하려면 Composer로 설치할 수 있습니다.
composer require laravel/prompts사용 가능한 프롬프트
Text
text 함수는 사용자에게 질문을 표시하고 입력값을 받아 반환합니다.
use function Laravel\Prompts\text;
$name = text('이름이 무엇인가요?');플레이스홀더, 기본값, 힌트 텍스트도 지정할 수 있습니다.
$name = text(
label: '이름이 무엇인가요?',
placeholder: '예) 홍길동',
default: $user?->name,
hint: '이 이름은 프로필에 표시됩니다.'
);필수 입력
입력값을 반드시 받아야 할 경우 required 인수를 전달합니다.
$name = text(
label: '이름이 무엇인가요?',
required: true
);유효성 검사 메시지를 직접 지정하고 싶다면 문자열을 전달합니다.
$name = text(
label: '이름이 무엇인가요?',
required: '이름은 필수 입력 항목입니다.'
);추가 유효성 검사
더 복잡한 유효성 검사가 필요하다면 validate 인수에 클로저를 전달합니다.
$name = text(
label: '이름이 무엇인가요?',
validate: fn (string $value) => match (true) {
strlen($value) < 3 => '이름은 최소 3자 이상이어야 합니다.',
strlen($value) > 255 => '이름은 255자를 초과할 수 없습니다.',
default => null
}
);클로저는 입력된 값을 받아 오류 메시지를 반환하거나, 유효성 검사를 통과하면 null을 반환합니다.
Laravel의 유효성 검사기를 활용할 수도 있습니다. validate 인수에 속성명과 유효성 검사 규칙 배열을 전달하면 됩니다.
$name = text(
label: '이름이 무엇인가요?',
validate: ['name' => 'required|max:255|unique:users']
);Textarea
textarea 함수는 사용자에게 질문을 표시하고 여러 줄 입력을 받아 반환합니다.
use function Laravel\Prompts\textarea;
$story = textarea('이야기를 입력해 주세요.');플레이스홀더, 기본값, 힌트 텍스트도 지정할 수 있습니다.
$story = textarea(
label: '이야기를 입력해 주세요.',
placeholder: '옛날 옛날에...',
hint: '이 내용은 프로필에 표시됩니다.'
);필수 입력
입력값을 반드시 받아야 할 경우 required 인수를 전달합니다.
$story = textarea(
label: '이야기를 입력해 주세요.',
required: true
);유효성 검사 메시지를 직접 지정하려면 문자열을 전달합니다.
$story = textarea(
label: '이야기를 입력해 주세요.',
required: '이야기는 필수 입력 항목입니다.'
);추가 유효성 검사
validate 인수에 클로저를 전달해 추가 유효성 검사를 수행할 수 있습니다.
$story = textarea(
label: '이야기를 입력해 주세요.',
validate: fn (string $value) => match (true) {
strlen($value) < 250 => '이야기는 최소 250자 이상이어야 합니다.',
strlen($value) > 10000 => '이야기는 10,000자를 초과할 수 없습니다.',
default => null
}
);Laravel의 유효성 검사기를 사용할 수도 있습니다.
$story = textarea(
label: '이야기를 입력해 주세요.',
validate: ['story' => 'required|max:10000']
);Password
password 함수는 text 함수와 유사하지만, 사용자가 입력하는 내용이 콘솔에서 마스킹 처리됩니다. 비밀번호 같은 민감한 정보를 입력받을 때 사용합니다.
use function Laravel\Prompts\password;
$password = password('비밀번호를 입력해 주세요.');플레이스홀더와 힌트 텍스트도 지정할 수 있습니다.
$password = password(
label: '비밀번호를 입력해 주세요.',
placeholder: 'password',
hint: '최소 8자 이상이어야 합니다.'
);필수 입력
입력값을 반드시 받아야 할 경우 required 인수를 전달합니다.
$password = password(
label: '비밀번호를 입력해 주세요.',
required: true
);유효성 검사 메시지를 직접 지정하려면 문자열을 전달합니다.
$password = password(
label: '비밀번호를 입력해 주세요.',
required: '비밀번호는 필수 입력 항목입니다.'
);추가 유효성 검사
validate 인수에 클로저를 전달해 추가 유효성 검사를 수행할 수 있습니다.
$password = password(
label: '비밀번호를 입력해 주세요.',
validate: fn (string $value) => match (true) {
strlen($value) < 8 => '비밀번호는 최소 8자 이상이어야 합니다.',
default => null
}
);Laravel의 유효성 검사기를 사용할 수도 있습니다.
$password = password(
label: '비밀번호를 입력해 주세요.',
validate: ['password' => 'min:8']
);Confirm
사용자에게 "예/아니오" 형태의 확인을 받고 싶을 때는 confirm 함수를 사용합니다. 화살표 키 또는 y, n 키로 선택할 수 있으며, true 또는 false를 반환합니다.
use function Laravel\Prompts\confirm;
$confirmed = confirm('이용약관에 동의하시나요?');기본값, "예"/"아니오" 레이블 텍스트, 힌트도 지정할 수 있습니다.
$confirmed = confirm(
label: '이용약관에 동의하시나요?',
default: false,
yes: '동의합니다',
no: '동의하지 않습니다',
hint: '계속 진행하려면 약관에 동의해야 합니다.'
);"예" 선택 강제
사용자가 반드시 "예"를 선택해야 하는 경우 required 인수를 전달합니다.
$confirmed = confirm(
label: '이용약관에 동의하시나요?',
required: true
);유효성 검사 메시지를 직접 지정하려면 문자열을 전달합니다.
$confirmed = confirm(
label: '이용약관에 동의하시나요?',
required: '계속 진행하려면 약관에 동의해야 합니다.'
);Select
미리 정의된 선택지 중 하나를 고르게 하려면 select 함수를 사용합니다.
use function Laravel\Prompts\select;
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: ['Member', 'Contributor', 'Owner']
);기본 선택값과 힌트도 지정할 수 있습니다.
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: ['Member', 'Contributor', 'Owner'],
default: 'Owner',
hint: '역할은 언제든지 변경할 수 있습니다.'
);options 인수에 연관 배열을 전달하면 선택한 항목의 값 대신 키가 반환됩니다.
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: [
'member' => 'Member',
'contributor' => 'Contributor',
'owner' => 'Owner',
],
default: 'owner'
);기본적으로 최대 5개 항목이 표시된 후 스크롤됩니다. scroll 인수로 이 값을 변경할 수 있습니다.
$role = select(
label: '카테고리를 선택하세요.',
options: Category::pluck('name', 'id'),
scroll: 10
);추가 유효성 검사
select 함수는 반드시 하나를 선택해야 하기 때문에 required 인수를 지원하지 않습니다. 단, 특정 항목은 표시하되 선택을 막아야 하는 경우 validate 인수에 클로저를 전달할 수 있습니다.
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: [
'member' => 'Member',
'contributor' => 'Contributor',
'owner' => 'Owner',
],
validate: fn (string $value) =>
$value === 'owner' && User::where('role', 'owner')->exists()
? '이미 owner 역할을 가진 사용자가 존재합니다.'
: null
);options 인수가 연관 배열이면 클로저는 선택된 키를, 일반 배열이면 선택된 값을 전달받습니다.
Multi-select
여러 항목을 동시에 선택할 수 있게 하려면 multiselect 함수를 사용합니다.
use function Laravel\Prompts\multiselect;
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: ['Read', 'Create', 'Update', 'Delete']
);기본 선택값과 힌트도 지정할 수 있습니다.
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: ['Read', 'Create', 'Update', 'Delete'],
default: ['Read', 'Create'],
hint: '권한은 언제든지 변경할 수 있습니다.'
);options 인수에 연관 배열을 전달하면 선택된 항목의 키가 배열로 반환됩니다.
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: [
'read' => 'Read',
'create' => 'Create',
'update' => 'Update',
'delete' => 'Delete',
],
default: ['read', 'create']
);기본적으로 최대 5개 항목이 표시된 후 스크롤됩니다. scroll 인수로 변경할 수 있습니다.
$categories = multiselect(
label: '카테고리를 선택하세요.',
options: Category::pluck('name', 'id'),
scroll: 10
);필수 선택
기본적으로 아무것도 선택하지 않아도 됩니다. 하나 이상 반드시 선택하도록 강제하려면 required 인수를 전달합니다.
$categories = multiselect(
label: '카테고리를 선택하세요.',
options: Category::pluck('name', 'id'),
required: true
);유효성 검사 메시지를 직접 지정하려면 문자열을 전달합니다.
$categories = multiselect(
label: '카테고리를 선택하세요.',
options: Category::pluck('name', 'id'),
required: '카테고리를 최소 하나 이상 선택해야 합니다.'
);추가 유효성 검사
특정 항목은 표시하되 선택을 막아야 하는 경우 validate 인수에 클로저를 전달합니다.
$permissions = multiselect(
label: '사용자에게 부여할 권한을 선택하세요.',
options: [
'read' => 'Read',
'create' => 'Create',
'update' => 'Update',
'delete' => 'Delete',
],
validate: fn (array $values) => ! in_array('read', $values)
? '모든 사용자에게는 읽기 권한이 필요합니다.'
: null
);options 인수가 연관 배열이면 클로저는 선택된 키 배열을, 일반 배열이면 선택된 값 배열을 전달받습니다.
Suggest
suggest 함수는 입력 시 자동 완성 후보를 제공합니다. 사용자는 자동 완성 제안을 무시하고 자유롭게 다른 값을 입력할 수도 있습니다.
use function Laravel\Prompts\suggest;
$name = suggest('이름이 무엇인가요?', ['홍길동', '김철수']);두 번째 인수로 클로저를 전달하면, 사용자가 입력할 때마다 클로저가 호출됩니다. 클로저는 현재까지 입력된 문자열을 받아 자동 완성 후보 배열을 반환해야 합니다.
$name = suggest(
label: '이름이 무엇인가요?',
options: fn ($value) => collect(['홍길동', '김철수'])
->filter(fn ($name) => Str::contains($name, $value, ignoreCase: true))
)플레이스홀더, 기본값, 힌트도 지정할 수 있습니다.
$name = suggest(
label: '이름이 무엇인가요?',
options: ['홍길동', '김철수'],
placeholder: '예) 홍길동',
default: $user?->name,
hint: '이 이름은 프로필에 표시됩니다.'
);필수 입력
입력값을 반드시 받아야 할 경우 required 인수를 전달합니다.
$name = suggest(
label: '이름이 무엇인가요?',
options: ['홍길동', '김철수'],
required: true
);유효성 검사 메시지를 직접 지정하려면 문자열을 전달합니다.
$name = suggest(
label: '이름이 무엇인가요?',
options: ['홍길동', '김철수'],
required: '이름은 필수 입력 항목입니다.'
);추가 유효성 검사
validate 인수에 클로저를 전달해 추가 유효성 검사를 수행할 수 있습니다.
$name = suggest(
label: '이름이 무엇인가요?',
options: ['홍길동', '김철수'],
validate: fn (string $value) => match (true) {
strlen($value) < 3 => '이름은 최소 3자 이상이어야 합니다.',
strlen($value) > 255 => '이름은 255자를 초과할 수 없습니다.',
default => null
}
);Laravel의 유효성 검사기를 사용할 수도 있습니다.
$name = suggest(
label: '이름이 무엇인가요?',
options: ['홍길동', '김철수'],
validate: ['name' => 'required|min:3|max:255']
);Search
선택지가 많을 때는 search 함수를 사용하면 좋습니다. 사용자가 검색어를 입력하면 결과를 필터링하고, 화살표 키로 항목을 선택할 수 있습니다.
use function Laravel\Prompts\search;
$id = search(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: []
);클로저는 사용자가 입력한 텍스트를 받아 옵션 배열을 반환해야 합니다. 연관 배열을 반환하면 선택된 항목의 키가, 일반 배열을 반환하면 값이 반환됩니다.
배열을 필터링할 때 일반 배열 형태를 유지하려면 array_values 함수나 컬렉션의 values 메서드를 사용해 배열이 연관 배열로 바뀌지 않도록 주의하세요.
$names = collect(['홍길동', '김철수']);
$selected = search(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => $names
->filter(fn ($name) => Str::contains($name, $value, ignoreCase: true))
->values()
->all(),
);플레이스홀더와 힌트도 지정할 수 있습니다.
$id = search(
label: '메일을 받을 사용자를 검색하세요.',
placeholder: '예) 홍길동',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
hint: '선택된 사용자에게 즉시 메일이 발송됩니다.'
);기본적으로 최대 5개 항목이 표시된 후 스크롤됩니다. scroll 인수로 변경할 수 있습니다.
$id = search(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
scroll: 10
);추가 유효성 검사
validate 인수에 클로저를 전달해 추가 유효성 검사를 수행할 수 있습니다.
$id = search(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
validate: function (int|string $value) {
$user = User::findOrFail($value);
if ($user->opted_out) {
return '이 사용자는 메일 수신을 거부했습니다.';
}
}
);options 클로저가 연관 배열을 반환하면 validate 클로저는 선택된 키를, 일반 배열이면 선택된 값을 전달받습니다.
Multi-search
검색 가능한 선택지가 많고 여러 항목을 선택해야 할 때는 multisearch 함수를 사용합니다. 검색어를 입력해 결과를 필터링한 후, 화살표 키와 스페이스 바로 여러 항목을 선택할 수 있습니다.
use function Laravel\Prompts\multisearch;
$ids = multisearch(
'메일을 받을 사용자를 검색하세요.',
fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: []
);클로저는 사용자가 입력한 텍스트를 받아 옵션 배열을 반환해야 합니다. 연관 배열을 반환하면 선택된 항목들의 키가, 일반 배열이면 값이 반환됩니다.
배열 필터링 시 일반 배열 형태를 유지하려면 values 메서드를 활용하세요.
$names = collect(['홍길동', '김철수']);
$selected = multisearch(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => $names
->filter(fn ($name) => Str::contains($name, $value, ignoreCase: true))
->values()
->all(),
);플레이스홀더와 힌트도 지정할 수 있습니다.
$ids = multisearch(
label: '메일을 받을 사용자를 검색하세요.',
placeholder: '예) 홍길동',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
hint: '선택된 사용자에게 즉시 메일이 발송됩니다.'
);기본적으로 최대 5개 항목이 표시된 후 스크롤됩니다. scroll 인수로 변경할 수 있습니다.
$ids = multisearch(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
scroll: 10
);필수 선택
기본적으로 아무것도 선택하지 않아도 됩니다. 하나 이상 반드시 선택하도록 강제하려면 required 인수를 전달합니다.
$ids = multisearch(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
required: true
);유효성 검사 메시지를 직접 지정하려면 문자열을 전달합니다.
$ids = multisearch(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
required: '최소 한 명의 사용자를 선택해야 합니다.'
);추가 유효성 검사
validate 인수에 클로저를 전달해 추가 유효성 검사를 수행할 수 있습니다.
$ids = multisearch(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
validate: function (array $values) {
$optedOut = User::whereLike('name', '%a%')->findMany($values);
if ($optedOut->isNotEmpty())