3 namespace Drupal\Console\Core\Utils;
5 use Symfony\Component\Yaml\Yaml;
6 use Symfony\Component\Console\Input\ArgvInput;
7 use Symfony\Component\Finder\Finder;
8 use Dflydev\DotAccessConfiguration\YamlFileConfigurationBuilder;
9 use Dflydev\DotAccessConfiguration\ConfigurationInterface;
10 use Webmozart\PathUtil\Path;
13 * Class ConfigurationManager.
15 class ConfigurationManager
18 * @var ConfigurationInterface
20 private $configuration = null;
25 private $applicationDirectory = null;
30 private $configurationDirectories = [];
40 private $configurationFiles = [];
46 public function loadConfiguration($directory)
48 $this->locateConfigurationFiles();
50 $this->applicationDirectory = $directory;
51 if ($directory && is_dir($directory) && strpos($directory, 'phar:')!==0) {
52 $this->addConfigurationFilesByDirectory(
53 $directory . '/console/',
57 $input = new ArgvInput();
58 $root = $input->getParameterOption(['--root']);
59 if ($root && is_dir($root)) {
60 $this->addConfigurationFilesByDirectory(
66 $builder = new YamlFileConfigurationBuilder(
67 $this->configurationFiles['config']
70 $this->configuration = $builder->build();
78 foreach ($extras as $extra) {
79 $extraKey = 'application.extras.'.$extra;
80 $extraFlag = $this->configuration->get($extraKey)?:'true';
81 if ($extraFlag === 'true') {
82 $this->appendExtraConfiguration($extra);
90 * @return ConfigurationInterface
92 public function getConfiguration()
94 return $this->configuration;
97 private function readSite($siteFile)
99 if (!file_exists($siteFile)) {
103 return Yaml::parse(file_get_contents($siteFile));
111 public function readTarget($target)
115 $exploded = explode('.', $target, 2);
117 if (count($exploded)>1) {
118 $site = $exploded[0];
119 $environment = $exploded[1];
122 $sites = $this->getSites();
123 if (!array_key_exists($site, $sites)) {
127 $targetInformation = $sites[$site];
130 if (!array_key_exists($environment, $sites[$site])) {
134 $targetInformation = $sites[$site][$environment];
137 return $targetInformation;
143 public function getApplicationDirectory()
145 return $this->applicationDirectory;
149 * Return the sites config directory.
153 private function getSitesDirectories()
155 $sitesDirectories = array_map(
156 function ($directory) {
157 return $directory . 'sites';
159 $this->getConfigurationDirectories()
162 $sitesDirectories = array_filter(
164 function ($directory) {
165 return is_dir($directory);
169 $sitesDirectories = array_unique($sitesDirectories);
171 return $sitesDirectories;
175 * @param string $commandName
178 public function readDrushEquivalents($commandName)
181 $drushMappings = Yaml::parse(
183 $this->applicationDirectory . DRUPAL_CONSOLE_CORE . 'config/drush.yml'
187 foreach ($drushMappings['commands'] as $key => $commands) {
188 foreach ($commands as $namespace => $command) {
190 $equivalents[$namespace] = $command;
197 foreach ($equivalents as $key => $alternative) {
198 $drushMappings[] = [$key, $alternative];
201 return $drushMappings;
204 if (array_key_exists($commandName, $equivalents)) {
205 return $equivalents[$commandName] ?: ' ';
211 public function getVendorCoreRoot()
213 $consoleCoreDirectory = dirname(dirname(dirname(__FILE__))) . '/';
215 if (is_dir($consoleCoreDirectory)) {
216 return $consoleCoreDirectory;
222 public function getVendorCoreDirectory()
224 $consoleCoreDirectory = dirname(dirname(dirname(__FILE__))) . '/config/';
226 if (is_dir($consoleCoreDirectory)) {
227 return $consoleCoreDirectory;
233 public function getSystemDirectory()
235 $systemDirectory = '/etc/console/';
237 if (is_dir($systemDirectory)) {
238 return $systemDirectory;
247 public function getConsoleDirectory()
249 $consoleDirectory = sprintf(
251 $this->getHomeDirectory()
254 if (is_dir($consoleDirectory)) {
255 return $consoleDirectory;
259 mkdir($consoleDirectory, 0777, true);
260 } catch (\Exception $exception) {
264 return $consoleDirectory;
268 * @param $includeVendorCore
272 public function getConfigurationDirectories($includeVendorCore = false)
274 if ($this->configurationDirectories) {
275 if ($includeVendorCore) {
277 [$this->getVendorCoreDirectory()],
278 $this->configurationDirectories
282 return $this->configurationDirectories;
288 private function addConfigurationFilesByDirectory(
290 $addDirectory = false
293 $this->configurationDirectories[] = $directory;
295 $configurationFiles = [
296 'config' => 'config.yml',
297 'drush' => 'drush.yml',
298 'aliases' => 'aliases.yml',
299 'mappings' => 'mappings.yml',
300 'defaults' => 'defaults.yml',
302 foreach ($configurationFiles as $key => $file) {
303 $configFile = $directory.$file;
304 if (is_file($configFile)) {
305 $this->configurationFiles[$key][] = $configFile;
310 private function locateConfigurationFiles()
312 if ($this->getVendorCoreDirectory()) {
313 $this->addConfigurationFilesByDirectory(
314 $this->getVendorCoreDirectory()
317 if ($this->getSystemDirectory()) {
318 $this->addConfigurationFilesByDirectory(
319 $this->getSystemDirectory(),
323 if ($this->getConsoleDirectory()) {
324 $this->addConfigurationFilesByDirectory(
325 $this->getConsoleDirectory(),
334 private function appendExtraConfiguration($type)
336 if (!array_key_exists($type, $this->configurationFiles)) {
341 foreach ($this->configurationFiles[$type] as $configFile) {
342 if (file_get_contents($configFile)==='') {
345 $parsed = Yaml::parse(file_get_contents($configFile));
346 $configData = array_merge(
348 is_array($parsed)?$parsed:[]
352 if ($configData && array_key_exists($type, $configData)) {
353 $this->configuration->set(
354 'application.commands.'.$type,
360 public function loadExtendConfiguration()
362 $directory = $this->getConsoleDirectory() . '/extend/';
363 if (!is_dir($directory)) {
367 $autoloadFile = $directory . 'vendor/autoload.php';
368 if (!is_file($autoloadFile)) {
371 include_once $autoloadFile;
372 $extendFile = $directory . 'extend.console.config.yml';
374 $this->importConfigurationFromFile($extendFile);
377 private function importConfigurationFromFile($configFile)
379 if (is_file($configFile) && file_get_contents($configFile)!='') {
380 $builder = new YamlFileConfigurationBuilder([$configFile]);
381 if ($this->configuration) {
382 $this->configuration->import($builder->build());
384 $this->configuration = $builder->build();
392 public function getSites()
398 $sitesDirectories = $this->getSitesDirectories();
400 if (!$sitesDirectories) {
404 $finder = new Finder();
405 $finder->in($sitesDirectories);
406 $finder->name("*.yml");
408 foreach ($finder as $site) {
409 $siteName = $site->getBasename('.yml');
410 $environments = $this->readSite($site->getRealPath());
412 if (!$environments || !is_array($environments)) {
416 $this->sites[$siteName] = [
417 'file' => $site->getRealPath()
420 foreach ($environments as $environment => $config) {
421 if (!array_key_exists('type', $config)) {
422 throw new \UnexpectedValueException("The 'type' parameter is required in sites configuration.");
424 if ($config['type'] !== 'local') {
425 if (array_key_exists('host', $config)) {
426 $targetInformation['remote'] = true;
429 $config = array_merge(
430 $this->configuration->get('application.remote')?:[],
435 $this->sites[$siteName][$environment] = $config;
445 public function getConfigurationFiles()
447 return $this->configurationFiles;
450 public function getHomeDirectory()
452 return Path::getHomeDirectory();