ConfigServiceProvider.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. /**
  3. * @package Grav.Common.Service
  4. *
  5. * @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Service;
  9. use Grav\Common\Config\CompiledBlueprints;
  10. use Grav\Common\Config\CompiledConfig;
  11. use Grav\Common\Config\CompiledLanguages;
  12. use Grav\Common\Config\Config;
  13. use Grav\Common\Config\ConfigFileFinder;
  14. use Grav\Common\Config\Setup;
  15. use Pimple\Container;
  16. use Pimple\ServiceProviderInterface;
  17. use RocketTheme\Toolbox\File\YamlFile;
  18. use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
  19. class ConfigServiceProvider implements ServiceProviderInterface
  20. {
  21. public function register(Container $container)
  22. {
  23. $container['setup'] = function ($c) {
  24. return static::setup($c);
  25. };
  26. $container['blueprints'] = function ($c) {
  27. return static::blueprints($c);
  28. };
  29. $container['config'] = function ($c) {
  30. $config = static::load($c);
  31. // After configuration has been loaded, we can disable YAML compatibility if strict mode has been enabled.
  32. if (!$config->get('system.strict_mode.yaml_compat', true)) {
  33. YamlFile::globalSettings(['compat' => false, 'native' => true]);
  34. }
  35. return $config;
  36. };
  37. $container['languages'] = function ($c) {
  38. return static::languages($c);
  39. };
  40. }
  41. public static function setup(Container $container)
  42. {
  43. return new Setup($container);
  44. }
  45. public static function blueprints(Container $container)
  46. {
  47. /** Setup $setup */
  48. $setup = $container['setup'];
  49. /** @var UniformResourceLocator $locator */
  50. $locator = $container['locator'];
  51. $cache = $locator->findResource('cache://compiled/blueprints', true, true);
  52. $files = [];
  53. $paths = $locator->findResources('blueprints://config');
  54. $files += (new ConfigFileFinder)->locateFiles($paths);
  55. $paths = $locator->findResources('plugins://');
  56. $files += (new ConfigFileFinder)->setBase('plugins')->locateInFolders($paths, 'blueprints');
  57. $blueprints = new CompiledBlueprints($cache, $files, GRAV_ROOT);
  58. return $blueprints->name("master-{$setup->environment}")->load();
  59. }
  60. /**
  61. * @param Container $container
  62. * @return Config
  63. */
  64. public static function load(Container $container)
  65. {
  66. /** Setup $setup */
  67. $setup = $container['setup'];
  68. /** @var UniformResourceLocator $locator */
  69. $locator = $container['locator'];
  70. $cache = $locator->findResource('cache://compiled/config', true, true);
  71. $files = [];
  72. $paths = $locator->findResources('config://');
  73. $files += (new ConfigFileFinder)->locateFiles($paths);
  74. $paths = $locator->findResources('plugins://');
  75. $files += (new ConfigFileFinder)->setBase('plugins')->locateInFolders($paths);
  76. $config = new CompiledConfig($cache, $files, GRAV_ROOT);
  77. $config->setBlueprints(function() use ($container) {
  78. return $container['blueprints'];
  79. });
  80. return $config->name("master-{$setup->environment}")->load();
  81. }
  82. public static function languages(Container $container)
  83. {
  84. /** @var Setup $setup */
  85. $setup = $container['setup'];
  86. /** @var Config $config */
  87. $config = $container['config'];
  88. /** @var UniformResourceLocator $locator */
  89. $locator = $container['locator'];
  90. $cache = $locator->findResource('cache://compiled/languages', true, true);
  91. $files = [];
  92. // Process languages only if enabled in configuration.
  93. if ($config->get('system.languages.translations', true)) {
  94. $paths = $locator->findResources('languages://');
  95. $files += (new ConfigFileFinder)->locateFiles($paths);
  96. $paths = $locator->findResources('plugins://');
  97. $files += (new ConfigFileFinder)->setBase('plugins')->locateInFolders($paths, 'languages');
  98. $paths = static::pluginFolderPaths($paths, 'languages');
  99. $files += (new ConfigFileFinder)->locateFiles($paths);
  100. }
  101. $languages = new CompiledLanguages($cache, $files, GRAV_ROOT);
  102. return $languages->name("master-{$setup->environment}")->load();
  103. }
  104. /**
  105. * Find specific paths in plugins
  106. *
  107. * @param $plugins
  108. * @param $folder_path
  109. * @return array
  110. */
  111. private static function pluginFolderPaths($plugins, $folder_path)
  112. {
  113. $paths = [];
  114. foreach ($plugins as $path) {
  115. $iterator = new \DirectoryIterator($path);
  116. /** @var \DirectoryIterator $directory */
  117. foreach ($iterator as $directory) {
  118. if (!$directory->isDir() || $directory->isDot()) {
  119. continue;
  120. }
  121. // Path to the languages folder
  122. $lang_path = $directory->getPathName() . '/' . $folder_path;
  123. // If this folder exists, add it to the list of paths
  124. if (file_exists($lang_path)) {
  125. $paths []= $lang_path;
  126. }
  127. }
  128. }
  129. return $paths;
  130. }
  131. }