environment = $environment; $this->definitions = $definitions; } /** * Initializes the kernel globals and DI container. */ public function init() { $this->invokeBeforeContainerCreatedHook(); $this->container = $this->createContainer(); StaticContainer::set($this->container); $this->validateEnvironment(); $this->invokeEnvironmentBootstrappedHook(); Piwik::postEvent('Environment.bootstrapped'); // this event should be removed eventually } /** * Returns the DI container. All Piwik objects for a specific Piwik instance should be stored * in this container. * * @return Container */ public function getContainer() { return $this->container; } /** * @link http://php-di.org/doc/container-configuration.html */ private function createContainer() { $pluginList = $this->getPluginListCached(); $settings = $this->getGlobalSettingsCached(); $extraDefinitions = $this->getExtraDefinitionsFromManipulators(); $definitions = array_merge(StaticContainer::getDefinitions(), $extraDefinitions, array($this->definitions)); $environments = array($this->environment); $environments = array_merge($environments, $this->getExtraEnvironmentsFromManipulators()); $containerFactory = new ContainerFactory($pluginList, $settings, $environments, $definitions); return $containerFactory->create(); } protected function getGlobalSettingsCached() { if ($this->globalSettingsProvider === null) { $globalSettingsProvider = $this->getGlobalSettingsProviderOverride(); $this->globalSettingsProvider = $globalSettingsProvider ?: $this->getGlobalSettings(); } return $this->globalSettingsProvider; } protected function getPluginListCached() { if ($this->pluginList === null) { $this->pluginList = $this->getPluginList(); } return $this->pluginList; } /** * Returns the kernel global GlobalSettingsProvider object. Derived classes can override this method * to provide a different implementation. * * @return null|GlobalSettingsProvider */ protected function getGlobalSettings() { return new GlobalSettingsProvider(); } /** * Returns the kernel global PluginList object. Derived classes can override this method to * provide a different implementation. * * @return PluginList */ protected function getPluginList() { // TODO: in tracker should only load tracker plugins. can't do properly until tracker entrypoint is encapsulated. return new PluginList($this->getGlobalSettingsCached()); } private function validateEnvironment() { /** @var EnvironmentValidator $validator */ $validator = $this->container->get('Piwik\Application\Kernel\EnvironmentValidator'); $validator->validate(); } /** * @param EnvironmentManipulator $manipulator * @internal */ public static function setGlobalEnvironmentManipulator(EnvironmentManipulator $manipulator) { self::$globalEnvironmentManipulator = $manipulator; } private function getGlobalSettingsProviderOverride() { if (self::$globalEnvironmentManipulator) { return self::$globalEnvironmentManipulator->makeGlobalSettingsProvider(); } else { return null; } } private function invokeBeforeContainerCreatedHook() { if (self::$globalEnvironmentManipulator) { return self::$globalEnvironmentManipulator->beforeContainerCreated(); } } private function getExtraDefinitionsFromManipulators() { if (self::$globalEnvironmentManipulator) { return self::$globalEnvironmentManipulator->getExtraDefinitions(); } else { return array(); } } private function invokeEnvironmentBootstrappedHook() { if (self::$globalEnvironmentManipulator) { self::$globalEnvironmentManipulator->onEnvironmentBootstrapped(); } } private function getExtraEnvironmentsFromManipulators() { if (self::$globalEnvironmentManipulator) { return self::$globalEnvironmentManipulator->getExtraEnvironments(); } else { return array(); } } }