Розуміння роботи з аргументами та опціями консолі

Дата оновлення перекладу 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