Laravel Prompts è un pacchetto PHP per creare form interattivi belli e usabili nelle app da riga di comando.
Offre un’esperienza simile ai form web con placeholder e validazione.Puoi chiamarli direttamente dal codice dei comandi Artisan.
Laravel Prompts supporta macOS, Linux e Windows (WSL). Su ambienti non supportati fallback automatico.
use function Laravel\Prompts\text;$name = text('What is your name?');
Con placeholder, default, hint:
$name = text( label: 'What is your name?', placeholder: 'E.g. Taylor Otwell', default: $user?->name, hint: 'This will be displayed on your profile.');
Con required:
$name = text( label: 'What is your name?', required: 'Your name is required.');
Validazione con closure:
$name = text( label: 'What is your name?', validate: fn (string $value) => match (true) { strlen($value) < 3 => 'The name must be at least 3 characters.', strlen($value) > 255 => 'The name must not exceed 255 characters.', default => null });
Regole di validazione Laravel:
$name = text( label: 'What is your name?', validate: ['name' => 'required|max:255|unique:users']);
use function Laravel\Prompts\number;$copies = number( label: 'How many copies would you like?', default: 1, validate: ['copies' => 'required|integer|min:1|max:100']);
use function Laravel\Prompts\password;$password = password('What is your password?');
$password = password( label: 'What is your password?', placeholder: 'password', hint: 'Minimum 8 characters.', validate: fn (string $value) => strlen($value) < 8 ? 'The password must be at least 8 characters.' : null);
use function Laravel\Prompts\confirm;$confirmed = confirm('Do you accept the terms?');
$confirmed = confirm( label: 'Do you accept the terms?', default: false, yes: 'I accept', no: 'I decline', hint: 'The terms must be accepted to continue.');
use function Laravel\Prompts\select;$role = select( label: 'What role should the user have?', options: ['Member', 'Contributor', 'Owner'], default: 'Owner');
Con array associativo restituisce la chiave:
$role = select( label: 'What role should the user have?', options: [ 'member' => 'Member', 'contributor' => 'Contributor', 'owner' => 'Owner', ], default: 'owner');
scroll cambia il numero di opzioni visibili (default 5):
$role = select( label: 'Which category would you like to assign?', options: Category::pluck('name', 'id'), scroll: 10);
use function Laravel\Prompts\multiselect;$permissions = multiselect( label: 'What permissions should be assigned?', options: ['Read', 'Create', 'Update', 'Delete']);
Con required:
$permissions = multiselect( label: 'What permissions should be assigned?', options: ['Read', 'Create', 'Update', 'Delete'], required: 'At least one permission must be selected.');
use function Laravel\Prompts\search;$userId = search( label: 'Search for the user that should receive the mail', options: fn (string $value) => strlen($value) > 0 ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all() : []);
use function Laravel\Prompts\multisearch;$userIds = multisearch( label: 'Search for the users that should receive the mail', options: fn (string $value) => strlen($value) > 0 ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all() : []);
$name = text( label: 'What is your name?', validate: fn (string $value) => match (true) { strlen($value) < 3 => 'The name must be at least 3 characters.', strlen($value) > 255 => 'The name must not exceed 255 characters.', default => null });
Regole Laravel come array:
$name = text( label: 'What is your name?', validate: ['name' => 'required|max:255|unique:users']);
Trasformazione prima della validazione con transform:
$name = text( label: 'What is your name?', transform: fn (string $value) => trim($value), validate: fn (string $value) => match (true) { strlen($value) === 0 => 'The name must not be empty.', default => null });
Con form() raggruppi più prompt e li invii o annulli in blocco.
use function Laravel\Prompts\form;$responses = form() ->text('What is your name?', required: true, name: 'name') ->password('What is your password?', validate: ['password' => 'min:8'], name: 'password') ->confirm('Do you accept the terms?') ->submit();$name = $responses['name'];$password = $responses['password'];$confirmed = $responses[2];
use function Laravel\Prompts\info;use function Laravel\Prompts\warning;use function Laravel\Prompts\error;use function Laravel\Prompts\alert;use function Laravel\Prompts\note;note('Prepare for launch.');info('User created successfully.');warning('This action cannot be undone.');error('Something went wrong.');alert('Critical failure detected!');
use function Laravel\Prompts\callout;callout( label: 'Environment Configured', content: 'Your application is running in production mode with 4 workers.',);
Con type:
callout( label: 'Deprecation Notice', content: 'The `--prefer-stable` flag will be removed in v4.0.', type: 'warning',);callout( label: 'Database Connection Failed', content: 'Could not connect to MySQL on 127.0.0.1:3306.', type: 'error',);
Footer:
callout( label: 'Deployment Summary', content: 'Your application was deployed to production.', info: 'deploy-id: d4f8a2c',);
use Laravel\Prompts\Elements\Element;use function Laravel\Prompts\callout;callout('Deployment Summary', [ 'Your application was deployed to production at 2024-03-15 14:32 UTC.', Element::heading('What Changed'), Element::bulletedList([ 'Migrated 3 pending database migrations', 'Cleared and rebuilt route cache', 'Restarted 4 queue workers', ]), Element::heading('Next Steps'), Element::numberedList([ 'Verify the health check endpoint at /up', 'Monitor error rates for the next 15 minutes', 'Confirm background jobs are processing', ]),]);
Element::keyValueList:
callout('Database Connection Failed', [ 'Could not connect to the database server.', Element::keyValueList([ 'Host' => '127.0.0.1', 'Port' => '3306', 'Database' => 'forge', 'Status' => 'Connection refused', ]),], type: 'error');
Element::link per link OSC 8:
callout('Server Health Check', [ 'Multiple services are reporting degraded performance.', Element::heading('Affected Services'), 'Look here: '.Element::link('https://example.com/health', 'Health Dashboard'), Element::link('https://example.com/health'),]);
use function Laravel\Prompts\progress;$users = progress( label: 'Updating users', steps: User::all(), callback: fn ($user) => $this->performTask($user), hint: 'This may take some time.');
Larghezza: se supera le colonne viene troncato. Massimo consigliato 74 caratteri su 80 colonne.Altezza: i prompt con scroll si adattano al terminale (lasciando spazio ai messaggi di validazione).
use Laravel\Prompts\Prompt;Prompt::fake(['Taylor', true]);$name = text('What is your name?');$confirmed = confirm('Do you accept the terms?');Prompt::assertOutputContains('What is your name?');
Con gli helper Artisan puoi asserire sull’output.
// Pesttest('report generation', function () { $this->artisan('report:generate') ->expectsPromptsInfo('Welcome to the application!') ->expectsPromptsWarning('This action cannot be undone') ->expectsPromptsError('Something went wrong') ->expectsPromptsAlert('Important notice!') ->expectsPromptsTable( headers: ['Name', 'Email'], rows: [ ['Taylor Otwell', '[email protected]'], ] ) ->assertExitCode(0);});
// PHPUnitpublic function test_report_generation(): void{ $this->artisan('report:generate') ->expectsPromptsInfo('Welcome to the application!') ->expectsPromptsWarning('This action cannot be undone') ->expectsPromptsTable( headers: ['Name', 'Email'], rows: [['Taylor Otwell', '[email protected]']] ) ->assertExitCode(0);}