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