Symfony

原文

控制台输入(参数和选项)

4.3版本
编辑这个页面
使用命令参数
使用命令选项
带可选参数的选项
命令中最有趣的部分是您可以使用的参数和选项。这些参数和选项使您可以将动态信息从终端传递到命令。

使用命令参数¶

参数是用命令名称本身后面的字符串(用空格分隔)。它们是有序的,可以是可选的或必需的。例如,向last_name命令添加可选参数并使name参数成为必需:

// ...
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;

class GreetCommand extends Command
{
    // ...

    protected function configure()
    {
        $this
            // ...
            ->addArgument('name', InputArgument::REQUIRED, 'Who do you want to greet?')
            ->addArgument('last_name', InputArgument::OPTIONAL, 'Your last name?')
        ;
    }
}

现在,您可以访问last_name命令中的参数:

// ...
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class GreetCommand extends Command
{
    // ...

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $text = 'Hi '.$input->getArgument('name');

        $lastName = $input->getArgument('last_name');
        if ($lastName) {
            $text .= ' '.$lastName;
        }

        $output->writeln($text.'!');
    }
}

现在可以通过以下两种方式使用该命令:

php bin/console app:greet Fabien
Hi Fabien!

 php bin/console app:greet Fabien Potencier
Hi Fabien Potencier!

也可以让参数采用值列表(假设您想向所有朋友打招呼)。只有最后一个参数可以是列表:

$this
    // ...
    ->addArgument(
        'names',
        InputArgument::IS_ARRAY,
        'Who do you want to greet (separate multiple names with a space)?'
    );

要使用此名称,请指定任意数量的名称:

 php bin/console app:greet Fabien Ryan Bernhard
您可以将names参数作为数组访问:
$names = $input->getArgument('names');
if (count($names) > 0) {
    $text .= ' '.implode(', ', $names);
}

您可以使用三种参数变体:

InputArgument::REQUIRED
该参数是强制性的。如果不提供参数,则命令不会运行;
InputArgument::OPTIONAL
该参数是可选的,因此可以省略。这是参数的默认行为。
InputArgument::IS_ARRAY
参数可以包含任意数量的值。因此,必须在参数列表的末尾使用它。
您可以结合IS_ARRAY使用REQUIRED和OPTIONAL这样的:


$this
    // ...
    ->addArgument(
        'names',
        InputArgument::IS_ARRAY | InputArgument::REQUIRED,
        'Who do you want to greet (separate multiple names with a space)?'
    );

使用命令选项¶
与参数不同,选项没有顺序(意味着您可以按任何顺序指定它们),并用两个破折号(例如–yell)指定。选项 始终是可选的,并且可以设置为接受值(例如–dir=src)或作为不带值的布尔标志(例如 --yell)。

例如,在命令中添加一个新选项,该选项可用于指定消息应连续打印多少次:

// ...
use Symfony\Component\Console\Input\InputOption;

$this
    // ...
    ->addOption(
        'iterations',
        null,
        InputOption::VALUE_REQUIRED,
        'How many times should the message be printed?',
        1
    );

接下来,在命令中使用它多次打印消息:

for ($i = 0; $i < $input->getOption('iterations'); $i++) {
    $output->writeln($text);
}

现在,当您运行命令时,可以选择指定一个–iterations 标志:

 php bin/console app:greet Fabien --iterations=5

您还可以声明一个字母的快捷方式,可以通过短划线来调用它,例如-i:

$this
    // ...
    ->addOption(
        'iterations',
        'i',
        InputOption::VALUE_REQUIRED,
        'How many times should the message be printed?',
        1
    );

请注意,为了符合docopt标准,长选项可以在空格或=符号后指定其值(例如–iterations 5或 --iterations=5),而短选项只能使用空格或完全不使用分隔符(例如-i 5或-i5)。

虽然可以用空格将选项与其值分开,但使用该格式会导致选项出现在命令名称之前的情况产生歧义。例如,php bin/console --iterations 5 app:greet Fabien 模棱两可;Symfony将解释5为命令名称。为避免这种情况,请始终在命令名称后放置选项,或避免使用空格将选项名称与其值分开
您可以使用四个选项变体:

InputOption::VALUE_IS_ARRAY
此选项接受多个值(例如–dir=/foo --dir=/bar);
InputOption::VALUE_NONE
不接受此选项的输入(例如–yell)。这是选项的默认行为。
InputOption::VALUE_REQUIRED
该值是必需的(例如–iterations=5或-i5),选项本身仍然是可选的;
InputOption::VALUE_OPTIONAL
此选项可能有也可能没有值(例如–yell或 --yell=loud)。
您可以结合VALUE_IS_ARRAY使用VALUE_REQUIRED或 VALUE_OPTIONAL像这样:

$this
    // ...
    ->addOption(
        'colors',
        null,
        InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY,
        'Which colors do you like?',
        ['blue', 'red']
    );

与可选参数选项¶
没有什么可以阻止您创建带有可选地接受值的选项的命令的,但是有点棘手。考虑以下示例:

// ...
use Symfony\Component\Console\Input\InputOption;

$this
    // ...
    ->addOption(
        'yell',
        null,
        InputOption::VALUE_OPTIONAL,
        'Should I yell while greeting?'
    );

此选项可以通过三种方式使用:–yell,yell=louder,和没有通过选项都没有。但是,很难区分传递不带值的选项(greet --yell)和不传递选项(greet)。

要解决此问题,您必须将选项的默认值设置为false:

// ...
use Symfony\Component\Console\Input\InputOption;

$this
    // ...
    ->addOption(
        'yell',
        null,
        InputOption::VALUE_OPTIONAL,
        'Should I yell while greeting?',
        false // this is the new default value, instead of null
    );

现在检查选项的值,并牢记false !== null

$optionValue = $input->getOption('yell');
$yell = ($optionValue !== false);
$yellLouder = ($optionValue === 'louder');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值