addArgument( 'operation', InputArgument::REQUIRED, 'The operation to execute (get, set, or add)' ); $this->addArgument( 'parameter', InputArgument::REQUIRED, 'The name of the configuration parameter to get or set' ); $this->addArgument( 'value', InputArgument::OPTIONAL, 'The value to set when operation is "set" or "add", in YAML syntax' ); } protected function doExecute(InputInterface $input, OutputInterface $output) { $command = $input->getArgument('operation'); $parameter = $input->getArgument('parameter'); $parameterNodes = explode('.', $parameter); if ($command == 'get') { $this->readConfigurationValue($output, $parameter, $parameterNodes); } elseif ($command == 'set') { $this->writeConfigurationValue($output, $parameter, $parameterNodes, $input->getArgument('value')); } elseif ($command == 'add') { $this->appendConfigurationValue($output, $parameter, $parameterNodes, $input->getArgument('value')); } } private function readConfigurationValue(OutputInterface $output, $parameter, array $parameterNodes) { $app = $this->getContainer(); /** @var Configuration $config */ $config = $app['configuration.store']; $values = $config->getConfig(); $current = $values; foreach ($parameterNodes as $paramName) { $current = $current[$paramName]; } $output->writeln('Getting configuration entry ' . $parameter); $this->printConfigurationValue($output, $parameter, $current); } private function writeConfigurationValue(OutputInterface $output, $parameter, array $parameterNodes, $value) { $app = $this->getContainer(); /** @var Configuration $configurationStore */ $configurationStore = $app['configuration.store']; $lastParameter = end($parameterNodes); $configurationRoot = $configurationStore->getConfig(); $configurationCurrent = & $configurationRoot; $output->writeln('Writing value to configuration entry ' . $parameter); foreach ($parameterNodes as $paramName) { if (! isset($configurationCurrent[$paramName])) { $configurationCurrent[$paramName] = array(); } if ($lastParameter == $paramName) { $configurationCurrent[$paramName] = Yaml::parse($value); } else { $configurationCurrent = & $configurationCurrent[$paramName]; } } $configurationStore->setConfig($configurationRoot); $configurationStore->compileAndWrite(); $output->writeln('Reading updated configuration value'); $this->readConfigurationValue($output, $parameter, $parameterNodes); } private function appendConfigurationValue(OutputInterface $output, $parameter, array $parameterNodes, $value) { $app = $this->getContainer(); /** @var Configuration $configurationStore */ $configurationStore = $app['configuration.store']; $lastParameter = end($parameterNodes); $configurationRoot = $configurationStore->getConfig(); $configurationCurrent = & $configurationRoot; $output->writeln('Appending value to configuration entry ' . $parameter); foreach ($parameterNodes as $paramName) { if (! isset($configurationCurrent[$paramName])) { $configurationCurrent[$paramName] = array(); } if ($lastParameter == $paramName) { if (! is_array($configurationCurrent[$paramName])) { $configurationCurrent[$paramName] = array($configurationCurrent[$paramName]); } $parsedValue = Yaml::parse($value); if (! is_array($parsedValue)) { $parsedValue = [ $parsedValue ]; } $configurationCurrent[$paramName] = array_merge($configurationCurrent[$paramName], $parsedValue); $configurationCurrent[$paramName] = array_unique($configurationCurrent[$paramName]); } else { $configurationCurrent = & $configurationCurrent[$paramName]; } } $configurationStore->setConfig($configurationRoot); $configurationStore->compileAndWrite(); $output->writeln('Reading updated configuration value'); $this->readConfigurationValue($output, $parameter, $parameterNodes); } private function printConfigurationValue(OutputInterface $output, $name, $value, $indent = 0) { if ($indent > 0) { $output->write(PHP_EOL); } $output->write(str_repeat(' ', $indent * 4) . (is_numeric($name) ? '- ' : $name . ': ')); if (is_array($value)) { if (empty($value)) { $output->write('[]'); } foreach ($value as $valueName => $valueItem) { $this->printConfigurationValue($output, $valueName, $valueItem, $indent + 1); } } else { $output->write(var_export($value)); } if ($indent == 0) { $output->write(PHP_EOL); } } }