1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
<?php
namespace MediaWiki;
use ConfigFactory;
use EventRelayerGroup;
use GlobalVarConfig;
use Config;
use Hooks;
use Liuggio\StatsdClient\Factory\StatsdDataFactory;
use MediaWiki\Services\ServiceContainer;
use SearchEngine;
use SearchEngineConfig;
use SearchEngineFactory;
use SiteLookup;
use SiteStore;
use SkinFactory;
/**
* Service locator for MediaWiki core services.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*
* @since 1.27
*/
/**
* MediaWikiServices is the service locator for the application scope of MediaWiki.
* Its implemented as a simple configurable DI container.
* MediaWikiServices acts as a top level factory/registry for top level services, and builds
* the network of service objects that defines MediaWiki's application logic.
* It acts as an entry point to MediaWiki's dependency injection mechanism.
*
* Services are defined in the "wiring" array passed to the constructor,
* or by calling defineService().
*
* @see docs/injection.txt for an overview of using dependency injection in the
* MediaWiki code base.
*/
class MediaWikiServices extends ServiceContainer {
/**
* Returns the global default instance of the top level service locator.
*
* The default instance is initialized using the service instantiator functions
* defined in ServiceWiring.php.
*
* @note This should only be called by static functions! The instance returned here
* should not be passed around! Objects that need access to a service should have
* that service injected into the constructor, never a service locator!
*
* @return MediaWikiServices
*/
public static function getInstance() {
static $instance = null;
if ( $instance === null ) {
// NOTE: constructing GlobalVarConfig here is not particularly pretty,
// but some information from the global scope has to be injected here,
// even if it's just a file name or database credentials to load
// configuration from.
$config = new GlobalVarConfig();
$instance = new self( $config );
// Load the default wiring from the specified files.
$wiringFiles = $config->get( 'ServiceWiringFiles' );
$instance->loadWiringFiles( $wiringFiles );
// Provide a traditional hook point to allow extensions to configure services.
Hooks::run( 'MediaWikiServices', [ $instance ] );
}
return $instance;
}
/**
* @param Config $config The Config object to be registered as the 'BootstrapConfig' service.
* This has to contain at least the information needed to set up the 'ConfigFactory'
* service.
*/
public function __construct( Config $config ) {
parent::__construct();
// register the given Config object as the bootstrap config service.
$this->defineService( 'BootstrapConfig', function() use ( $config ) {
return $config;
} );
}
/**
* Returns the Config object containing the bootstrap configuration.
* Bootstrap configuration would typically include database credentials
* and other information that may be needed before the ConfigFactory
* service can be instantiated.
*
* @note This should only be used during bootstrapping, in particular
* when creating the MainConfig service. Application logic should
* use getMainConfig() to get a Config instances.
*
* @return Config
*/
public function getBootstrapConfig() {
return $this->getService( 'BootstrapConfig' );
}
/**
* @return ConfigFactory
*/
public function getConfigFactory() {
return $this->getService( 'ConfigFactory' );
}
/**
* Returns the Config object that provides configuration for MediaWiki core.
* This may or may not be the same object that is returned by getBootstrapConfig().
*
* @return Config
*/
public function getMainConfig() {
return $this->getService( 'MainConfig' );
}
/**
* @return SiteLookup
*/
public function getSiteLookup() {
return $this->getService( 'SiteLookup' );
}
/**
* @return SiteStore
*/
public function getSiteStore() {
return $this->getService( 'SiteStore' );
}
/**
* @return StatsdDataFactory
*/
public function getStatsdDataFactory() {
return $this->getService( 'StatsdDataFactory' );
}
/**
* @return EventRelayerGroup
*/
public function getEventRelayerGroup() {
return $this->getService( 'EventRelayerGroup' );
}
/**
* @return SearchEngine
*/
public function newSearchEngine() {
// New engine object every time, since they keep state
return $this->getService( 'SearchEngineFactory' )->create();
}
/**
* @return SearchEngineFactory
*/
public function getSearchEngineFactory() {
return $this->getService( 'SearchEngineFactory' );
}
/**
* @return SearchEngineConfig
*/
public function getSearchEngineConfig() {
return $this->getService( 'SearchEngineConfig' );
}
/**
* @return SkinFactory
*/
public function getSkinFactory() {
return $this->getService( 'SkinFactory' );
}
///////////////////////////////////////////////////////////////////////////
// NOTE: When adding a service getter here, don't forget to add a test
// case for it in MediaWikiServicesTest::provideGetters() and in
// MediaWikiServicesTest::provideGetService()!
///////////////////////////////////////////////////////////////////////////
}
|