MediaWiki REL1_34
ServiceWiring.php
Go to the documentation of this file.
1<?php
47use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
84use Wikimedia\ObjectFactory;
85
86return [
87 'ActorMigration' => function ( MediaWikiServices $services ) : ActorMigration {
89 },
90
91 'BadFileLookup' => function ( MediaWikiServices $services ) : BadFileLookup {
93 function () {
94 return wfMessage( 'bad_image_list' )->inContentLanguage()->plain();
95 },
96 $services->getLocalServerObjectCache(),
97 $services->getRepoGroup(),
98 $services->getTitleParser()
99 );
100 },
101
102 'BlobStore' => function ( MediaWikiServices $services ) : BlobStore {
103 return $services->getService( '_SqlBlobStore' );
104 },
105
106 'BlobStoreFactory' => function ( MediaWikiServices $services ) : BlobStoreFactory {
108 $services->getDBLoadBalancerFactory(),
109 $services->getExternalStoreAccess(),
110 $services->getMainWANObjectCache(),
111 new ServiceOptions( BlobStoreFactory::CONSTRUCTOR_OPTIONS,
112 $services->getMainConfig() )
113 );
114 },
115
116 'BlockManager' => function ( MediaWikiServices $services ) : BlockManager {
118 new ServiceOptions(
119 BlockManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
120 ),
121 $services->getPermissionManager(),
122 LoggerFactory::getInstance( 'BlockManager' )
123 );
124 },
125
126 'BlockRestrictionStore' => function ( MediaWikiServices $services ) : BlockRestrictionStore {
128 $services->getDBLoadBalancer()
129 );
130 },
131
132 'CommentStore' => function ( MediaWikiServices $services ) : CommentStore {
134 $services->getContentLanguage(),
136 );
137 },
138
139 'ConfigFactory' => function ( MediaWikiServices $services ) : ConfigFactory {
140 // Use the bootstrap config to initialize the ConfigFactory.
141 $registry = $services->getBootstrapConfig()->get( 'ConfigRegistry' );
142 $factory = new ConfigFactory();
143
144 foreach ( $registry as $name => $callback ) {
145 $factory->register( $name, $callback );
146 }
147 return $factory;
148 },
149
150 'ConfigRepository' => function ( MediaWikiServices $services ) : ConfigRepository {
151 return new ConfigRepository( $services->getConfigFactory() );
152 },
153
154 'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) : ConfiguredReadOnlyMode {
155 $config = $services->getMainConfig();
156 return new ConfiguredReadOnlyMode(
157 $config->get( 'ReadOnly' ),
158 $config->get( 'ReadOnlyFile' )
159 );
160 },
161
162 'ContentLanguage' => function ( MediaWikiServices $services ) : Language {
163 return Language::factory( $services->getMainConfig()->get( 'LanguageCode' ) );
164 },
165
166 'CryptHKDF' => function ( MediaWikiServices $services ) : CryptHKDF {
167 $config = $services->getMainConfig();
168
169 $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' );
170 if ( !$secret ) {
171 throw new RuntimeException( "Cannot use MWCryptHKDF without a secret." );
172 }
173
174 // In HKDF, the context can be known to the attacker, but this will
175 // keep simultaneous runs from producing the same output.
176 $context = [ microtime(), getmypid(), gethostname() ];
177
178 // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
179 $cache = $services->getLocalServerObjectCache();
180 if ( $cache instanceof EmptyBagOStuff ) {
182 }
183
184 return new CryptHKDF( $secret, $config->get( 'HKDFAlgorithm' ), $cache, $context );
185 },
186
187 'DateFormatterFactory' => function () : DateFormatterFactory {
189 },
190
191 'DBLoadBalancer' => function ( MediaWikiServices $services ) : Wikimedia\Rdbms\ILoadBalancer {
192 // just return the default LB from the DBLoadBalancerFactory service
193 return $services->getDBLoadBalancerFactory()->getMainLB();
194 },
195
196 'DBLoadBalancerFactory' =>
197 function ( MediaWikiServices $services ) : Wikimedia\Rdbms\LBFactory {
198 $mainConfig = $services->getMainConfig();
199
201 $mainConfig->get( 'LBFactoryConf' ),
202 new ServiceOptions( MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $mainConfig ),
203 $services->getConfiguredReadOnlyMode(),
204 $services->getLocalServerObjectCache(),
205 $services->getMainObjectStash(),
206 $services->getMainWANObjectCache()
207 );
208 $class = MWLBFactory::getLBFactoryClass( $lbConf );
209
210 return new $class( $lbConf );
211 },
212
213 'EventRelayerGroup' => function ( MediaWikiServices $services ) : EventRelayerGroup {
214 return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) );
215 },
216
217 'ExternalStoreAccess' => function ( MediaWikiServices $services ) : ExternalStoreAccess {
219 $services->getExternalStoreFactory(),
220 LoggerFactory::getInstance( 'ExternalStore' )
221 );
222 },
223
224 'ExternalStoreFactory' => function ( MediaWikiServices $services ) : ExternalStoreFactory {
225 $config = $services->getMainConfig();
226 $writeStores = $config->get( 'DefaultExternalStore' );
227
228 return new ExternalStoreFactory(
229 $config->get( 'ExternalStores' ),
230 ( $writeStores !== false ) ? (array)$writeStores : [],
231 $services->getDBLoadBalancer()->getLocalDomainID(),
232 LoggerFactory::getInstance( 'ExternalStore' )
233 );
234 },
235
236 'GenderCache' => function ( MediaWikiServices $services ) : GenderCache {
237 $nsInfo = $services->getNamespaceInfo();
238 // Database layer may be disabled, so processing without database connection
239 $dbLoadBalancer = $services->isServiceDisabled( 'DBLoadBalancer' )
240 ? null
241 : $services->getDBLoadBalancer();
242 return new GenderCache( $nsInfo, $dbLoadBalancer );
243 },
244
245 'HttpRequestFactory' =>
246 function ( MediaWikiServices $services ) : HttpRequestFactory {
248 },
249
250 'InterwikiLookup' => function ( MediaWikiServices $services ) : InterwikiLookup {
251 $config = $services->getMainConfig();
252 return new ClassicInterwikiLookup(
253 $services->getContentLanguage(),
254 $services->getMainWANObjectCache(),
255 $config->get( 'InterwikiExpiry' ),
256 $config->get( 'InterwikiCache' ),
257 $config->get( 'InterwikiScopes' ),
258 $config->get( 'InterwikiFallbackSite' )
259 );
260 },
261
262 'LanguageNameUtils' => function ( MediaWikiServices $services ) : LanguageNameUtils {
264 LanguageNameUtils::CONSTRUCTOR_OPTIONS,
265 $services->getMainConfig()
266 ) );
267 },
268
269 'LinkCache' => function ( MediaWikiServices $services ) : LinkCache {
270 return new LinkCache(
271 $services->getTitleFormatter(),
272 $services->getMainWANObjectCache(),
273 $services->getNamespaceInfo()
274 );
275 },
276
277 'LinkRenderer' => function ( MediaWikiServices $services ) : LinkRenderer {
278 if ( defined( 'MW_NO_SESSION' ) ) {
279 return $services->getLinkRendererFactory()->create();
280 } else {
281 // Normally information from the current request would not be passed in here;
282 // this is an exception. (See also the class documentation.)
283 return $services->getLinkRendererFactory()->createForUser(
284 RequestContext::getMain()->getUser()
285 );
286 }
287 },
288
289 'LinkRendererFactory' => function ( MediaWikiServices $services ) : LinkRendererFactory {
291 $services->getTitleFormatter(),
292 $services->getLinkCache(),
293 $services->getNamespaceInfo()
294 );
295 },
296
297 'LocalisationCache' => function ( MediaWikiServices $services ) : LocalisationCache {
298 $conf = $services->getMainConfig()->get( 'LocalisationCacheConf' );
299
300 $logger = LoggerFactory::getInstance( 'localisation' );
301
303 $conf, $services->getMainConfig()->get( 'CacheDirectory' ) );
304 $logger->debug( 'LocalisationCache: using store ' . get_class( $store ) );
305
306 return new $conf['class'](
307 new ServiceOptions(
308 LocalisationCache::CONSTRUCTOR_OPTIONS,
309 // Two of the options are stored in $wgLocalisationCacheConf
310 $conf,
311 // In case someone set that config variable and didn't reset all keys, set defaults.
312 [
313 'forceRecache' => false,
314 'manualRecache' => false,
315 ],
316 // Some other options come from config itself
317 $services->getMainConfig()
318 ),
319 $store,
320 $logger,
321 [ function () use ( $services ) {
322 // NOTE: Make sure we use the same cache object that is assigned in the
323 // constructor of the MessageBlobStore class used by ResourceLoader.
324 // T231866: Avoid circular dependency via ResourceLoader.
325 MessageBlobStore::clearGlobalCacheEntry( $services->getMainWANObjectCache() );
326 } ],
327 $services->getLanguageNameUtils()
328 );
329 },
330
331 'LocalServerObjectCache' => function ( MediaWikiServices $services ) : BagOStuff {
332 $config = $services->getMainConfig();
334
335 return ObjectCache::newFromParams( $config->get( 'ObjectCaches' )[$cacheId] );
336 },
337
338 'LockManagerGroupFactory' => function ( MediaWikiServices $services ) : LockManagerGroupFactory {
340 WikiMap::getCurrentWikiDbDomain()->getId(),
341 $services->getMainConfig()->get( 'LockManagers' ),
342 $services->getDBLoadBalancerFactory()
343 );
344 },
345
346 'MagicWordFactory' => function ( MediaWikiServices $services ) : MagicWordFactory {
347 return new MagicWordFactory( $services->getContentLanguage() );
348 },
349
350 'MainConfig' => function ( MediaWikiServices $services ) : Config {
351 // Use the 'main' config from the ConfigFactory service.
352 return $services->getConfigFactory()->makeConfig( 'main' );
353 },
354
355 'MainObjectStash' => function ( MediaWikiServices $services ) : BagOStuff {
356 $mainConfig = $services->getMainConfig();
357
358 $id = $mainConfig->get( 'MainStash' );
359 if ( !isset( $mainConfig->get( 'ObjectCaches' )[$id] ) ) {
360 throw new UnexpectedValueException(
361 "Cache type \"$id\" is not present in \$wgObjectCaches." );
362 }
363
364 $params = $mainConfig->get( 'ObjectCaches' )[$id];
365 $logger = $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache' );
366
367 $store = ObjectCache::newFromParams( $params );
368 $logger->debug( 'MainObjectStash using store {class}', [
369 'class' => get_class( $store )
370 ] );
371
372 return $store;
373 },
374
375 'MainWANObjectCache' => function ( MediaWikiServices $services ) : WANObjectCache {
376 $mainConfig = $services->getMainConfig();
377
378 $id = $mainConfig->get( 'MainWANCache' );
379 if ( !isset( $mainConfig->get( 'WANObjectCaches' )[$id] ) ) {
380 throw new UnexpectedValueException(
381 "WAN cache type \"$id\" is not present in \$wgWANObjectCaches." );
382 }
383
384 $params = $mainConfig->get( 'WANObjectCaches' )[$id];
385
386 $logger = LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache' );
387
388 $objectCacheId = $params['cacheId'];
389 if ( !isset( $mainConfig->get( 'ObjectCaches' )[$objectCacheId] ) ) {
390 throw new UnexpectedValueException(
391 "Cache type \"$objectCacheId\" is not present in \$wgObjectCaches." );
392 }
393 $storeParams = $mainConfig->get( 'ObjectCaches' )[$objectCacheId];
394 $store = ObjectCache::newFromParams( $storeParams );
395 $logger->debug( 'MainWANObjectCache using store {class}', [
396 'class' => get_class( $store )
397 ] );
398
399 $params['logger'] = $logger;
400 $params['cache'] = $store;
401 $params['secret'] = $params['secret'] ?? $mainConfig->get( 'SecretKey' );
402 if ( !$mainConfig->get( 'CommandLineMode' ) ) {
403 // Send the statsd data post-send on HTTP requests; avoid in CLI mode (T181385)
404 $params['stats'] = $services->getStatsdDataFactory();
405 // Let pre-emptive refreshes happen post-send on HTTP requests
406 $params['asyncHandler'] = [ DeferredUpdates::class, 'addCallableUpdate' ];
407 }
408
409 $class = $params['class'];
410 $instance = new $class( $params );
411
412 '@phan-var WANObjectCache $instance';
413 return $instance;
414 },
415
416 'MediaHandlerFactory' => function ( MediaWikiServices $services ) : MediaHandlerFactory {
418 $services->getMainConfig()->get( 'MediaHandlers' )
419 );
420 },
421
422 'MessageCache' => function ( MediaWikiServices $services ) : MessageCache {
423 $mainConfig = $services->getMainConfig();
424 $clusterCache = ObjectCache::getInstance( $mainConfig->get( 'MessageCacheType' ) );
425 $srvCache = $mainConfig->get( 'UseLocalMessageCache' )
426 ? $services->getLocalServerObjectCache()
427 : new EmptyBagOStuff();
428
429 // TODO: Inject this into MessageCache.
430 $logger = LoggerFactory::getInstance( 'MessageCache' );
431 $logger->debug( 'MessageCache using store {class}', [
432 'class' => get_class( $clusterCache )
433 ] );
434
435 return new MessageCache(
436 $services->getMainWANObjectCache(),
437 $clusterCache,
438 $srvCache,
439 $mainConfig->get( 'UseDatabaseMessages' ),
440 $services->getContentLanguage()
441 );
442 },
443
444 'MessageFormatterFactory' =>
445 function ( MediaWikiServices $services ) : IMessageFormatterFactory {
446 // @phan-suppress-next-line PhanAccessMethodInternal
448 },
449
450 'MimeAnalyzer' => function ( MediaWikiServices $services ) : MimeAnalyzer {
451 $logger = LoggerFactory::getInstance( 'Mime' );
452 $mainConfig = $services->getMainConfig();
453 $params = [
454 'typeFile' => $mainConfig->get( 'MimeTypeFile' ),
455 'infoFile' => $mainConfig->get( 'MimeInfoFile' ),
456 'xmlTypes' => $mainConfig->get( 'XMLMimeTypes' ),
457 'guessCallback' =>
458 function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) use ( $logger ) {
459 // Also test DjVu
460 $deja = new DjVuImage( $file );
461 if ( $deja->isValid() ) {
462 $logger->info( "Detected $file as image/vnd.djvu\n" );
463 $mime = 'image/vnd.djvu';
464
465 return;
466 }
467 // Some strings by reference for performance - assuming well-behaved hooks
469 'MimeMagicGuessFromContent',
470 [ $mimeAnalyzer, &$head, &$tail, $file, &$mime ]
471 );
472 },
473 'extCallback' => function ( $mimeAnalyzer, $ext, &$mime ) {
474 // Media handling extensions can improve the MIME detected
475 Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime ] );
476 },
477 'initCallback' => function ( $mimeAnalyzer ) {
478 // Allow media handling extensions adding MIME-types and MIME-info
479 Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer ] );
480 },
481 'logger' => $logger
482 ];
483
484 if ( $params['infoFile'] === 'includes/mime.info' ) {
485 $params['infoFile'] = __DIR__ . "/libs/mime/mime.info";
486 }
487
488 if ( $params['typeFile'] === 'includes/mime.types' ) {
489 $params['typeFile'] = __DIR__ . "/libs/mime/mime.types";
490 }
491
492 $detectorCmd = $mainConfig->get( 'MimeDetectorCommand' );
493 if ( $detectorCmd ) {
494 $factory = $services->getShellCommandFactory();
495 $params['detectCallback'] = function ( $file ) use ( $detectorCmd, $factory ) {
496 $result = $factory->create()
497 // $wgMimeDetectorCommand can contain commands with parameters
498 ->unsafeParams( $detectorCmd )
499 ->params( $file )
500 ->execute();
501 return $result->getStdout();
502 };
503 }
504
505 return new MimeAnalyzer( $params );
506 },
507
508 'MovePageFactory' => function ( MediaWikiServices $services ) : MovePageFactory {
510 new ServiceOptions( MovePageFactory::$constructorOptions, $services->getMainConfig() ),
511 $services->getDBLoadBalancer(),
512 $services->getNamespaceInfo(),
513 $services->getWatchedItemStore(),
514 $services->getPermissionManager(),
515 $services->getRepoGroup()
516 );
517 },
518
519 'NamespaceInfo' => function ( MediaWikiServices $services ) : NamespaceInfo {
520 return new NamespaceInfo( new ServiceOptions( NamespaceInfo::$constructorOptions,
521 $services->getMainConfig() ) );
522 },
523
524 'NameTableStoreFactory' => function ( MediaWikiServices $services ) : NameTableStoreFactory {
526 $services->getDBLoadBalancerFactory(),
527 $services->getMainWANObjectCache(),
528 LoggerFactory::getInstance( 'NameTableSqlStore' )
529 );
530 },
531
532 'ObjectFactory' => function ( MediaWikiServices $services ) : ObjectFactory {
533 return new ObjectFactory( $services );
534 },
535
536 'OldRevisionImporter' => function ( MediaWikiServices $services ) : OldRevisionImporter {
538 true,
539 LoggerFactory::getInstance( 'OldRevisionImporter' ),
540 $services->getDBLoadBalancer()
541 );
542 },
543
544 'PageEditStash' => function ( MediaWikiServices $services ) : PageEditStash {
545 $config = $services->getMainConfig();
546
547 return new PageEditStash(
548 ObjectCache::getLocalClusterInstance(),
549 $services->getDBLoadBalancer(),
550 LoggerFactory::getInstance( 'StashEdit' ),
551 $services->getStatsdDataFactory(),
552 defined( 'MEDIAWIKI_JOB_RUNNER' ) || $config->get( 'CommandLineMode' )
553 ? PageEditStash::INITIATOR_JOB_OR_CLI
554 : PageEditStash::INITIATOR_USER
555 );
556 },
557
558 'Parser' => function ( MediaWikiServices $services ) : Parser {
559 return $services->getParserFactory()->create();
560 },
561
562 'ParserCache' => function ( MediaWikiServices $services ) : ParserCache {
563 $config = $services->getMainConfig();
564 $cache = ObjectCache::getInstance( $config->get( 'ParserCacheType' ) );
565 wfDebugLog( 'caches', 'parser: ' . get_class( $cache ) );
566
567 return new ParserCache(
568 $cache,
569 $config->get( 'CacheEpoch' )
570 );
571 },
572
573 'ParserFactory' => function ( MediaWikiServices $services ) : ParserFactory {
574 $options = new ServiceOptions( Parser::$constructorOptions,
575 // 'class' and 'preprocessorClass'
576 $services->getMainConfig()->get( 'ParserConf' ),
577 // Make sure to have defaults in case someone overrode ParserConf with something silly
578 [ 'class' => Parser::class, 'preprocessorClass' => Preprocessor_Hash::class ],
579 // Plus a buch of actual config options
580 $services->getMainConfig()
581 );
582
583 return new ParserFactory(
584 $options,
585 $services->getMagicWordFactory(),
586 $services->getContentLanguage(),
588 $services->getSpecialPageFactory(),
589 $services->getLinkRendererFactory(),
590 $services->getNamespaceInfo(),
591 LoggerFactory::getInstance( 'Parser' )
592 );
593 },
594
595 'PasswordFactory' => function ( MediaWikiServices $services ) : PasswordFactory {
596 $config = $services->getMainConfig();
597 return new PasswordFactory(
598 $config->get( 'PasswordConfig' ),
599 $config->get( 'PasswordDefault' )
600 );
601 },
602
603 'PasswordReset' => function ( MediaWikiServices $services ) : PasswordReset {
604 $options = new ServiceOptions( PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig() );
605 return new PasswordReset(
606 $options,
607 AuthManager::singleton(),
608 $services->getPermissionManager(),
609 $services->getDBLoadBalancer(),
610 LoggerFactory::getInstance( 'authentication' )
611 );
612 },
613
614 'PerDbNameStatsdDataFactory' =>
615 function ( MediaWikiServices $services ) : StatsdDataFactoryInterface {
616 $config = $services->getMainConfig();
617 $wiki = $config->get( 'DBname' );
619 $services->getStatsdDataFactory(),
620 $wiki
621 );
622 },
623
624 'PermissionManager' => function ( MediaWikiServices $services ) : PermissionManager {
626 new ServiceOptions(
627 PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
628 ),
629 $services->getSpecialPageFactory(),
630 $services->getRevisionLookup(),
631 $services->getNamespaceInfo()
632 );
633 },
634
635 'PreferencesFactory' => function ( MediaWikiServices $services ) : PreferencesFactory {
636 $factory = new DefaultPreferencesFactory(
637 new ServiceOptions(
638 DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
639 $services->getContentLanguage(),
640 AuthManager::singleton(),
641 $services->getLinkRendererFactory()->create(),
642 $services->getNamespaceInfo(),
643 $services->getPermissionManager()
644 );
645 $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
646
647 return $factory;
648 },
649
650 'ProxyLookup' => function ( MediaWikiServices $services ) : ProxyLookup {
651 $mainConfig = $services->getMainConfig();
652 return new ProxyLookup(
653 $mainConfig->get( 'CdnServers' ),
654 $mainConfig->get( 'CdnServersNoPurge' )
655 );
656 },
657
658 'ReadOnlyMode' => function ( MediaWikiServices $services ) : ReadOnlyMode {
660 $services->getConfiguredReadOnlyMode(),
661 $services->getDBLoadBalancer()
662 );
663 },
664
665 'RepoGroup' => function ( MediaWikiServices $services ) : RepoGroup {
666 $config = $services->getMainConfig();
667 return new RepoGroup(
668 $config->get( 'LocalFileRepo' ),
669 $config->get( 'ForeignFileRepos' ),
670 $services->getMainWANObjectCache()
671 );
672 },
673
674 'ResourceLoader' => function ( MediaWikiServices $services ) : ResourceLoader {
675 // @todo This should not take a Config object, but it's not so easy to remove because it
676 // exposes it in a getter, which is actually used.
677 global $IP;
678 $config = $services->getMainConfig();
679
680 $rl = new ResourceLoader(
681 $config,
682 LoggerFactory::getInstance( 'resourceloader' )
683 );
684
685 $rl->addSource( $config->get( 'ResourceLoaderSources' ) );
686
687 // Core modules, then extension/skin modules
688 $rl->register( include "$IP/resources/Resources.php" );
689 $rl->register( $config->get( 'ResourceModules' ) );
690 Hooks::run( 'ResourceLoaderRegisterModules', [ &$rl ] );
691
692 if ( $config->get( 'EnableJavaScriptTest' ) === true ) {
693 $rl->registerTestModules();
694 }
695
696 return $rl;
697 },
698
699 'RevisionFactory' => function ( MediaWikiServices $services ) : RevisionFactory {
700 return $services->getRevisionStore();
701 },
702
703 'RevisionLookup' => function ( MediaWikiServices $services ) : RevisionLookup {
704 return $services->getRevisionStore();
705 },
706
707 'RevisionRenderer' => function ( MediaWikiServices $services ) : RevisionRenderer {
708 $renderer = new RevisionRenderer(
709 $services->getDBLoadBalancer(),
710 $services->getSlotRoleRegistry()
711 );
712
713 $renderer->setLogger( LoggerFactory::getInstance( 'SaveParse' ) );
714 return $renderer;
715 },
716
717 'RevisionStore' => function ( MediaWikiServices $services ) : RevisionStore {
718 return $services->getRevisionStoreFactory()->getRevisionStore();
719 },
720
721 'RevisionStoreFactory' => function ( MediaWikiServices $services ) : RevisionStoreFactory {
722 $config = $services->getMainConfig();
723 $store = new RevisionStoreFactory(
724 $services->getDBLoadBalancerFactory(),
725 $services->getBlobStoreFactory(),
726 $services->getNameTableStoreFactory(),
727 $services->getSlotRoleRegistry(),
728 $services->getMainWANObjectCache(),
729 $services->getCommentStore(),
730 $services->getActorMigration(),
731 $config->get( 'MultiContentRevisionSchemaMigrationStage' ),
732 LoggerFactory::getInstance( 'RevisionStore' ),
733 $config->get( 'ContentHandlerUseDB' )
734 );
735
736 return $store;
737 },
738
739 'SearchEngineConfig' => function ( MediaWikiServices $services ) : SearchEngineConfig {
740 // @todo This should not take a Config object, but it's not so easy to remove because it
741 // exposes it in a getter, which is actually used.
742 return new SearchEngineConfig( $services->getMainConfig(),
743 $services->getContentLanguage() );
744 },
745
746 'SearchEngineFactory' => function ( MediaWikiServices $services ) : SearchEngineFactory {
747 return new SearchEngineFactory( $services->getSearchEngineConfig() );
748 },
749
750 'ShellCommandFactory' => function ( MediaWikiServices $services ) : CommandFactory {
751 $config = $services->getMainConfig();
752
753 $limits = [
754 'time' => $config->get( 'MaxShellTime' ),
755 'walltime' => $config->get( 'MaxShellWallClockTime' ),
756 'memory' => $config->get( 'MaxShellMemory' ),
757 'filesize' => $config->get( 'MaxShellFileSize' ),
758 ];
759 $cgroup = $config->get( 'ShellCgroup' );
760 $restrictionMethod = $config->get( 'ShellRestrictionMethod' );
761
762 $factory = new CommandFactory( $limits, $cgroup, $restrictionMethod );
763 $factory->setLogger( LoggerFactory::getInstance( 'exec' ) );
764 $factory->logStderr();
765
766 return $factory;
767 },
768
769 'SiteLookup' => function ( MediaWikiServices $services ) : SiteLookup {
770 // Use SiteStore as the SiteLookup as well. This was originally separated
771 // to allow for a cacheable read-only interface (using FileBasedSiteLookup),
772 // but this was never used. SiteStore has caching (see below).
773 return $services->getSiteStore();
774 },
775
776 'SiteStore' => function ( MediaWikiServices $services ) : SiteStore {
777 $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
778
779 $cache = $services->getLocalServerObjectCache();
780 if ( $cache instanceof EmptyBagOStuff ) {
782 }
783
784 return new CachingSiteStore( $rawSiteStore, $cache );
785 },
786
787 'SkinFactory' => function ( MediaWikiServices $services ) : SkinFactory {
788 $factory = new SkinFactory();
789
790 $names = $services->getMainConfig()->get( 'ValidSkinNames' );
791
792 foreach ( $names as $name => $skin ) {
793 $factory->register( $name, $skin, function () use ( $name, $skin ) {
794 $class = "Skin$skin";
795 return new $class( $name );
796 } );
797 }
798 // Register a hidden "fallback" skin
799 $factory->register( 'fallback', 'Fallback', function () {
800 return new SkinFallback;
801 } );
802 // Register a hidden skin for api output
803 $factory->register( 'apioutput', 'ApiOutput', function () {
804 return new SkinApi;
805 } );
806
807 return $factory;
808 },
809
810 'SlotRoleRegistry' => function ( MediaWikiServices $services ) : SlotRoleRegistry {
811 $config = $services->getMainConfig();
812
813 $registry = new SlotRoleRegistry(
814 $services->getNameTableStoreFactory()->getSlotRoles()
815 );
816
817 $registry->defineRole( 'main', function () use ( $config ) {
818 return new MainSlotRoleHandler(
819 $config->get( 'NamespaceContentModels' )
820 );
821 } );
822
823 return $registry;
824 },
825
826 'SpecialPageFactory' => function ( MediaWikiServices $services ) : SpecialPageFactory {
828 new ServiceOptions(
829 SpecialPageFactory::$constructorOptions, $services->getMainConfig() ),
830 $services->getContentLanguage(),
831 $services->getObjectFactory()
832 );
833 },
834
835 'StatsdDataFactory' => function ( MediaWikiServices $services ) : IBufferingStatsdDataFactory {
837 rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
838 );
839 },
840
841 'TempFSFileFactory' => function ( MediaWikiServices $services ) : TempFSFileFactory {
842 return new TempFSFileFactory( $services->getMainConfig()->get( 'TmpDirectory' ) );
843 },
844
845 'TitleFormatter' => function ( MediaWikiServices $services ) : TitleFormatter {
846 return $services->getService( '_MediaWikiTitleCodec' );
847 },
848
849 'TitleParser' => function ( MediaWikiServices $services ) : TitleParser {
850 return $services->getService( '_MediaWikiTitleCodec' );
851 },
852
853 'UploadRevisionImporter' => function ( MediaWikiServices $services ) : UploadRevisionImporter {
855 $services->getMainConfig()->get( 'EnableUploads' ),
856 LoggerFactory::getInstance( 'UploadRevisionImporter' )
857 );
858 },
859
860 'VirtualRESTServiceClient' =>
861 function ( MediaWikiServices $services ) : VirtualRESTServiceClient {
862 $config = $services->getMainConfig()->get( 'VirtualRestConfig' );
863
864 $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) );
865 foreach ( $config['paths'] as $prefix => $serviceConfig ) {
866 $class = $serviceConfig['class'];
867 // Merge in the global defaults
868 $constructArg = $serviceConfig['options'] ?? [];
869 $constructArg += $config['global'];
870 // Make the VRS service available at the mount point
871 $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] );
872 }
873
874 return $vrsClient;
875 },
876
877 'WatchedItemQueryService' =>
878 function ( MediaWikiServices $services ) : WatchedItemQueryService {
880 $services->getDBLoadBalancer(),
881 $services->getCommentStore(),
882 $services->getActorMigration(),
883 $services->getWatchedItemStore(),
884 $services->getPermissionManager()
885 );
886 },
887
888 'WatchedItemStore' => function ( MediaWikiServices $services ) : WatchedItemStore {
889 $store = new WatchedItemStore(
890 $services->getDBLoadBalancerFactory(),
891 JobQueueGroup::singleton(),
892 $services->getMainObjectStash(),
893 new HashBagOStuff( [ 'maxKeys' => 100 ] ),
894 $services->getReadOnlyMode(),
895 $services->getMainConfig()->get( 'UpdateRowsPerQuery' ),
896 $services->getNamespaceInfo(),
897 $services->getRevisionLookup()
898 );
899 $store->setStatsdDataFactory( $services->getStatsdDataFactory() );
900
901 if ( $services->getMainConfig()->get( 'ReadOnlyWatchedItemStore' ) ) {
902 $store = new NoWriteWatchedItemStore( $store );
903 }
904
905 return $store;
906 },
907
908 'WikiRevisionOldRevisionImporterNoUpdates' =>
909 function ( MediaWikiServices $services ) : ImportableOldRevisionImporter {
911 false,
912 LoggerFactory::getInstance( 'OldRevisionImporter' ),
913 $services->getDBLoadBalancer()
914 );
915 },
916
917 '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) : MediaWikiTitleCodec {
919 $services->getContentLanguage(),
920 $services->getGenderCache(),
921 $services->getMainConfig()->get( 'LocalInterwikis' ),
922 $services->getInterwikiLookup(),
923 $services->getNamespaceInfo()
924 );
925 },
926
927 '_SqlBlobStore' => function ( MediaWikiServices $services ) : SqlBlobStore {
928 // @phan-suppress-next-line PhanAccessMethodInternal
929 return $services->getBlobStoreFactory()->newSqlBlobStore();
930 },
931
933 // NOTE: When adding a service here, don't forget to add a getter function
934 // in the MediaWikiServices class. The convenience getter should just call
935 // $this->getService( 'FooBarService' ).
937
938];
getPermissionManager()
getUser()
wfUrlProtocols( $includeProtocolRelative=true)
Returns a regular expression of url protocols.
wfDebugLog( $logGroup, $text, $dest='all', array $context=[])
Send a line to a supplementary debug log file, if configured, or main debug log if not.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
return[ 'ActorMigration'=> function(MediaWikiServices $services) :ActorMigration { return new ActorMigration(SCHEMA_COMPAT_NEW);}, 'BadFileLookup'=> function(MediaWikiServices $services) :BadFileLookup { return new BadFileLookup(function() { return wfMessage( 'bad_image_list') ->inContentLanguage() ->plain();}, $services->getLocalServerObjectCache(), $services->getRepoGroup(), $services->getTitleParser());}, 'BlobStore'=> function(MediaWikiServices $services) :BlobStore { return $services->getService( '_SqlBlobStore');}, 'BlobStoreFactory'=> function(MediaWikiServices $services) :BlobStoreFactory { return new BlobStoreFactory($services->getDBLoadBalancerFactory(), $services->getExternalStoreAccess(), $services->getMainWANObjectCache(), new ServiceOptions(BlobStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'BlockManager'=> function(MediaWikiServices $services) :BlockManager { return new BlockManager(new ServiceOptions(BlockManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getPermissionManager(), LoggerFactory::getInstance( 'BlockManager'));}, 'BlockRestrictionStore'=> function(MediaWikiServices $services) :BlockRestrictionStore { return new BlockRestrictionStore($services->getDBLoadBalancer());}, 'CommentStore'=> function(MediaWikiServices $services) :CommentStore { return new CommentStore($services->getContentLanguage(), MIGRATION_NEW);}, 'ConfigFactory'=> function(MediaWikiServices $services) :ConfigFactory { $registry=$services->getBootstrapConfig() ->get( 'ConfigRegistry');$factory=new ConfigFactory();foreach( $registry as $name=> $callback) { $factory->register( $name, $callback);} return $factory;}, 'ConfigRepository'=> function(MediaWikiServices $services) :ConfigRepository { return new ConfigRepository( $services->getConfigFactory());}, 'ConfiguredReadOnlyMode'=> function(MediaWikiServices $services) :ConfiguredReadOnlyMode { $config=$services->getMainConfig();return new ConfiguredReadOnlyMode($config->get( 'ReadOnly'), $config->get( 'ReadOnlyFile'));}, 'ContentLanguage'=> function(MediaWikiServices $services) :Language { return Language::factory( $services->getMainConfig() ->get( 'LanguageCode'));}, 'CryptHKDF'=> function(MediaWikiServices $services) :CryptHKDF { $config=$services->getMainConfig();$secret=$config->get( 'HKDFSecret') ?:$config->get( 'SecretKey');if(! $secret) { throw new RuntimeException("Cannot use MWCryptHKDF without a secret.");} $context=[microtime(), getmypid(), gethostname()];$cache=$services->getLocalServerObjectCache();if( $cache instanceof EmptyBagOStuff) { $cache=ObjectCache::getLocalClusterInstance();} return new CryptHKDF( $secret, $config->get( 'HKDFAlgorithm'), $cache, $context);}, 'DateFormatterFactory'=> function() :DateFormatterFactory { return new DateFormatterFactory;}, 'DBLoadBalancer'=> function(MediaWikiServices $services) :Wikimedia\Rdbms\ILoadBalancer { return $services->getDBLoadBalancerFactory() ->getMainLB();}, 'DBLoadBalancerFactory'=> function(MediaWikiServices $services) :Wikimedia\Rdbms\LBFactory { $mainConfig=$services->getMainConfig();$lbConf=MWLBFactory::applyDefaultConfig($mainConfig->get( 'LBFactoryConf'), new ServiceOptions(MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $mainConfig), $services->getConfiguredReadOnlyMode(), $services->getLocalServerObjectCache(), $services->getMainObjectStash(), $services->getMainWANObjectCache());$class=MWLBFactory::getLBFactoryClass( $lbConf);return new $class( $lbConf);}, 'EventRelayerGroup'=> function(MediaWikiServices $services) :EventRelayerGroup { return new EventRelayerGroup( $services->getMainConfig() ->get( 'EventRelayerConfig'));}, 'ExternalStoreAccess'=> function(MediaWikiServices $services) :ExternalStoreAccess { return new ExternalStoreAccess($services->getExternalStoreFactory(), LoggerFactory::getInstance( 'ExternalStore'));}, 'ExternalStoreFactory'=> function(MediaWikiServices $services) :ExternalStoreFactory { $config=$services->getMainConfig();$writeStores=$config->get( 'DefaultExternalStore');return new ExternalStoreFactory($config->get( 'ExternalStores'),( $writeStores !==false) ?(array) $writeStores :[], $services->getDBLoadBalancer() ->getLocalDomainID(), LoggerFactory::getInstance( 'ExternalStore'));}, 'GenderCache'=> function(MediaWikiServices $services) :GenderCache { $nsInfo=$services->getNamespaceInfo();$dbLoadBalancer=$services->isServiceDisabled( 'DBLoadBalancer') ? null :$services->getDBLoadBalancer();return new GenderCache( $nsInfo, $dbLoadBalancer);}, 'HttpRequestFactory'=> function(MediaWikiServices $services) :HttpRequestFactory { return new HttpRequestFactory();}, 'InterwikiLookup'=> function(MediaWikiServices $services) :InterwikiLookup { $config=$services->getMainConfig();return new ClassicInterwikiLookup($services->getContentLanguage(), $services->getMainWANObjectCache(), $config->get( 'InterwikiExpiry'), $config->get( 'InterwikiCache'), $config->get( 'InterwikiScopes'), $config->get( 'InterwikiFallbackSite'));}, 'LanguageNameUtils'=> function(MediaWikiServices $services) :LanguageNameUtils { return new LanguageNameUtils(new ServiceOptions(LanguageNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'LinkCache'=> function(MediaWikiServices $services) :LinkCache { return new LinkCache($services->getTitleFormatter(), $services->getMainWANObjectCache(), $services->getNamespaceInfo());}, 'LinkRenderer'=> function(MediaWikiServices $services) :LinkRenderer { if(defined( 'MW_NO_SESSION')) { return $services->getLinkRendererFactory() ->create();} else { return $services->getLinkRendererFactory() ->createForUser(RequestContext::getMain() ->getUser());} }, 'LinkRendererFactory'=> function(MediaWikiServices $services) :LinkRendererFactory { return new LinkRendererFactory($services->getTitleFormatter(), $services->getLinkCache(), $services->getNamespaceInfo());}, 'LocalisationCache'=> function(MediaWikiServices $services) :LocalisationCache { $conf=$services->getMainConfig() ->get( 'LocalisationCacheConf');$logger=LoggerFactory::getInstance( 'localisation');$store=LocalisationCache::getStoreFromConf($conf, $services->getMainConfig() ->get( 'CacheDirectory'));$logger->debug( 'LocalisationCache:using store ' . get_class( $store));return new $conf['class'](new ServiceOptions(LocalisationCache::CONSTRUCTOR_OPTIONS, $conf, ['forceRecache'=> false, 'manualRecache'=> false,], $services->getMainConfig()), $store, $logger, [function() use( $services) { MessageBlobStore::clearGlobalCacheEntry( $services->getMainWANObjectCache());}], $services->getLanguageNameUtils());}, 'LocalServerObjectCache'=> function(MediaWikiServices $services) :BagOStuff { $config=$services->getMainConfig();$cacheId=ObjectCache::detectLocalServerCache();return ObjectCache::newFromParams( $config->get( 'ObjectCaches')[$cacheId]);}, 'LockManagerGroupFactory'=> function(MediaWikiServices $services) :LockManagerGroupFactory { return new LockManagerGroupFactory(WikiMap::getCurrentWikiDbDomain() ->getId(), $services->getMainConfig() ->get( 'LockManagers'), $services->getDBLoadBalancerFactory());}, 'MagicWordFactory'=> function(MediaWikiServices $services) :MagicWordFactory { return new MagicWordFactory( $services->getContentLanguage());}, 'MainConfig'=> function(MediaWikiServices $services) :Config { return $services->getConfigFactory() ->makeConfig( 'main');}, 'MainObjectStash'=> function(MediaWikiServices $services) :BagOStuff { $mainConfig=$services->getMainConfig();$id=$mainConfig->get( 'MainStash');if(!isset( $mainConfig->get( 'ObjectCaches')[$id])) { throw new UnexpectedValueException("Cache type \"$id\" is not present in \$wgObjectCaches.");} $params=$mainConfig->get( 'ObjectCaches')[$id];$logger=$params['logger']=LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache');$store=ObjectCache::newFromParams( $params);$logger->debug( 'MainObjectStash using store {class}', ['class'=> get_class( $store)]);return $store;}, 'MainWANObjectCache'=> function(MediaWikiServices $services) :WANObjectCache { $mainConfig=$services->getMainConfig();$id=$mainConfig->get( 'MainWANCache');if(!isset( $mainConfig->get( 'WANObjectCaches')[$id])) { throw new UnexpectedValueException("WAN cache type \"$id\" is not present in \$wgWANObjectCaches.");} $params=$mainConfig->get( 'WANObjectCaches')[$id];$logger=LoggerFactory::getInstance( $params['loggroup'] ?? 'objectcache');$objectCacheId=$params['cacheId'];if(!isset( $mainConfig->get( 'ObjectCaches')[$objectCacheId])) { throw new UnexpectedValueException("Cache type \"$objectCacheId\" is not present in \$wgObjectCaches.");} $storeParams=$mainConfig->get( 'ObjectCaches')[$objectCacheId];$store=ObjectCache::newFromParams( $storeParams);$logger->debug( 'MainWANObjectCache using store {class}', ['class'=> get_class( $store)]);$params['logger']=$logger;$params['cache']=$store;$params['secret']=$params['secret'] ?? $mainConfig->get( 'SecretKey');if(! $mainConfig->get( 'CommandLineMode')) { $params['stats']=$services->getStatsdDataFactory();$params['asyncHandler']=[DeferredUpdates::class, 'addCallableUpdate'];} $class=$params['class'];$instance=new $class( $params);' @phan-var WANObjectCache $instance';return $instance;}, 'MediaHandlerFactory'=> function(MediaWikiServices $services) :MediaHandlerFactory { return new MediaHandlerFactory($services->getMainConfig() ->get( 'MediaHandlers'));}, 'MessageCache'=> function(MediaWikiServices $services) :MessageCache { $mainConfig=$services->getMainConfig();$clusterCache=ObjectCache::getInstance( $mainConfig->get( 'MessageCacheType'));$srvCache=$mainConfig->get( 'UseLocalMessageCache') ? $services->getLocalServerObjectCache() :new EmptyBagOStuff();$logger=LoggerFactory::getInstance( 'MessageCache');$logger->debug( 'MessageCache using store {class}', ['class'=> get_class( $clusterCache)]);return new MessageCache($services->getMainWANObjectCache(), $clusterCache, $srvCache, $mainConfig->get( 'UseDatabaseMessages'), $services->getContentLanguage());}, 'MessageFormatterFactory'=> function(MediaWikiServices $services) :IMessageFormatterFactory { return new MessageFormatterFactory();}, 'MimeAnalyzer'=> function(MediaWikiServices $services) :MimeAnalyzer { $logger=LoggerFactory::getInstance( 'Mime');$mainConfig=$services->getMainConfig();$params=['typeFile'=> $mainConfig->get( 'MimeTypeFile'), 'infoFile'=> $mainConfig->get( 'MimeInfoFile'), 'xmlTypes'=> $mainConfig->get( 'XMLMimeTypes'), 'guessCallback'=> function( $mimeAnalyzer, &$head, &$tail, $file, &$mime) use( $logger) { $deja=new DjVuImage( $file);if( $deja->isValid()) { $logger->info("Detected $file as image/vnd.djvu\n");$mime='image/vnd.djvu';return;} Hooks::run('MimeMagicGuessFromContent', [ $mimeAnalyzer, &$head, &$tail, $file, &$mime]);}, 'extCallback'=> function( $mimeAnalyzer, $ext, &$mime) { Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime]);}, 'initCallback'=> function( $mimeAnalyzer) { Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer]);}, 'logger'=> $logger];if( $params['infoFile']==='includes/mime.info') { $params['infoFile']=__DIR__ . "/libs/mime/mime.info";} if( $params['typeFile']==='includes/mime.types') { $params['typeFile']=__DIR__ . "/libs/mime/mime.types";} $detectorCmd=$mainConfig->get( 'MimeDetectorCommand');if( $detectorCmd) { $factory=$services->getShellCommandFactory();$params['detectCallback']=function( $file) use( $detectorCmd, $factory) { $result=$factory->create() ->unsafeParams( $detectorCmd) ->params( $file) ->execute();return $result->getStdout();};} return new MimeAnalyzer( $params);}, 'MovePageFactory'=> function(MediaWikiServices $services) :MovePageFactory { return new MovePageFactory(new ServiceOptions(MovePageFactory::$constructorOptions, $services->getMainConfig()), $services->getDBLoadBalancer(), $services->getNamespaceInfo(), $services->getWatchedItemStore(), $services->getPermissionManager(), $services->getRepoGroup());}, 'NamespaceInfo'=> function(MediaWikiServices $services) :NamespaceInfo { return new NamespaceInfo(new ServiceOptions(NamespaceInfo::$constructorOptions, $services->getMainConfig()));}, 'NameTableStoreFactory'=> function(MediaWikiServices $services) :NameTableStoreFactory { return new NameTableStoreFactory($services->getDBLoadBalancerFactory(), $services->getMainWANObjectCache(), LoggerFactory::getInstance( 'NameTableSqlStore'));}, 'ObjectFactory'=> function(MediaWikiServices $services) :ObjectFactory { return new ObjectFactory( $services);}, 'OldRevisionImporter'=> function(MediaWikiServices $services) :OldRevisionImporter { return new ImportableOldRevisionImporter(true, LoggerFactory::getInstance( 'OldRevisionImporter'), $services->getDBLoadBalancer());}, 'PageEditStash'=> function(MediaWikiServices $services) :PageEditStash { $config=$services->getMainConfig();return new PageEditStash(ObjectCache::getLocalClusterInstance(), $services->getDBLoadBalancer(), LoggerFactory::getInstance( 'StashEdit'), $services->getStatsdDataFactory(), defined( 'MEDIAWIKI_JOB_RUNNER')|| $config->get( 'CommandLineMode') ? PageEditStash::INITIATOR_JOB_OR_CLI :PageEditStash::INITIATOR_USER);}, 'Parser'=> function(MediaWikiServices $services) :Parser { return $services->getParserFactory() ->create();}, 'ParserCache'=> function(MediaWikiServices $services) :ParserCache { $config=$services->getMainConfig();$cache=ObjectCache::getInstance( $config->get( 'ParserCacheType'));wfDebugLog( 'caches', 'parser:' . get_class( $cache));return new ParserCache($cache, $config->get( 'CacheEpoch'));}, 'ParserFactory'=> function(MediaWikiServices $services) :ParserFactory { $options=new ServiceOptions(Parser::$constructorOptions, $services->getMainConfig() ->get( 'ParserConf'), [ 'class'=> Parser::class, 'preprocessorClass'=> Preprocessor_Hash::class], $services->getMainConfig());return new ParserFactory($options, $services->getMagicWordFactory(), $services->getContentLanguage(), wfUrlProtocols(), $services->getSpecialPageFactory(), $services->getLinkRendererFactory(), $services->getNamespaceInfo(), LoggerFactory::getInstance( 'Parser'));}, 'PasswordFactory'=> function(MediaWikiServices $services) :PasswordFactory { $config=$services->getMainConfig();return new PasswordFactory($config->get( 'PasswordConfig'), $config->get( 'PasswordDefault'));}, 'PasswordReset'=> function(MediaWikiServices $services) :PasswordReset { $options=new ServiceOptions(PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new PasswordReset($options, AuthManager::singleton(), $services->getPermissionManager(), $services->getDBLoadBalancer(), LoggerFactory::getInstance( 'authentication'));}, 'PerDbNameStatsdDataFactory'=> function(MediaWikiServices $services) :StatsdDataFactoryInterface { $config=$services->getMainConfig();$wiki=$config->get( 'DBname');return new PrefixingStatsdDataFactoryProxy($services->getStatsdDataFactory(), $wiki);}, 'PermissionManager'=> function(MediaWikiServices $services) :PermissionManager { return new PermissionManager(new ServiceOptions(PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getSpecialPageFactory(), $services->getRevisionLookup(), $services->getNamespaceInfo());}, 'PreferencesFactory'=> function(MediaWikiServices $services) :PreferencesFactory { $factory=new DefaultPreferencesFactory(new ServiceOptions(DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguage(), AuthManager::singleton(), $services->getLinkRendererFactory() ->create(), $services->getNamespaceInfo(), $services->getPermissionManager());$factory->setLogger(LoggerFactory::getInstance( 'preferences'));return $factory;}, 'ProxyLookup'=> function(MediaWikiServices $services) :ProxyLookup { $mainConfig=$services->getMainConfig();return new ProxyLookup($mainConfig->get( 'CdnServers'), $mainConfig->get( 'CdnServersNoPurge'));}, 'ReadOnlyMode'=> function(MediaWikiServices $services) :ReadOnlyMode { return new ReadOnlyMode($services->getConfiguredReadOnlyMode(), $services->getDBLoadBalancer());}, 'RepoGroup'=> function(MediaWikiServices $services) :RepoGroup { $config=$services->getMainConfig();return new RepoGroup($config->get( 'LocalFileRepo'), $config->get( 'ForeignFileRepos'), $services->getMainWANObjectCache());}, 'ResourceLoader'=> function(MediaWikiServices $services) :ResourceLoader { global $IP;$config=$services->getMainConfig();$rl=new ResourceLoader($config, LoggerFactory::getInstance( 'resourceloader'));$rl->addSource( $config->get( 'ResourceLoaderSources'));$rl->register(include "$IP/resources/Resources.php");$rl->register( $config->get( 'ResourceModules'));Hooks::run( 'ResourceLoaderRegisterModules', [&$rl]);if( $config->get( 'EnableJavaScriptTest')===true) { $rl->registerTestModules();} return $rl;}, 'RevisionFactory'=> function(MediaWikiServices $services) :RevisionFactory { return $services->getRevisionStore();}, 'RevisionLookup'=> function(MediaWikiServices $services) :RevisionLookup { return $services->getRevisionStore();}, 'RevisionRenderer'=> function(MediaWikiServices $services) :RevisionRenderer { $renderer=new RevisionRenderer($services->getDBLoadBalancer(), $services->getSlotRoleRegistry());$renderer->setLogger(LoggerFactory::getInstance( 'SaveParse'));return $renderer;}, 'RevisionStore'=> function(MediaWikiServices $services) :RevisionStore { return $services->getRevisionStoreFactory() ->getRevisionStore();}, 'RevisionStoreFactory'=> function(MediaWikiServices $services) :RevisionStoreFactory { $config=$services->getMainConfig();$store=new RevisionStoreFactory($services->getDBLoadBalancerFactory(), $services->getBlobStoreFactory(), $services->getNameTableStoreFactory(), $services->getSlotRoleRegistry(), $services->getMainWANObjectCache(), $services->getCommentStore(), $services->getActorMigration(), $config->get( 'MultiContentRevisionSchemaMigrationStage'), LoggerFactory::getInstance( 'RevisionStore'), $config->get( 'ContentHandlerUseDB'));return $store;}, 'SearchEngineConfig'=> function(MediaWikiServices $services) :SearchEngineConfig { return new SearchEngineConfig( $services->getMainConfig(), $services->getContentLanguage());}, 'SearchEngineFactory'=> function(MediaWikiServices $services) :SearchEngineFactory { return new SearchEngineFactory( $services->getSearchEngineConfig());}, 'ShellCommandFactory'=> function(MediaWikiServices $services) :CommandFactory { $config=$services->getMainConfig();$limits=['time'=> $config->get( 'MaxShellTime'), 'walltime'=> $config->get( 'MaxShellWallClockTime'), 'memory'=> $config->get( 'MaxShellMemory'), 'filesize'=> $config->get( 'MaxShellFileSize'),];$cgroup=$config->get( 'ShellCgroup');$restrictionMethod=$config->get( 'ShellRestrictionMethod');$factory=new CommandFactory( $limits, $cgroup, $restrictionMethod);$factory->setLogger(LoggerFactory::getInstance( 'exec'));$factory->logStderr();return $factory;}, 'SiteLookup'=> function(MediaWikiServices $services) :SiteLookup { return $services->getSiteStore();}, 'SiteStore'=> function(MediaWikiServices $services) :SiteStore { $rawSiteStore=new DBSiteStore( $services->getDBLoadBalancer());$cache=$services->getLocalServerObjectCache();if( $cache instanceof EmptyBagOStuff) { $cache=ObjectCache::getLocalClusterInstance();} return new CachingSiteStore( $rawSiteStore, $cache);}, 'SkinFactory'=> function(MediaWikiServices $services) :SkinFactory { $factory=new SkinFactory();$names=$services->getMainConfig() ->get( 'ValidSkinNames');foreach( $names as $name=> $skin) { $factory->register( $name, $skin, function() use( $name, $skin) { $class="Skin$skin";return new $class( $name);});} $factory->register( 'fallback', 'Fallback', function() { return new SkinFallback;});$factory->register( 'apioutput', 'ApiOutput', function() { return new SkinApi;});return $factory;}, 'SlotRoleRegistry'=> function(MediaWikiServices $services) :SlotRoleRegistry { $config=$services->getMainConfig();$registry=new SlotRoleRegistry($services->getNameTableStoreFactory() ->getSlotRoles());$registry->defineRole( 'main', function() use( $config) { return new MainSlotRoleHandler($config->get( 'NamespaceContentModels'));});return $registry;}, 'SpecialPageFactory'=> function(MediaWikiServices $services) :SpecialPageFactory { return new SpecialPageFactory(new ServiceOptions(SpecialPageFactory::$constructorOptions, $services->getMainConfig()), $services->getContentLanguage(), $services->getObjectFactory());}, 'StatsdDataFactory'=> function(MediaWikiServices $services) :IBufferingStatsdDataFactory { return new BufferingStatsdDataFactory(rtrim( $services->getMainConfig() ->get( 'StatsdMetricPrefix'), '.'));}, 'TempFSFileFactory'=> function(MediaWikiServices $services) :TempFSFileFactory { return new TempFSFileFactory( $services->getMainConfig() ->get( 'TmpDirectory'));}, 'TitleFormatter'=> function(MediaWikiServices $services) :TitleFormatter { return $services->getService( '_MediaWikiTitleCodec');}, 'TitleParser'=> function(MediaWikiServices $services) :TitleParser { return $services->getService( '_MediaWikiTitleCodec');}, 'UploadRevisionImporter'=> function(MediaWikiServices $services) :UploadRevisionImporter { return new ImportableUploadRevisionImporter($services->getMainConfig() ->get( 'EnableUploads'), LoggerFactory::getInstance( 'UploadRevisionImporter'));}, 'VirtualRESTServiceClient'=> function(MediaWikiServices $services) :VirtualRESTServiceClient { $config=$services->getMainConfig() ->get( 'VirtualRestConfig');$vrsClient=new VirtualRESTServiceClient(new MultiHttpClient([]));foreach( $config['paths'] as $prefix=> $serviceConfig) { $class=$serviceConfig['class'];$constructArg=$serviceConfig['options'] ??[];$constructArg+=$config['global'];$vrsClient->mount( $prefix, [ 'class'=> $class, 'config'=> $constructArg]);} return $vrsClient;}, 'WatchedItemQueryService'=> function(MediaWikiServices $services) :WatchedItemQueryService { return new WatchedItemQueryService($services->getDBLoadBalancer(), $services->getCommentStore(), $services->getActorMigration(), $services->getWatchedItemStore(), $services->getPermissionManager());}, 'WatchedItemStore'=> function(MediaWikiServices $services) :WatchedItemStore { $store=new WatchedItemStore($services->getDBLoadBalancerFactory(), JobQueueGroup::singleton(), $services->getMainObjectStash(), new HashBagOStuff([ 'maxKeys'=> 100]), $services->getReadOnlyMode(), $services->getMainConfig() ->get( 'UpdateRowsPerQuery'), $services->getNamespaceInfo(), $services->getRevisionLookup());$store->setStatsdDataFactory( $services->getStatsdDataFactory());if( $services->getMainConfig() ->get( 'ReadOnlyWatchedItemStore')) { $store=new NoWriteWatchedItemStore( $store);} return $store;}, 'WikiRevisionOldRevisionImporterNoUpdates'=> function(MediaWikiServices $services) :ImportableOldRevisionImporter { return new ImportableOldRevisionImporter(false, LoggerFactory::getInstance( 'OldRevisionImporter'), $services->getDBLoadBalancer());}, '_MediaWikiTitleCodec'=> function(MediaWikiServices $services) :MediaWikiTitleCodec { return new MediaWikiTitleCodec($services->getContentLanguage(), $services->getGenderCache(), $services->getMainConfig() ->get( 'LocalInterwikis'), $services->getInterwikiLookup(), $services->getNamespaceInfo());}, '_SqlBlobStore'=> function(MediaWikiServices $services) :SqlBlobStore { return $services->getBlobStoreFactory() ->newSqlBlobStore();},]
if(ini_get('mbstring.func_overload')) if(!defined('MW_ENTRY_POINT'))
Pre-config setup: Before loading LocalSettings.php.
Definition Setup.php:57
$IP
Definition WebStart.php:41
This class handles the logic for the actor table migration.
Class representing a cache/ephemeral data store.
Definition BagOStuff.php:63
get( $key, $flags=0)
Get an item with the given key.
A factory for application metric data.
CommentStore handles storage of comments (edit summaries, log reasons, etc) in the database.
Factory class to create Config objects.
A read-only mode service which does not depend on LoadBalancer.
Support for detecting/validating DjVu image files and getting some basic file metadata (resolution et...
Definition DjVuImage.php:38
A BagOStuff object with no objects in it.
Factory class for spawning EventRelayer objects using configuration.
Key/value blob storage for a collection of storage medium types (e.g.
Caches user genders when needed to use correct namespace aliases.
Simple store for keeping values in an associative array for the current process.
static run( $event, array $args=[], $deprecatedVersion=null)
Call hook functions defined in Hooks::register and $wgHooks.
Definition Hooks.php:200
Class to handle enqueueing of background jobs.
Internationalisation code.
Definition Language.php:37
Cache for article titles (prefixed DB keys) and ids linked from one source.
Definition LinkCache.php:34
Class for caching the contents of localisation files, Messages*.php and *.i18n.php.
static getStoreFromConf(array $conf, $fallbackCacheDir)
Return a suitable LCStore as specified by the given configuration.
static getLBFactoryClass(array $config)
Returns the LBFactory class to use and the load balancer configuration.
static applyDefaultConfig(array $lbConf, ServiceOptions $options, ConfiguredReadOnlyMode $readOnlyMode, BagOStuff $srvCache, BagOStuff $mainStash, WANObjectCache $wanCache)
A factory that stores information about MagicWords, and creates them on demand with caching.
Class to construct MediaHandler objects.
A codec for MediaWiki page titles.
This serves as the entry point to the authentication system.
A service class for checking blocks.
Object which holds currently registered configuration options.
A class for passing options to services.
Factory creating MWHttpRequest objects.
InterwikiLookup implementing the "classic" interwiki storage (hardcoded up to MW 1....
A service that provides utilities to do with language names and codes.
Factory to create LinkRender objects.
Class that generates HTML links for pages.
PSR-3 logger instance factory.
MediaWikiServices is the service locator for the application scope of MediaWiki.
The MediaWiki-specific implementation of IMessageFormatterFactory.
A service class for checking permissions To obtain an instance, use MediaWikiServices::getInstance()-...
This is the default implementation of PreferencesFactory.
A SlotRoleHandler for the main slot.
The RevisionRenderer service provides access to rendered output for revisions.
setLogger(LoggerInterface $saveParseLogger)
Factory service for RevisionStore instances.
Service for looking up page revisions.
A registry service for SlotRoleHandlers, used to define which slot roles are available on which page.
Factory facilitating dependency injection for Command.
Factory for handling the special page list and generating SpecialPage objects.
Service for instantiating BlobStores.
Class for managing stashed edits used by the page updater classes.
Service for storing and loading Content objects.
static clearGlobalCacheEntry(WANObjectCache $cache)
Invalidate cache keys for all known modules.
Cache of messages that are defined by MediaWiki namespace pages or by hooks.
Class to handle multiple HTTP requests.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
static detectLocalServerCache()
Detects which local server cache library is present and returns a configuration for it.
static getInstance( $id)
Get a cached instance of the specified type of cache object.
static newFromParams( $params)
Create a new cache object from parameters.
static getLocalClusterInstance()
Get the main cluster-local cache object.
PHP Parser - Processes wiki markup (which uses a more user-friendly syntax, such as "[[link]]" for ma...
Definition Parser.php:74
Factory class for creating and checking Password objects.
Helper class for the password reset functionality shared by the web UI and the API.
Proxy to prefix metric keys sent to a StatsdDataFactoryInterface.
Differences from DOM schema:
A service class for fetching the wiki's current read-only mode.
Prioritized list of file repositories.
Definition RepoGroup.php:31
ResourceLoader is a loading system for JavaScript and CSS resources.
Configuration handling class for SearchEngine.
Factory class for SearchEngine.
SkinTemplate class for API output.
Definition SkinApi.php:31
Factory class to create Skin objects.
register( $name, $displayName, $callback)
Register a new Skin factory function.
SkinTemplate class for the fallback skin.
Virtual HTTP service client loosely styled after a Virtual File System.
Multi-datacenter aware caching interface.
get( $key, &$curTTL=null, array $checkKeys=[], &$info=null)
Fetch the value of a key from cache.
Storage layer class for WatchedItems.
setStatsdDataFactory(StatsdDataFactoryInterface $stats)
Helper tools for dealing with other locally-hosted wikis.
Definition WikiMap.php:29
const MIGRATION_NEW
Definition Defines.php:307
const SCHEMA_COMPAT_NEW
Definition Defines.php:280
Interface for configuration instances.
Definition Config.php:28
MediaWiki adaptation of StatsdDataFactory that provides buffering functionality.
Service interface for looking up Interwiki records.
A PreferencesFactory is a MediaWiki service that provides the definitions of preferences for a given ...
Service for constructing revision objects.
Service for looking up page revisions.
Service for loading and storing data blobs.
Definition BlobStore.php:35
A title formatter service for MediaWiki.
A title parser service for MediaWiki.
A simple factory providing a message formatter for a given language code.
$context
Definition load.php:45
$cache
Definition mcc.php:33
This program is free software; you can redistribute it and/or modify it under the terms of the GNU Ge...
return true
Definition router.php:94
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition router.php:42
if(!is_readable( $file)) $ext
Definition router.php:48