Symfony 控制台 - 覆盖默认选项
Symfony Console - Overwrite default options
我正在使用 Symfony Console 为我的应用构建 CLI 应用程序。应用程序需要做一些简单的包管理操作来管理插件。因此,我需要一个名为 --version
和快捷方式 -v
的命令选项,这似乎是不可能的,因为 --version
是为应用程序版本保留的,而 -v
是为应用程序版本保留的默认详细设置。
我如何禁用默认选项或覆盖此子命令的默认选项?
弹出的错误状态
[Symfony\Component\Console\Exception\LogicException] An option named "version" already exists.
所以,这是一个有效的解决方案,但我不推荐它。我建议您简单地使用 --package-version
或一些其他类型的选项作为您的命令,因为这需要大量额外的工作并且不能很好地适应未来的 Symfony 更新。
你可以做的第一件事是将你的bin/
目录下的console
命令复制到一个新的命令中,并将use
语句更改为你自己的扩展应用程序:
bin/alt_console:
// use Symfony\Bundle\FrameworkBundle\Console\Application;
use AppBundle\Console\Application;
然后创建一个新的 Application
class 扩展现有的 Symfony 应用程序,如下所示:
申请:
namespace AppBundle\Console;
use AppBundle\Command\YourCommand;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class TestApplication extends Application
{
const NAME = 'Alternative Application';
const VERSION = '1.0';
// these are normally private, but must now be protected as they exist in doRun()
protected $command;
protected $defaultCommand;
protected $dispatcher;
protected $runningCommand;
/**
* {@inheritdoc}
*/
public function __construct()
{
parent::__construct(static::NAME, static::VERSION);
// manually add the commands you want to be handled by this
$this->add(new YourCommand());
}
/**
* {@inheritdoc}
*/
public function doRun(InputInterface $input, OutputInterface $output)
{
/* remove these lines
if (true === $input->hasParameterOption(array('--version', '-V'), true)) {
$output->writeln($this->getLongVersion());
return 0;
}
*/
// copy the rest of the doRun() function as it
// exists in the base Application class
// ...
}
/**
* {@inheritdoc}
*
* Return everything from the default input definition except the 'version' option
*/
protected function getDefaultInputDefinition()
{
$definition = [];
$defaultDefinition = parent::getDefaultInputDefinition();
foreach ($defaultDefinition->getOptions() as $option) {
if ($option->getName() !== 'version') {
$definition[] = $option;
}
}
foreach ($defaultDefinition->getArguments() as $argument) {
$definition[] = $argument;
}
return new InputDefinition($definition);
}
}
现在使用您自己的 --version
选项添加您的应用程序:
namespace AppBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class YourCommand extends ContainerAwareCommand
{
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
->setName('your:command')
->addOption('--version', '-V', InputOption::VALUE_NONE, 'okay')
;
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
if ($input->hasOption('version')) {
// do something
}
}
}
然后你可以通过以下方式调用你的命令:
php bin/console your:command
php bin/console your:comand --version
请注意,我不推荐这样做。这是很多额外的工作,除了现在使用不同的选项为自己节省几次击键之外,几乎没有任何收获。另外,如果 bin/console
或 Symfony\Component\Console\Application
将来发生变化,或者您必须手动更新这些文件,因为您覆盖了它们。
我正在使用 Symfony Console 为我的应用构建 CLI 应用程序。应用程序需要做一些简单的包管理操作来管理插件。因此,我需要一个名为 --version
和快捷方式 -v
的命令选项,这似乎是不可能的,因为 --version
是为应用程序版本保留的,而 -v
是为应用程序版本保留的默认详细设置。
我如何禁用默认选项或覆盖此子命令的默认选项?
弹出的错误状态
[Symfony\Component\Console\Exception\LogicException] An option named "version" already exists.
所以,这是一个有效的解决方案,但我不推荐它。我建议您简单地使用 --package-version
或一些其他类型的选项作为您的命令,因为这需要大量额外的工作并且不能很好地适应未来的 Symfony 更新。
你可以做的第一件事是将你的bin/
目录下的console
命令复制到一个新的命令中,并将use
语句更改为你自己的扩展应用程序:
bin/alt_console:
// use Symfony\Bundle\FrameworkBundle\Console\Application;
use AppBundle\Console\Application;
然后创建一个新的 Application
class 扩展现有的 Symfony 应用程序,如下所示:
申请:
namespace AppBundle\Console;
use AppBundle\Command\YourCommand;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Event\ConsoleErrorEvent;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class TestApplication extends Application
{
const NAME = 'Alternative Application';
const VERSION = '1.0';
// these are normally private, but must now be protected as they exist in doRun()
protected $command;
protected $defaultCommand;
protected $dispatcher;
protected $runningCommand;
/**
* {@inheritdoc}
*/
public function __construct()
{
parent::__construct(static::NAME, static::VERSION);
// manually add the commands you want to be handled by this
$this->add(new YourCommand());
}
/**
* {@inheritdoc}
*/
public function doRun(InputInterface $input, OutputInterface $output)
{
/* remove these lines
if (true === $input->hasParameterOption(array('--version', '-V'), true)) {
$output->writeln($this->getLongVersion());
return 0;
}
*/
// copy the rest of the doRun() function as it
// exists in the base Application class
// ...
}
/**
* {@inheritdoc}
*
* Return everything from the default input definition except the 'version' option
*/
protected function getDefaultInputDefinition()
{
$definition = [];
$defaultDefinition = parent::getDefaultInputDefinition();
foreach ($defaultDefinition->getOptions() as $option) {
if ($option->getName() !== 'version') {
$definition[] = $option;
}
}
foreach ($defaultDefinition->getArguments() as $argument) {
$definition[] = $argument;
}
return new InputDefinition($definition);
}
}
现在使用您自己的 --version
选项添加您的应用程序:
namespace AppBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class YourCommand extends ContainerAwareCommand
{
/**
* {@inheritdoc}
*/
protected function configure()
{
$this
->setName('your:command')
->addOption('--version', '-V', InputOption::VALUE_NONE, 'okay')
;
}
/**
* {@inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
if ($input->hasOption('version')) {
// do something
}
}
}
然后你可以通过以下方式调用你的命令:
php bin/console your:command
php bin/console your:comand --version
请注意,我不推荐这样做。这是很多额外的工作,除了现在使用不同的选项为自己节省几次击键之外,几乎没有任何收获。另外,如果 bin/console
或 Symfony\Component\Console\Application
将来发生变化,或者您必须手动更新这些文件,因为您覆盖了它们。