addArgument( 'operation', InputArgument::REQUIRED, 'The operation to execute (get, set, add, compile)' ); $this->addArgument( 'parameter', InputArgument::OPTIONAL, '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' ); $this->addOption('no-compile', "s", InputOption::VALUE_NONE, 'Do not compile the config after save in yml file'); } protected function doExecute(InputInterface $input, OutputInterface $output) { $command = $input->getArgument('operation'); $parameter = $input->getArgument('parameter'); $this->noCompile = $input->getOption('no-compile'); $this->quiet = $input->getOption('quiet'); $parameterNodes = explode('.', $parameter); if ($command == 'compile') { $this->compileConfiguration($output); } else { if (empty($parameter)) { $output->writeln("Missing 'parameter' argument"); return 1; } 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')); } else { $output->writeln("Command not found"); } } } private function readConfigurationValue(OutputInterface $output, $parameter, array $parameterNodes) { $app = $this->getContainer(); /** @var Configuration $config */ $config = $app['configuration.store']; $config->setNoCompile($this->noCompile); $values = $config->getConfig(); $current = $values; foreach ($parameterNodes as $paramName) { $current = $current[$paramName]; } if (!$this->quiet) { $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']; $configurationStore->setNoCompile($this->noCompile); $lastParameter = end($parameterNodes); $configurationRoot = $configurationStore->getConfig(); $configurationCurrent = & $configurationRoot; if (!$this->quiet) { $output->writeln('Writing value to configuration entry ' . $parameter); } foreach ($parameterNodes as $paramName) { if (! isset($configurationCurrent[$paramName])) { $configurationCurrent[$paramName] = array(); } if ($lastParameter == $paramName) { // if value is a file path, do not parse it $configurationCurrent[$paramName] = is_file($value) ? $value : Yaml::parse($value); } else { $configurationCurrent = & $configurationCurrent[$paramName]; } } $configurationStore->setConfig($configurationRoot); if (!$this->noCompile) { $configurationStore->compileAndWrite(); } if (!$this->quiet) { $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']; $configurationStore->setNoCompile($this->noCompile); $lastParameter = end($parameterNodes); $configurationRoot = $configurationStore->getConfig(); $configurationCurrent = & $configurationRoot; if (!$this->quiet) { $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); if (!$this->noCompile) { $configurationStore->compileAndWrite(); } if (!$this->quiet) { $output->writeln('Reading updated configuration value'); } $this->readConfigurationValue($output, $parameter, $parameterNodes); } private function printConfigurationValue(OutputInterface $output, $name, $value, $indent = 0) { if ($indent > 0 && !$this->quiet) { $output->write(PHP_EOL); } if (!$this->quiet) { $output->write(str_repeat(' ', $indent * 4) . (is_numeric($name) ? '- ' : $name . ': ')); } if (is_array($value)) { if (empty($value) && !$this->quiet) { $output->write('[]'); } foreach ($value as $valueName => $valueItem) { $this->printConfigurationValue($output, $valueName, $valueItem, $indent + 1); } } else { if (!$this->quiet) { $output->write(var_export($value)); } } if ($indent == 0) { $output->write(PHP_EOL); } } private function compileConfiguration(OutputInterface $output) { $this->container['configuration.store']->compileAndWrite(); $output->writeln('Configuration compiled!'); } }