Как настроить symfony/console
для принятия динамического списка параметров?
Тем не менее – имена параметров не известны на этапе разработки, поэтому мне нужно приложение, чтобы принять все и разоблачить его, используя стандартный метод $input->getOption
.
Любой шанс можно сделать легко (без взлома компонента в миллионах мест)?
Мои попытки включали расширение классов ArgvInput
и InputDefinition
но они не удались из-за разных причин (они объективны и специфичны для реализации symfony/console
). Вкратце: первый требует, чтобы разбор вызывался несколько раз; последний – создается в нескольких местах, поэтому я просто не мог найти подходящий способ его ввода.
Вы можете создать свой собственный ArgvInput, который позволит использовать все параметры.
Например, вы можете увидеть немного измененную версию ArgvInput здесь
У меня только измененные строки: 178
И закомментируйте строки: 188-199
Затем передайте экземпляр вашей версии ArgvInput вместо значения по умолчанию для
$input = new AcceptAllArgvInput(); $kernel = new AppKernel($env, $debug); $application = new Application($kernel); $application->run($input);
Я делал это раньше, используя опцию IS_ARRAY. Не будет ли это работать и для вашего экземпляра?
->addArgument('routeParams', InputArgument::IS_ARRAY, "Required Placeholders for route");
Моим вариантом использования был специальный генератор URL для специальной системы проверки подлинности. Мне нужен способ генерации URL-адресов для тестирования. Естественно, каждый маршрут имеет различное количество требуемых параметров, и я хотел избежать передачи параметров в виде строки CSV.
Примеры команд: Использование: myGenerateToken пользовательский маршрут [variables1] … [variablesN]
php app/console myGenerateToken 1 productHomePage php app/console myGenerateToken 1 getProduct 1 php app/console myGenerateToken 1 getProductFile 1 changelog
Переменные были переданы команде «routeParams» в виде массива
$params = $input->getArgument('routeParams'); var_dump($params); array(2) { [0] => string(1) "1" [1] => string(9) "changelog" }
Я заметил, что есть также версия «Option» с именем InputOption::VALUE_IS_ARRAY
, но у меня не было успеха, чтобы она работала. Версия аргумента InputArgument::IS_ARRAY
кажется, ведет себя как опция в любом случае, так как она не является ошибкой, если аргументы не указаны.
РЕДАКТИРОВАТЬ:
На вопрос автора задается вопрос «Как определить параметры командной строки переменной во время выполнения», где мой ответ: «Как вы предоставляете несколько значений для заранее заданного параметра / аргумента»,
Вот как это реализовать на PHP 7+ с помощью symfony / console ^ 3.0:
abstract class CommandWithDynamicOptions extends Command { /** @var array The list of dynamic options passed to the command */ protected $dynamicOptions = []; /** * @inheritdoc */ protected function configure() { $this->setName('custom:command'); $this->setDefinition(new class($this->getDefinition(), $this->dynamicOptions) extends InputDefinition { protected $dynamicOptions = []; public function __construct(InputDefinition $definition, array &$dynamicOptions) { parent::__construct(); $this->setArguments($definition->getArguments()); $this->setOptions($definition->getOptions()); $this->dynamicOptions =& $dynamicOptions; } public function getOption($name) { if (!parent::hasOption($name)) { $this->addOption(new InputOption($name, null, InputOption::VALUE_OPTIONAL)); $this->dynamicOptions[] = $name; } return parent::getOption($name); } public function hasOption($name) { return TRUE; } }); } }
какabstract class CommandWithDynamicOptions extends Command { /** @var array The list of dynamic options passed to the command */ protected $dynamicOptions = []; /** * @inheritdoc */ protected function configure() { $this->setName('custom:command'); $this->setDefinition(new class($this->getDefinition(), $this->dynamicOptions) extends InputDefinition { protected $dynamicOptions = []; public function __construct(InputDefinition $definition, array &$dynamicOptions) { parent::__construct(); $this->setArguments($definition->getArguments()); $this->setOptions($definition->getOptions()); $this->dynamicOptions =& $dynamicOptions; } public function getOption($name) { if (!parent::hasOption($name)) { $this->addOption(new InputOption($name, null, InputOption::VALUE_OPTIONAL)); $this->dynamicOptions[] = $name; } return parent::getOption($name); } public function hasOption($name) { return TRUE; } }); } }
какabstract class CommandWithDynamicOptions extends Command { /** @var array The list of dynamic options passed to the command */ protected $dynamicOptions = []; /** * @inheritdoc */ protected function configure() { $this->setName('custom:command'); $this->setDefinition(new class($this->getDefinition(), $this->dynamicOptions) extends InputDefinition { protected $dynamicOptions = []; public function __construct(InputDefinition $definition, array &$dynamicOptions) { parent::__construct(); $this->setArguments($definition->getArguments()); $this->setOptions($definition->getOptions()); $this->dynamicOptions =& $dynamicOptions; } public function getOption($name) { if (!parent::hasOption($name)) { $this->addOption(new InputOption($name, null, InputOption::VALUE_OPTIONAL)); $this->dynamicOptions[] = $name; } return parent::getOption($name); } public function hasOption($name) { return TRUE; } }); } }