Новое в Symfony 4.3: Улучшенное автозаполнение консоли

Компонент 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);
}

Комментариев нет

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *