控制台输入(参数和选项)
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');