PromptsForMissingInput.php
TLDR
This file is a trait called PromptsForMissingInput
located in the Illuminate\Console\Concerns
namespace. It provides methods for interacting with the user and prompting for missing input in a command line application.
Methods
interact
This method is called before validating the input and allows the class to interact with the user. It accepts an instance of InputInterface
and OutputInterface
.
promptForMissingArguments
This method prompts the user for any missing arguments. It accepts an instance of InputInterface
and OutputInterface
.
promptForMissingArgumentsUsing
This method returns an array of questions to prompt for missing input arguments.
afterPromptingForMissingArguments
This method is called after the user has been prompted for missing arguments. It accepts an instance of InputInterface
and OutputInterface
.
didReceiveOptions
This method checks whether the input contains any options that differ from the default values. It accepts an instance of InputInterface
and returns a boolean value.
<?php
namespace Illuminate\Console\Concerns;
use Closure;
use Illuminate\Contracts\Console\PromptsForMissingInput as PromptsForMissingInputContract;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use function Laravel\Prompts\text;
trait PromptsForMissingInput
{
/**
* Interact with the user before validating the input.
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return void
*/
protected function interact(InputInterface $input, OutputInterface $output)
{
parent::interact($input, $output);
if ($this instanceof PromptsForMissingInputContract) {
$this->promptForMissingArguments($input, $output);
}
}
/**
* Prompt the user for any missing arguments.
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return void
*/
protected function promptForMissingArguments(InputInterface $input, OutputInterface $output)
{
$prompted = collect($this->getDefinition()->getArguments())
->filter(fn ($argument) => $argument->isRequired() && is_null($input->getArgument($argument->getName())))
->filter(fn ($argument) => $argument->getName() !== 'command')
->each(function ($argument) use ($input) {
$label = $this->promptForMissingArgumentsUsing()[$argument->getName()] ??
'What is '.lcfirst($argument->getDescription() ?: ('the '.$argument->getName())).'?';
if ($label instanceof Closure) {
return $input->setArgument($argument->getName(), $label());
}
if (is_array($label)) {
[$label, $placeholder] = $label;
}
$input->setArgument($argument->getName(), text(
label: $label,
placeholder: $placeholder ?? '',
validate: fn ($value) => empty($value) ? "The {$argument->getName()} is required." : null,
));
})
->isNotEmpty();
if ($prompted) {
$this->afterPromptingForMissingArguments($input, $output);
}
}
/**
* Prompt for missing input arguments using the returned questions.
*
* @return array
*/
protected function promptForMissingArgumentsUsing()
{
return [];
}
/**
* Perform actions after the user was prompted for missing arguments.
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return void
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
//
}
/**
* Whether the input contains any options that differ from the default values.
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @return bool
*/
protected function didReceiveOptions(InputInterface $input)
{
return collect($this->getDefinition()->getOptions())
->reject(fn ($option) => $input->getOption($option->getName()) === $option->getDefault())
->isNotEmpty();
}
}