我不是Symfony的专家,我需要在symfony控制台中添加一个新的控制台选项--country=XX
。
这不是一个命令,它是一个更改命令运行方式的选项,通过选择一个不同的数据库来执行,通过构建doctrine.dbal.dbname参数来执行,例如api_fr
,api_de
,api_es
等。
我试图找到一种方法来做到这一点,但不幸的是一切都回来添加命令,这不是我想要做的,我想添加一个选项。
我正在构建一个API,其中一部分与Symfony 2.8一起使用,另一部分正在使用Symfony 3.x.我想两个版本的答案可能相同,但如果您知道如何在两个版本中执行此操作并且它们是分开的,请告诉我。
答案 0 :(得分:6)
您可以像这样的例子添加一个EventListener:
use Symfony\Component\Console\Input\InputOption;
class YourOptionEventListener
{
public function onConsoleCommand(ConsoleCommandEvent $event)
{
$inputDefinition = $event->getCommand()->getApplication()->getDefinition();
// add the option to the application's input definition
$inputDefinition->addOption(
new InputOption('yourOption', null, InputOption::VALUE_OPTIONAL, 'Description of the option', null)
);
}
}
然后将其添加为服务:
<?xml version="1.0" ?>
<container ...>
<services>
<service id="app_yourOption.console_event_listener"
class="App\YourOptionBundle\EventListener\YourOptionEventListener">
<tag name="kernel.event_listener" event="console.command" method="onConsoleCommand" />
</service>
</services>
</container>
您可以查看此文档,在“添加全局命令选项”一章中,您可以找到所需内容: http://php-and-symfony.matthiasnoback.nl/2013/11/symfony2-add-a-global-option-to-console-commands-and-generate-pid-file/
答案 1 :(得分:1)
2018和Symfony 3 + 的最佳实践是扩展Symfony应用程序:
<?php
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputOption;
final class SomeApplication extends Application
{
protected function getDefaultInputDefinition()
{
$definition = parent::getDefaultInputDefinition();
$definition->addOption(new InputOption(
'country',
null,
InputOption::VALUE_REQUIRED,
'Country to use'
));
return $definition;
}
}
然后在存在Symfony\Component\Console\Input\InputInterace
服务的命令或服务中的任何位置,只需调用:
$country = $input->getOption('country');
我在4 Ways to Add Global Option or Argument to Symfony Console Application帖子中扩展了答案。