프롬프트 (Prompts)
번역일: 2026년 6월 20일
프롬프트 (Prompts)
- 소개
- 설치
- 사용 가능한 프롬프트
- 유효성 검사 전 입력 변환
- 폼
- 안내 메시지
- 테이블
- 스피너
- 진행 바
- 태스크
- 스트림
- 터미널 제목
- 알림
- 터미널 지우기
- 터미널 고려사항
- 지원되지 않는 환경과 폴백
- 테스트
소개
Laravel Prompts는 커맨드라인 애플리케이션에 브라우저와 유사한 UX(플레이스홀더 텍스트, 유효성 검사 등)를 더해주는 PHP 패키지입니다. Artisan 콘솔 커맨드에서 사용자 입력을 받을 때 특히 유용하며, 일반 PHP CLI 프로젝트에도 사용할 수 있습니다.
NOTE
Laravel Prompts는 macOS, Linux, WSL이 설치된 Windows를 지원합니다. 자세한 내용은 지원되지 않는 환경과 폴백 섹션을 참고하세요.
설치
최신 Laravel에는 이미 Laravel Prompts가 포함되어 있습니다.
다른 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의 유효성 검사기를 활용할 수도 있습니다. 속성 이름과 검사 규칙을 배열로 전달하세요:
$name = text(
label: '이름이 무엇인가요?',
validate: ['name' => 'required|max:255|unique:users']
);Textarea
textarea 함수는 여러 줄 입력을 받을 수 있는 텍스트 영역을 표시합니다:
use function Laravel\Prompts\textarea;
$story = textarea('이야기를 들려주세요.');플레이스홀더, 기본값, 힌트도 지정할 수 있습니다:
$story = textarea(
label: '이야기를 들려주세요.',
placeholder: '옛날 옛적에...',
hint: '프로필에 표시될 내용입니다.'
);필수 입력
$story = textarea(
label: '이야기를 들려주세요.',
required: true
);유효성 검사 메시지를 직접 지정할 수도 있습니다:
$story = textarea(
label: '이야기를 들려주세요.',
required: '이야기는 필수 입력 항목입니다.'
);추가 유효성 검사
$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']
);Number
number 함수는 숫자 입력을 받습니다. 위/아래 화살표 키로 값을 조절할 수 있습니다:
use function Laravel\Prompts\number;
$number = number('몇 개를 생성할까요?');플레이스홀더, 기본값, 힌트도 지정할 수 있습니다:
$name = number(
label: '몇 개를 생성할까요?',
placeholder: '5',
default: 1,
hint: '생성할 개수를 결정합니다.'
);필수 입력
$copies = number(
label: '몇 개를 생성할까요?',
required: true
);유효성 검사 메시지를 직접 지정할 수도 있습니다:
$copies = number(
label: '몇 개를 생성할까요?',
required: '개수를 입력해주세요.'
);추가 유효성 검사
$copies = number(
label: '몇 개를 생성할까요?',
validate: fn (?int $value) => match (true) {
$value < 1 => '최소 1개 이상이어야 합니다.',
$value > 100 => '100개를 초과할 수 없습니다.',
default => null
}
);Laravel 유효성 검사기를 사용하는 방법:
$copies = number(
label: '몇 개를 생성할까요?',
validate: ['copies' => 'required|integer|min:1|max:100']
);Password
password 함수는 text와 비슷하지만, 입력 내용이 마스킹되어 표시됩니다. 비밀번호 등 민감한 정보를 입력받을 때 사용하세요:
use function Laravel\Prompts\password;
$password = password('비밀번호를 입력하세요.');플레이스홀더와 힌트도 지정할 수 있습니다:
$password = password(
label: '비밀번호를 입력하세요.',
placeholder: 'password',
hint: '최소 8자 이상이어야 합니다.'
);필수 입력
$password = password(
label: '비밀번호를 입력하세요.',
required: true
);유효성 검사 메시지를 직접 지정할 수도 있습니다:
$password = password(
label: '비밀번호를 입력하세요.',
required: '비밀번호는 필수 입력 항목입니다.'
);추가 유효성 검사
$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: ['일반 회원', '기여자', '관리자']
);기본 선택값과 힌트도 지정할 수 있습니다:
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: ['일반 회원', '기여자', '관리자'],
default: '관리자',
hint: '역할은 언제든지 변경할 수 있습니다.'
);연관 배열을 사용하면 선택된 값 대신 키를 반환받을 수 있습니다:
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: [
'member' => '일반 회원',
'contributor' => '기여자',
'owner' => '관리자',
],
default: 'owner'
);기본적으로 5개의 옵션이 표시되며, 그 이상은 스크롤됩니다. scroll 인수로 표시 개수를 변경할 수 있습니다:
$role = select(
label: '카테고리를 선택하세요.',
options: Category::pluck('name', 'id'),
scroll: 10
);보조 정보 표시
info 인수를 사용하면 현재 하이라이트된 옵션에 대한 추가 정보를 표시할 수 있습니다. 클로저를 전달하면 현재 선택된 옵션의 값을 받아 문자열 또는 null을 반환해야 합니다:
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: [
'member' => '일반 회원',
'contributor' => '기여자',
'owner' => '관리자',
],
info: fn (string $value) => match ($value) {
'member' => '조회 및 댓글 작성 가능.',
'contributor' => '조회, 댓글, 편집 가능.',
'owner' => '모든 리소스에 대한 전체 접근 권한.',
default => null,
}
);선택된 옵션에 무관하게 동일한 정보를 표시하려면 문자열을 직접 전달하세요:
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: ['일반 회원', '기여자', '관리자'],
info: '역할은 언제든지 변경할 수 있습니다.'
);추가 유효성 검사
select 함수는 선택지가 항상 존재하므로 required 인수를 지원하지 않습니다. 그러나 특정 옵션의 선택을 막아야 한다면 validate 인수에 클로저를 전달할 수 있습니다:
$role = select(
label: '사용자에게 부여할 역할을 선택하세요.',
options: [
'member' => '일반 회원',
'contributor' => '기여자',
'owner' => '관리자',
],
validate: fn (string $value) =>
$value === 'owner' && User::where('role', 'owner')->exists()
? '관리자는 이미 존재합니다.'
: null
);options가 연관 배열이면 클로저는 선택된 키를, 인덱스 배열이면 선택된 값을 받습니다. 오류 메시지 또는 null을 반환하세요.
Multi-select
여러 옵션을 동시에 선택하게 하려면 multiselect 함수를 사용하세요:
use function Laravel\Prompts\multiselect;
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: ['읽기', '생성', '수정', '삭제']
);기본 선택값과 힌트도 지정할 수 있습니다:
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: ['읽기', '생성', '수정', '삭제'],
default: ['읽기', '생성'],
hint: '권한은 언제든지 변경할 수 있습니다.'
);연관 배열을 사용하면 선택된 값 대신 키를 반환받을 수 있습니다:
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: [
'read' => '읽기',
'create' => '생성',
'update' => '수정',
'delete' => '삭제',
],
default: ['read', 'create']
);기본적으로 5개의 옵션이 표시되며, scroll 인수로 변경할 수 있습니다:
$categories = multiselect(
label: '카테고리를 선택하세요.',
options: Category::pluck('name', 'id'),
scroll: 10
);보조 정보 표시
info 인수에 클로저를 전달하면 현재 하이라이트된 옵션에 대한 추가 정보를 표시할 수 있습니다:
$permissions = multiselect(
label: '부여할 권한을 선택하세요.',
options: [
'read' => '읽기',
'create' => '생성',
'update' => '수정',
'delete' => '삭제',
],
info: fn (string $value) => match ($value) {
'read' => '리소스 및 속성 조회.',
'create' => '새 리소스 생성.',
'update' => '기존 리소스 수정.',
'delete' => '리소스 영구 삭제.',
default => null,
}
);필수 선택
기본적으로 아무것도 선택하지 않아도 됩니다. 하나 이상의 선택을 강제하려면 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' => '읽기',
'create' => '생성',
'update' => '수정',
'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: '프로필에 표시될 이름입니다.'
);보조 정보 표시
info 인수에 클로저를 전달하면 현재 하이라이트된 옵션에 대한 추가 정보를 표시할 수 있습니다:
$name = suggest(
label: '이름이 무엇인가요?',
options: ['Taylor', 'Dayle'],
info: fn (string $value) => match ($value) {
'Taylor' => '관리자',
'Dayle' => '기여자',
default => null,
}
);필수 입력
$name = suggest(
label: '이름이 무엇인가요?',
options: ['김철수', '이영희'],
required: true
);유효성 검사 메시지를 직접 지정할 수도 있습니다:
$name = suggest(
label: '이름이 무엇인가요?',
options: ['김철수', '이영희'],
required: '이름은 필수 입력 항목입니다.'
);추가 유효성 검사
$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(['Taylor', 'Abigail']);
$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: '사용자에게 즉시 이메일이 발송됩니다.',
scroll: 10
);보조 정보 표시
info 인수에 클로저를 전달하면 현재 하이라이트된 옵션에 대한 추가 정보를 표시할 수 있습니다:
$id = search(
label: '메일을 받을 사용자를 검색하세요.',
options: fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: [],
info: fn (int $userId) => User::find($userId)?->email
);추가 유효성 검사
$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 클로저가 연관 배열을 반환하면 클로저는 선택된 키를, 인덱스 배열을 반환하면 선택된 값을 받습니다.
Multi-search
검색 가능한 옵션이 많고 여러 항목을 선택해야 할 때는 multisearch 함수를 사용하세요. 검색어로 목록을 필터링한 후, 화살표 키와 스페이스바로 여러 항목을 선택할 수 있습니다:
use function Laravel\Prompts\multisearch;
$ids = multisearch(
'메일을 받을 사용자를 검색하세요.',
fn (string $value) => strlen($value) > 0
? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
: []
);값을 반환하려는 경우, 배열이 연관 배열로 변환되지 않도록 주의하세요:
$names = collect(['Taylor', 'Abigail']);
$selected = multisearch(
label: '메일을 받을 사용