Новое в Symfony 3.2: Новые фичи консоли (Часть 1)

Компонент Console в Symfony 3.2 получил много новых функций, в основном это связано с улучшением его DX (опыт разработчика). В первой части (статья из двух частей), мы рассмотрим четыре новых функции.

Псевдонимы команд, больше не отображаются в виде отдельных команд

Рекомендуется использовать определения пространства имен для команд, во избежание конфликтов и чтобы улучшить организацию вашего приложения. Тем не менее, для часто выполняемых команд, удобно определить ярлыки:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class VeryLongNameCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('app:very:long:name')
            ->setDescription('Lorem Ipsum...')
            // ...
            ->setAliases(['foo'])
        ;
    }

    // ...
}

В приведенном выше примере, команда может быть выполнена ./bin/console app:very:long:name и, как ./bin/console foo. Несмотря на то что это одна и та же команда, Symfony покажет ее как две отдельные команды:

./bin/console

Available commands:
  foo                      Lorem Ipsum...
 app:
  app:very:long:name       Lorem Ipsum...

В Symfony 3.2 псевдонимы встраиваются в свои первоначальные команды, увеличивая читабельность при выводе на консоль:

./bin/console

Available commands:
 app:
  app:very:long:name       [foo] Lorem Ipsum...

Ошибки не отображаются даже при использовании тихого режима

Если добавить опцию -q или —quiet  при выполнении команды Symfony, вывод будет настроен с опцией OutputInterface::VERBOSITY_QUIET. Это укажет команде не выводить ни каких сообщение, даже сообщений об ошибках.

В Symfony 3.2 мы улучшили опции -q и —quiet так что позволяет не показывать никаких ошибок при выводе  данные кроме сообщений уровня Logger::ERROR. Таким образом, вы никогда не пропустите сообщение об ошибке снова.

Лучшая поддержка однокомандных приложений

Создание однокомандных приложения в Symfony возможно, но требует от вас внесения некоторых изменений, чтобы не передать постоянно имя команды. В Symfony 3.2 мы улучшили базовый класс приложений для поддержки однокомандных приложений из коробки.

Во-первых, определите команду, как обычно, и создайте консольное приложение. Затем установите только команду в качестве команды по умолчанию и передать true в качестве второго аргумента setDefaultCommand(). Это превратит приложение в приложение однокомандное:

use Symfony\Component\Console\Application;

$command = new \FooCommand();

$application = new Application();
$application->add($command);
// the second boolean argument tells if this is a single-command app
$application->setDefaultCommand($command->getName(), true);

// this now executes the 'FooCommand' without passing its name
$application->run();

Более простое тестирование команд

Тестирование команд Symfony является излишне сложным и требует, чтобы вы разбирались в PHP потоках. Например, если ваш тест должен имитировать пользователя набравшего 123, foo и bar, вы должны сделать следующее:

use Symfony\Component\Console\Tester\CommandTester;

$commandTester = new CommandTester($command);
$helper = $command->getHelper('question');
$helper->setInputStream($this->getInputStream("123\nfoo\nbar\n"));

protected function getInputStream($input)
{
    $stream = fopen('php://memory', 'r+', false);
    fputs($stream, $input);
    rewind($stream);
    return $stream;
}

В Symfony 3.2 мы упростили тестирование команд, добавив новый метод setInputs() для помощника CommandTester. Вам просто нужно передать массив с содержимым, который пользователь будет вводить:

use Symfony\Component\Console\Tester\CommandTester;

$commandTester = new CommandTester($command);
$commandTester->setInputs(['123', 'foo', 'bar']);

Источник: https://symfony.com/blog/new-in-symfony-3-2-console-improvements-part-1

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

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

4 × 2 =