Розуміння роботи з аргументами та опціями консолі
Дата оновлення перекладу 2023-08-21
Розуміння роботи з аргументами та опціями консолі
Додатки Symfony Console дотримуються того ж стандарту docopt, який використовується у більшості утиліт CLI. Ця стаття пояснює, як працювати з межевими випадками, коли команди визначають опції з потрібними значеннями, без значень і т.д. Прочитайте іншу статтю, щоб дізнатися про використання аргументів та опції всередині команд Symfony Консоль.
Подивіться на наступну команду, яка має три опції:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
namespace Acme\Console\Command;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(name: 'demo:args', description: 'Describe args behaviors')]
class DemoArgsCommand extends Command
{
protected function configure(): void
{
$this
->setDefinition(
new InputDefinition([
new InputOption('foo', 'f'),
new InputOption('bar', 'b', InputOption::VALUE_REQUIRED),
new InputOption('cat', 'c', InputOption::VALUE_OPTIONAL),
])
);
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
// ...
}
}
Так як опція foo
не приймає значення, вона буде або false
(якщо вона не
передана команді), або true
(якщо користувач передав --foo
). Значення
опції bar
(і, відповідно, її ярлика b
) є обовʼязковим. Воно може бути
відокремлене від імені опції або пробілами, або символами =
. Опція cat
(та її ярлик c
) поводить себе так само, крім того, що вона не вимагає значення.
Дослідіть наступну таблицю, щоб отримати уявлення про можливі способи передачі
опцій:
???????? | foo |
bar |
cat |
---|---|---|---|
--bar=Hello |
false |
"Hello" |
null |
--bar Hello |
false |
"Hello" |
null |
-b=Hello |
false |
"=Hello" |
null |
-b Hello |
false |
"Hello" |
null |
-bHello |
false |
"Hello" |
null |
-fcWorld -b Hello |
true |
"Hello" |
"World" |
-cfWorld -b Hello |
false |
"Hello" |
"fWorld" |
-cbWorld |
false |
null |
"bWorld" |
Все стає трохи складніше, коли команда також приймає необовʼязковий аргумент:
1 2 3 4 5 6
// ...
new InputDefinition(array(
// ...
new InputArgument('arg', InputArgument::OPTIONAL),
));
Вам може знадобитися використати спеціальний роздільник --
, щоб відокремити
опції від аргументів. Подвіться на пʼятий приклад у таблиці нижче, де він
використовується для того, щоб повідомити команді, що World
є значенням
для arg
, а не значенням необовʼязкової опції cat
:
???????? | bar |
cat |
arg |
---|---|---|---|
--bar Hello |
"Hello" |
null |
null |
--bar Hello World |
"Hello" |
null |
"World" |
--bar "Hello World" |
"Hello World" |
null |
null |
--bar Hello --cat World |
"Hello" |
"World" |
null |
--bar Hello --cat -- World |
"Hello" |
null |
"World" |
-b Hello -c World |
"Hello" |
"World" |
null |