configFactory = $configFactory; $this->configStorage = $configStorage; $this->configurationManager = $configurationManager; parent::__construct(); } /** * {@inheritdoc} */ protected function configure() { $this ->setName('config:edit') ->setDescription($this->trans('commands.config.edit.description')) ->addArgument( 'config-name', InputArgument::REQUIRED, $this->trans('commands.config.edit.arguments.config-name') ) ->addArgument( 'editor', InputArgument::OPTIONAL, $this->trans('commands.config.edit.arguments.editor') ) ->setAliases(['ced']); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $configName = $input->getArgument('config-name'); $editor = $input->getArgument('editor'); $config = $this->configFactory->getEditable($configName); $configSystem = $this->configFactory->get('system.file'); $temporaryDirectory = $configSystem->get('path.temporary') ?: '/tmp'; $configFile = $temporaryDirectory.'/config-edit/'.$configName.'.yml'; $ymlFile = new Parser(); $fileSystem = new Filesystem(); if (!$configName) { $this->getIo()->error($this->trans('commands.config.edit.messages.no-config')); return 1; } try { $fileSystem->mkdir($temporaryDirectory); $fileSystem->dumpFile($configFile, $this->getYamlConfig($configName)); } catch (IOExceptionInterface $e) { $this->getIo()->error($this->trans('commands.config.edit.messages.no-directory').' '.$e->getPath()); return 1; } if (!$editor) { $editor = $this->getEditor(); } $processBuilder = new ProcessBuilder([$editor, $configFile]); $process = $processBuilder->getProcess(); $process->setTty('true'); $process->run(); if ($process->isSuccessful()) { $value = $ymlFile->parse(file_get_contents($configFile)); $config->setData($value); $config->save(); $fileSystem->remove($configFile); } if (!$process->isSuccessful()) { $this->getIo()->error($process->getErrorOutput()); return 1; } return 0; } protected function interact(InputInterface $input, OutputInterface $output) { $configName = $input->getArgument('config-name'); if (!$configName) { $configNames = $this->configFactory->listAll(); $configName = $this->getIo()->choice( $this->trans('commands.config.edit.messages.choose-configuration'), $configNames ); $input->setArgument('config-name', $configName); } } /** * @param $config_name String * * @return array */ protected function getYamlConfig($config_name) { if ($this->configStorage->exists($config_name)) { $configuration = $this->configStorage->read($config_name); $configurationEncoded = Yaml::encode($configuration); } return $configurationEncoded; } /** * @return string */ protected function getEditor() { $config = $this->configurationManager->getConfiguration(); $editor = $config->get('application.editor', ''); if ($editor != '') { return trim($editor); } $processBuilder = new ProcessBuilder(['bash']); $process = $processBuilder->getProcess(); $process->setCommandLine('echo ${EDITOR:-${VISUAL:-vi}}'); $process->run(); $editor = $process->getOutput(); $process->stop(); return trim($editor); } }