Autocompletar do Console Aprimorado no Symfony 4.3

O componente Console fornece um utilitário para autocompletar as respostas às perguntas criadas com o Question Helper. Isso é usado, por exemplo, para autocompletar classes e entidades no MakerBundle, aumentando a sua produtividade.

No entanto, o autocompletar requer conhecer todas as sugestões possíveis de antemão. Isso é impossível se as sugestões dependerem da entrada do usuário e não prático se o completar for altamente dinâmico (por exemplo, ao autocompletar o conteúdo de diretórios).

No Symfony 4.3, esse recurso foi aprimorado com um novo método chamado setAutocompleterCallback() que permite usar uma função callback para gerar dinamicamente as sugestões do autocompletar. O exemplo abaixo mostra como autocompletar a entrada do usuário com conteúdo de diretório válido:

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);
}

Tradução de: New in Symfony 4.3: Better console autocomplete