Skip to main content

Introducción

Laravel Prompts es un paquete PHP para añadir formularios interactivos atractivos y fáciles de usar a las aplicaciones de línea de comandos. Ofrece una experiencia parecida a la de un formulario web, con placeholders, validación, etc. Puedes invocarlo directamente desde tus comandos Artisan, lo que hace muy sencilla e intuitiva la interacción con el usuario.
Laravel Prompts es compatible con macOS, Linux y Windows (WSL). En entornos no compatibles se activa automáticamente un modo alternativo.

Instalación

Laravel Prompts viene incluido en Laravel, por lo que no requiere instalación adicional. Para usarlo en otros proyectos PHP, instálalo con Composer.

Funciones de prompt básicas

text: entrada de texto

Con text() pides al usuario que introduzca una cadena.
Puedes indicar placeholder, valor por defecto y un hint.
Con required haces la entrada obligatoria (puedes personalizar el mensaje).
Con la closure validate puedes añadir validaciones. Devuelve una cadena de error o null si pasa.
También puedes usar reglas de validación de Laravel en formato array.

textarea: entrada multilínea

textarea() admite entradas de varias líneas.

number: entrada numérica

number() acepta valores numéricos. Puedes cambiarlos con las flechas.

password: entrada de contraseña

password() funciona como el texto normal, pero oculta lo que se escribe.

confirm: confirmación Sí/No

confirm() pregunta con dos opciones y devuelve true o false.
Puedes personalizar el valor por defecto y los textos.

select: lista de selección

Con select() el usuario elige una opción de un listado.
Si pasas un array asociativo, devuelve la clave en lugar de la etiqueta.
Con scroll cambias el número de opciones visibles antes de hacer scroll (por defecto 5).

multiselect: selección múltiple

multiselect() permite elegir varias opciones a la vez.
Con required obligas a elegir al menos una.

suggest: entrada con autocompletado

suggest() ofrece sugerencias pero permite entrada libre.
Con una closure puedes filtrar dinámicamente las sugerencias.

search: búsqueda dinámica

search() actualiza la lista de opciones a medida que se escribe. La closure devuelve las candidatas.

multisearch: selección múltiple dinámica

multisearch() combina la búsqueda dinámica con selección múltiple.

pause: pausa

pause() detiene el proceso hasta que el usuario pulsa Enter.

autocomplete: autocompletado inline

autocomplete() muestra sugerencias como ghost text. A diferencia de suggest(), la sugerencia se muestra en línea y se acepta con Tab o la flecha derecha.
Puedes indicar placeholder, valor por defecto y hint.
Con una closure filtras las opciones dinámicamente.

Validación

Todas las funciones de prompt aceptan el argumento validate.
Si la closure devuelve una cadena, se muestra como error y se pide de nuevo el valor. Con null se considera válido. También puedes usar reglas de validación de Laravel en formato array.
Para transformar la entrada antes de validarla, usa transform.

Formularios

Con form() agrupas varios prompts y puedes cancelarlos todos antes de completarlos.

Mensajes informativos

Existen funciones que muestran mensajes con estilos predefinidos.

Callouts

callout() muestra una etiqueta y contenido dentro de un marco. Ideal para destacar información importante (resúmenes de despliegue, detalles de error, actualizaciones de estado…).
Con el argumento type ('warning' o 'error') cambias el estilo visual.
Con info añades un pie con metadatos (IDs, timestamps…).

Contenido enriquecido

En lugar de un string, puedes pasar un array para crear un callout estructurado. La clase Element incluye factories para títulos, listas con viñetas, listas numeradas, listas clave-valor y enlaces.
Con Element::keyValueList puedes mostrar datos con etiquetas.
Element::link genera hipervínculos clicables en terminales compatibles con OSC 8. Puedes pasar solo la URL o URL + etiqueta.
Si omites la etiqueta, se muestra la propia URL como texto del enlace.

Tablas

Con table() muestras datos en formato tabla.

Spinner (indicador de carga)

spin() muestra un indicador mientras se ejecuta la closure.
spin() requiere la extensión PHP pcntl. Si no está disponible, no se muestra el spinner.

Barra de progreso

progress() muestra visualmente el avance de un proceso iterativo.
También puedes controlarla manualmente.

Tasks

task() muestra un spinner y un área de log scrollable en vivo mientras se ejecuta la callback. Ideal para procesos largos como instalación de dependencias o despliegues, para ir viendo qué ocurre en tiempo real.
La callback recibe una instancia de Logger para escribir líneas y mensajes de estado en tiempo real.
task() requiere la extensión PHP pcntl. Si no está disponible, se degrada a una visualización estática.

Escribir líneas de log

line añade una línea al área de log scrollable.

Mensajes de estado

success, warning y error muestran mensajes destacados fijos en la parte superior del área de log.

Actualizar la etiqueta

Con label actualizas la etiqueta durante la ejecución. Con subLabel muestras una sub-etiqueta atenuada debajo. Una cadena vacía la borra. Puedes fijar una sub-etiqueta inicial con el argumento subLabel.

Streaming de texto

Para procesos que generan texto de forma incremental (por ejemplo, respuestas de IA), usa partial para hacer streaming palabra a palabra y commitPartial para consolidar.

Límites de salida y resumen persistente

Por defecto se muestran hasta 10 líneas de log scrollable. Puedes cambiarlo con limit. Con keepSummary: true los mensajes de estado permanecen en pantalla al terminar.

Stream

stream() muestra texto progresivamente. Es ideal para respuestas generadas por IA o datos que llegan por chunks.
append añade texto al stream con un efecto de aparición. Cuando termines, invoca close para consolidar la salida y restaurar el cursor.

Operaciones sobre la terminal

Cambiar el título de la terminal

Con una cadena vacía se restaura el título predeterminado.

Limpiar la terminal

Consideraciones sobre la terminal

Ancho: si etiquetas, opciones o mensajes de validación exceden las columnas disponibles, se truncan. Para una terminal de 80 columnas, mantente por debajo de 74 caracteres. Alto: en los prompts que aceptan scroll, el valor se ajusta automáticamente al alto de la terminal, dejando espacio para los mensajes de validación.

Fallback

En entornos no compatibles (Windows sin WSL, por ejemplo) se activa un fallback automático. Por defecto se usan los métodos integrados de Laravel como $this->ask() o $this->choice().

Pruebas

Laravel Prompts se integra con Pest y PHPUnit.
Con los helpers de test de Artisan puedes hacer aserciones también sobre las funciones informativas.

Páginas relacionadas

Consola Artisan

Aprovecha Prompts dentro de tus comandos Artisan.
Última modificación el 13 de julio de 2026