Компонент Console предоставляет утилиту для автозаполнения ответов на вопросы, созданные с помощью Помощника по вопросам. Это используется, например, для автозаполнения классов и объектов в MakerBundle
для повышения вашей производительности.
Однако автозаполнение требует заранее знать все возможные предложения. Это невозможно, если предложения зависят от пользовательского ввода, и нецелесообразно, если завершение является очень динамичным (например, при автозаполнении содержимого каталогов).
В Symfony 4.3 улучшили эту функцию с помощью нового метода setAutocompleterCallback()
, который позволяет использовать функцию обратного вызова для динамического создания предложений автозаполнения. Например, этот пример показывает, как автозаполнение ввода пользователя с допустимым содержимым каталога:
use Symfony\Component\Console\Question\Question;
// ...
public function execute(InputInterface $input, OutputInterface $output)
{
// This function is called whenever the input changes and new
// suggestions are needed.
$callback = function (string $userInput): array {
// Strip any characters from the last slash to the end of the string
// to keep only the last directory and generate suggestions for it
$inputPath = preg_replace('%(/|^)[^/]*$%', '$1', $userInput);
$inputPath = '' === $inputPath ? '.' : $inputPath;
// CAUTION - this example code allows unrestricted access to the
// entire filesystem. In real applications, restrict the directories
// where files and dirs can be found
$foundFilesAndDirs = @scandir($inputPath) ?: [];
return array_map(function ($dirOrFile) use ($inputPath) {
return $inputPath.$dirOrFile;
}, $foundFilesAndDirs);
};
$question = new Question('Please provide the full path of a file to parse');
$question->setAutocompleterCallback($callback);
$filePath = $helper->ask($input, $output, $question);
}