| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Container; |
|
|
| use DI\ContainerBuilder; |
| use Piwik\Application\Kernel\GlobalSettingsProvider; |
| use Piwik\Application\Kernel\PluginList; |
| use Piwik\Plugin\Manager; |
|
|
| |
| |
| |
| class ContainerFactory |
| { |
| |
| |
| |
| private $pluginList; |
|
|
| |
| |
| |
| private $settings; |
|
|
| |
| |
| |
| |
| |
| private $environments; |
|
|
| |
| |
| |
| private $definitions; |
|
|
| |
| |
| |
| |
| public function __construct(PluginList $pluginList, GlobalSettingsProvider $settings, array $environments = array(), array $definitions = array()) |
| { |
| $this->pluginList = $pluginList; |
| $this->settings = $settings; |
| $this->environments = $environments; |
| $this->definitions = $definitions; |
| } |
|
|
| |
| |
| |
| |
| public function create(): Container |
| { |
| $builder = new ContainerBuilder(Container::class); |
|
|
| $builder->useAnnotations(false); |
|
|
| |
| $builder->addDefinitions(new IniConfigDefinitionSource($this->settings)); |
|
|
| |
| $builder->addDefinitions(PIWIK_DOCUMENT_ROOT . '/config/global.php'); |
|
|
| |
| $this->addPluginConfigs($builder); |
|
|
| |
| if ($this->isDevelopmentModeEnabled()) { |
| $this->addEnvironmentConfig($builder, 'dev'); |
| } |
|
|
| |
| foreach ($this->environments as $environment) { |
| $this->addEnvironmentConfig($builder, $environment); |
| } |
|
|
| |
| if ( |
| file_exists(PIWIK_USER_PATH . '/config/config.php') |
| && !in_array('test', $this->environments, true) |
| ) { |
| $builder->addDefinitions(PIWIK_USER_PATH . '/config/config.php'); |
| } |
|
|
| if (!empty($this->definitions)) { |
| foreach ($this->definitions as $definitionArray) { |
| $builder->addDefinitions($definitionArray); |
| } |
| } |
|
|
| |
| $container = $builder->build(); |
| $container->set('Piwik\Application\Kernel\PluginList', $this->pluginList); |
| $container->set('Piwik\Application\Kernel\GlobalSettingsProvider', $this->settings); |
|
|
| return $container; |
| } |
|
|
| private function addEnvironmentConfig(ContainerBuilder $builder, $environment) |
| { |
| if (!$environment) { |
| return; |
| } |
|
|
| $file = sprintf('%s/config/environment/%s.php', PIWIK_USER_PATH, $environment); |
|
|
| if (file_exists($file)) { |
| $builder->addDefinitions($file); |
| } |
|
|
| $file = sprintf( |
| '%s/config/environment/%s-%s.php', |
| PIWIK_USER_PATH, |
| $environment, |
| strtolower($this->getDatabaseSchema()) |
| ); |
|
|
| if (file_exists($file)) { |
| $builder->addDefinitions($file); |
| } |
|
|
| |
| $plugins = $this->pluginList->getActivatedPlugins(); |
| $plugins = array_unique(array_merge($plugins, Manager::getAlwaysActivatedPlugins())); |
|
|
| if ($this->shouldSortPlugins()) { |
| $plugins = $this->sortPlugins($plugins); |
| } |
|
|
| foreach ($plugins as $plugin) { |
| $baseDir = Manager::getPluginDirectory($plugin); |
|
|
| $environmentFile = $baseDir . '/config/' . $environment . '.php'; |
| if (file_exists($environmentFile)) { |
| $builder->addDefinitions($environmentFile); |
| } |
| } |
| } |
|
|
| private function addPluginConfigs(ContainerBuilder $builder) |
| { |
| $plugins = $this->pluginList->getActivatedPlugins(); |
| $plugins = array_unique(array_merge($plugins, Manager::getAlwaysActivatedPlugins())); |
|
|
| if ($this->shouldSortPlugins()) { |
| $plugins = $this->sortPlugins($plugins); |
| } |
|
|
| foreach ($plugins as $plugin) { |
| $baseDir = Manager::getPluginDirectory($plugin); |
|
|
| $file = $baseDir . '/config/config.php'; |
| if (file_exists($file)) { |
| $builder->addDefinitions($file); |
| } |
| } |
| } |
|
|
| |
| |
| |
| private function shouldSortPlugins(): bool |
| { |
| return isset($GLOBALS['MATOMO_SORT_PLUGINS']) && is_callable($GLOBALS['MATOMO_SORT_PLUGINS']); |
| } |
|
|
| |
| |
| |
| |
| private function sortPlugins(array $plugins) |
| { |
| return call_user_func($GLOBALS['MATOMO_SORT_PLUGINS'], $plugins); |
| } |
|
|
| private function isDevelopmentModeEnabled(): bool |
| { |
| $section = $this->settings->getSection('Development'); |
| return (bool) @$section['enabled']; |
| } |
|
|
| private function getDatabaseSchema(): string |
| { |
| $section = $this->settings->getSection('database'); |
| return $section['schema'] ?? 'Mysql'; |
| } |
| } |
|
|