MediaWiki 1.41.2
ServiceWiring.php
Go to the documentation of this file.
1<?php
44use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
223use Wikimedia\ObjectFactory\ObjectFactory;
224use Wikimedia\Parsoid\Config\DataAccess;
225use Wikimedia\Parsoid\Config\SiteConfig;
226use Wikimedia\Parsoid\Parsoid;
231use Wikimedia\RequestTimeout\CriticalSectionProvider;
232use Wikimedia\RequestTimeout\RequestTimeout;
238
240return [
241 'ActionFactory' => static function ( MediaWikiServices $services ): ActionFactory {
243 $services->getMainConfig()->get( MainConfigNames::Actions ),
244 LoggerFactory::getInstance( 'ActionFactory' ),
245 $services->getObjectFactory(),
246 $services->getHookContainer()
247 );
248 },
249
250 'ActorMigration' => static function ( MediaWikiServices $services ): ActorMigration {
253 $services->getActorStoreFactory()
254 );
255 },
256
257 'ActorNormalization' => static function ( MediaWikiServices $services ): ActorNormalization {
258 return $services->getActorStoreFactory()->getActorNormalization();
259 },
260
261 'ActorStore' => static function ( MediaWikiServices $services ): ActorStore {
262 return $services->getActorStoreFactory()->getActorStore();
263 },
264
265 'ActorStoreFactory' => static function ( MediaWikiServices $services ): ActorStoreFactory {
267 new ServiceOptions( ActorStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
268 $services->getDBLoadBalancerFactory(),
269 $services->getUserNameUtils(),
270 $services->getTempUserConfig(),
271 LoggerFactory::getInstance( 'ActorStore' )
272 );
273 },
274
275 'ArchivedRevisionLookup' => static function ( MediaWikiServices $services ): ArchivedRevisionLookup {
277 $services->getDBLoadBalancerFactory(),
278 $services->getRevisionStore()
279 );
280 },
281
282 'AuthManager' => static function ( MediaWikiServices $services ): AuthManager {
283 $authManager = new AuthManager(
284 RequestContext::getMain()->getRequest(),
285 $services->getMainConfig(),
286 $services->getObjectFactory(),
287 $services->getHookContainer(),
288 $services->getReadOnlyMode(),
289 $services->getUserNameUtils(),
290 $services->getBlockManager(),
291 $services->getWatchlistManager(),
292 $services->getDBLoadBalancer(),
293 $services->getContentLanguage(),
294 $services->getLanguageConverterFactory(),
295 $services->getBotPasswordStore(),
296 $services->getUserFactory(),
297 $services->getUserIdentityLookup(),
298 $services->getUserOptionsManager()
299 );
300 $authManager->setLogger( LoggerFactory::getInstance( 'authentication' ) );
301 return $authManager;
302 },
303
304 'BacklinkCacheFactory' => static function ( MediaWikiServices $services ): BacklinkCacheFactory {
306 new ServiceOptions(
307 BacklinkCache::CONSTRUCTOR_OPTIONS,
308 $services->getMainConfig()
309 ),
310 $services->getLinksMigration(),
311 $services->getMainWANObjectCache(),
312 $services->getHookContainer(),
313 $services->getDBLoadBalancerFactory()
314 );
315 },
316
317 'BadFileLookup' => static function ( MediaWikiServices $services ): BadFileLookup {
319 static function () {
320 return wfMessage( 'bad_image_list' )->inContentLanguage()->plain();
321 },
322 $services->getLocalServerObjectCache(),
323 $services->getRepoGroup(),
324 $services->getTitleParser(),
325 $services->getHookContainer()
326 );
327 },
328
329 'BlobStore' => static function ( MediaWikiServices $services ): BlobStore {
330 return $services->getService( '_SqlBlobStore' );
331 },
332
333 'BlobStoreFactory' => static function ( MediaWikiServices $services ): BlobStoreFactory {
335 $services->getDBLoadBalancerFactory(),
336 $services->getExternalStoreAccess(),
337 $services->getMainWANObjectCache(),
338 new ServiceOptions( BlobStoreFactory::CONSTRUCTOR_OPTIONS,
339 $services->getMainConfig() )
340 );
341 },
342
343 'BlockActionInfo' => static function ( MediaWikiServices $services ): BlockActionInfo {
344 return new BlockActionInfo( $services->getHookContainer() );
345 },
346
347 'BlockErrorFormatter' => static function ( MediaWikiServices $services ): BlockErrorFormatter {
349 $services->getTitleFormatter(),
350 $services->getHookContainer(),
351 $services->getUserIdentityUtils()
352 );
353 },
354
355 'BlockManager' => static function ( MediaWikiServices $services ): BlockManager {
357 new ServiceOptions(
358 BlockManager::CONSTRUCTOR_OPTIONS,
359 $services->getMainConfig()
360 ),
361 $services->getPermissionManager(),
362 $services->getUserFactory(),
363 $services->getUserIdentityUtils(),
364 LoggerFactory::getInstance( 'BlockManager' ),
365 $services->getHookContainer()
366 );
367 },
368
369 'BlockPermissionCheckerFactory' => static function (
370 MediaWikiServices $services
373 new ServiceOptions(
374 BlockPermissionCheckerFactory::CONSTRUCTOR_OPTIONS,
375 $services->getMainConfig()
376 ),
377 $services->getBlockUtils()
378 );
379 },
380
381 'BlockRestrictionStore' => static function ( MediaWikiServices $services ): BlockRestrictionStore {
382 return $services->getBlockRestrictionStoreFactory()->getBlockRestrictionStore( WikiAwareEntity::LOCAL );
383 },
384
385 'BlockRestrictionStoreFactory' => static function ( MediaWikiServices $services ): BlockRestrictionStoreFactory {
387 $services->getDBLoadBalancerFactory()
388 );
389 },
390
391 'BlockUserFactory' => static function ( MediaWikiServices $services ): BlockUserFactory {
392 return $services->getService( '_UserBlockCommandFactory' );
393 },
394
395 'BlockUtils' => static function ( MediaWikiServices $services ): BlockUtils {
396 return new BlockUtils(
397 new ServiceOptions(
398 BlockUtils::CONSTRUCTOR_OPTIONS,
399 $services->getMainConfig()
400 ),
401 $services->getUserIdentityLookup(),
402 $services->getUserNameUtils()
403 );
404 },
405
406 'BotPasswordStore' => static function ( MediaWikiServices $services ): BotPasswordStore {
408 new ServiceOptions(
409 BotPasswordStore::CONSTRUCTOR_OPTIONS,
410 $services->getMainConfig()
411 ),
412 $services->getCentralIdLookup(),
413 $services->getDBLoadBalancerFactory()
414 );
415 },
416
417 'CentralIdLookup' => static function ( MediaWikiServices $services ): CentralIdLookup {
418 return $services->getCentralIdLookupFactory()->getLookup();
419 },
420
421 'CentralIdLookupFactory' => static function ( MediaWikiServices $services ): CentralIdLookupFactory {
423 new ServiceOptions( CentralIdLookupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
424 $services->getObjectFactory(),
425 $services->getUserIdentityLookup()
426 );
427 },
428
429 'ChangeTagDefStore' => static function ( MediaWikiServices $services ): NameTableStore {
430 return $services->getNameTableStoreFactory()->getChangeTagDef();
431 },
432
433 'ChangeTagsStore' => static function ( MediaWikiServices $services ): ChangeTagsStore {
435 $services->getDBLoadBalancerFactory(),
436 $services->getChangeTagDefStore(),
437 $services->getMainWANObjectCache(),
438 $services->getHookContainer(),
439 LoggerFactory::getInstance( 'ChangeTags' ),
440 $services->getUserFactory(),
441 new ServiceOptions(
442 ChangeTagsStore::CONSTRUCTOR_OPTIONS,
443 $services->getMainConfig()
444 )
445 );
446 },
447
448 'ChronologyProtector' => static function ( MediaWikiServices $services ): ChronologyProtector {
449 $mainConfig = $services->getMainConfig();
450 $cpStashType = $mainConfig->get( MainConfigNames::ChronologyProtectorStash );
451 $isMainCacheBad = ObjectCache::isDatabaseId( $mainConfig->get( MainConfigNames::MainCacheType ) );
452
453 if ( is_string( $cpStashType ) ) {
454 $cpStash = ObjectCache::getInstance( $cpStashType );
455 } elseif ( $isMainCacheBad ) {
456 $cpStash = new EmptyBagOStuff();
457 } else {
459 }
460
461 $chronologyProtector = new ChronologyProtector(
462 $cpStash,
463 $mainConfig->get( MainConfigNames::ChronologyProtectorSecret ),
464 $mainConfig->get( 'CommandLineMode' ),
465 LoggerFactory::getInstance( 'rdbms' )
466 );
467
468 // Use the global WebRequest singleton. The main reason for using this
469 // is to call WebRequest::getIP() which is non-trivial to reproduce statically
470 // because it needs $wgUsePrivateIPs, as well as ProxyLookup and HookRunner services.
471 // TODO: Create a static version of WebRequest::getIP that accepts these three
472 // as dependencies, and then call that here. The other uses of $req below can
473 // trivially use $_COOKIES, $_GET and $_SERVER instead.
474 $req = RequestContext::getMain()->getRequest();
475
476 // Set user IP/agent information for agent session consistency purposes
477 $reqStart = (int)( $_SERVER['REQUEST_TIME_FLOAT'] ?? time() );
478 $cpPosInfo = ChronologyProtector::getCPInfoFromCookieValue(
479 // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
480 $req->getCookie( 'cpPosIndex', '' ),
481 // Mitigate broken client-side cookie expiration handling (T190082)
482 $reqStart - ChronologyProtector::POSITION_COOKIE_TTL
483 );
484 $chronologyProtector->setRequestInfo( [
485 'IPAddress' => $req->getIP(),
486 'UserAgent' => $req->getHeader( 'User-Agent' ),
487 'ChronologyPositionIndex' => $req->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
488 'ChronologyClientId' => $cpPosInfo['clientId'] ?? null,
489 ] );
490 return $chronologyProtector;
491 },
492
493 'CollationFactory' => static function ( MediaWikiServices $services ): CollationFactory {
495 new ServiceOptions(
496 CollationFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
497 $services->getObjectFactory(),
498 $services->getHookContainer()
499 );
500 },
501
502 'CommentFormatter' => static function ( MediaWikiServices $services ): CommentFormatter {
504 $services->getCommentParserFactory()
505 );
506 },
507
508 'CommentParserFactory' => static function ( MediaWikiServices $services ): CommentParserFactory {
510 $services->getLinkRendererFactory()->create( [ 'renderForComment' => true ] ),
511 $services->getLinkBatchFactory(),
512 $services->getLinkCache(),
513 $services->getRepoGroup(),
514 RequestContext::getMain()->getLanguage(),
515 $services->getContentLanguage(),
516 $services->getTitleParser(),
517 $services->getNamespaceInfo(),
518 $services->getHookContainer()
519 );
520 },
521
522 'CommentStore' => static function ( MediaWikiServices $services ): CommentStore {
523 return new CommentStore( $services->getContentLanguage() );
524 },
525
526 'ConfigFactory' => static function ( MediaWikiServices $services ): ConfigFactory {
527 // Use the bootstrap config to initialize the ConfigFactory.
528 $registry = $services->getBootstrapConfig()->get( MainConfigNames::ConfigRegistry );
529 $factory = new ConfigFactory();
530
531 foreach ( $registry as $name => $callback ) {
532 $factory->register( $name, $callback );
533 }
534 return $factory;
535 },
536
537 'ConfigRepository' => static function ( MediaWikiServices $services ): ConfigRepository {
538 return new ConfigRepository( $services->getConfigFactory() );
539 },
540
541 'ConfigSchema' => static function ( MediaWikiServices $services ): ConfigSchema {
543 $settings = $services->get( '_SettingsBuilder' );
544 return $settings->getConfigSchema();
545 },
546
547 'ConfiguredReadOnlyMode' => static function ( MediaWikiServices $services ): ConfiguredReadOnlyMode {
548 $config = $services->getMainConfig();
549 return new ConfiguredReadOnlyMode(
550 $config->get( MainConfigNames::ReadOnly ),
551 $config->get( MainConfigNames::ReadOnlyFile )
552 );
553 },
554
555 'ContentHandlerFactory' => static function ( MediaWikiServices $services ): IContentHandlerFactory {
556 $contentHandlerConfig = $services->getMainConfig()->get( MainConfigNames::ContentHandlers );
557
558 return new ContentHandlerFactory(
559 $contentHandlerConfig,
560 $services->getObjectFactory(),
561 $services->getHookContainer(),
562 LoggerFactory::getInstance( 'ContentHandler' )
563 );
564 },
565
566 'ContentLanguage' => static function ( MediaWikiServices $services ): Language {
567 return $services->getLanguageFactory()->getLanguage(
568 $services->getMainConfig()->get( MainConfigNames::LanguageCode ) );
569 },
570
571 'ContentModelChangeFactory' => static function ( MediaWikiServices $services ): ContentModelChangeFactory {
572 return $services->getService( '_PageCommandFactory' );
573 },
574
575 'ContentModelStore' => static function ( MediaWikiServices $services ): NameTableStore {
576 return $services->getNameTableStoreFactory()->getContentModels();
577 },
578
579 'ContentRenderer' => static function ( MediaWikiServices $services ): ContentRenderer {
580 return new ContentRenderer( $services->getContentHandlerFactory() );
581 },
582
583 'ContentTransformer' => static function ( MediaWikiServices $services ): ContentTransformer {
584 return new ContentTransformer( $services->getContentHandlerFactory() );
585 },
586
587 'ContributionsLookup' => static function ( MediaWikiServices $services ): ContributionsLookup {
589 $services->getRevisionStore(),
590 $services->getLinkRendererFactory(),
591 $services->getLinkBatchFactory(),
592 $services->getHookContainer(),
593 $services->getDBLoadBalancerFactory(),
594 $services->getNamespaceInfo(),
595 $services->getCommentFormatter()
596 );
597 },
598
599 'CriticalSectionProvider' => static function ( MediaWikiServices $services ): CriticalSectionProvider {
600 $config = $services->getMainConfig();
601 $limit = $GLOBALS[ 'wgCommandLineMode' ] ? INF : $config->get( MainConfigNames::CriticalSectionTimeLimit );
602 return RequestTimeout::singleton()->createCriticalSectionProvider( $limit );
603 },
604
605 'CryptHKDF' => static function ( MediaWikiServices $services ): CryptHKDF {
606 $config = $services->getMainConfig();
607
608 $secret = $config->get( MainConfigNames::HKDFSecret ) ?: $config->get( MainConfigNames::SecretKey );
609 if ( !$secret ) {
610 throw new RuntimeException( "Cannot use MWCryptHKDF without a secret." );
611 }
612
613 // In HKDF, the context can be known to the attacker, but this will
614 // keep simultaneous runs from producing the same output.
615 $context = [ microtime(), getmypid(), gethostname() ];
616
617 // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
618 $cache = $services->getLocalServerObjectCache();
619 if ( $cache instanceof EmptyBagOStuff ) {
621 }
622
623 return new CryptHKDF( $secret, $config->get( MainConfigNames::HKDFAlgorithm ), $cache, $context );
624 },
625
626 'DatabaseBlockStore' => static function ( MediaWikiServices $services ): DatabaseBlockStore {
627 return $services->getDatabaseBlockStoreFactory()->getDatabaseBlockStore( DatabaseBlock::LOCAL );
628 },
629
630 'DatabaseBlockStoreFactory' => static function ( MediaWikiServices $services ): DatabaseBlockStoreFactory {
632 new ServiceOptions(
633 DatabaseBlockStoreFactory::CONSTRUCTOR_OPTIONS,
634 $services->getMainConfig()
635 ),
636 LoggerFactory::getInstance( 'DatabaseBlockStore' ),
637 $services->getActorStoreFactory(),
638 $services->getBlockRestrictionStoreFactory(),
639 $services->getCommentStore(),
640 $services->getHookContainer(),
641 $services->getDBLoadBalancerFactory(),
642 $services->getReadOnlyMode(),
643 $services->getUserFactory()
644 );
645 },
646
647 'DatabaseFactory' => static function ( MediaWikiServices $services ): DatabaseFactory {
649 [ 'debugSql' => $services->getMainConfig()->get( MainConfigNames::DebugDumpSql ) ]
650 );
651 },
652
653 'DateFormatterFactory' => static function ( MediaWikiServices $services ): DateFormatterFactory {
655 },
656
657 'DBLoadBalancer' => static function ( MediaWikiServices $services ): Wikimedia\Rdbms\ILoadBalancer {
658 // just return the default LB from the DBLoadBalancerFactory service
659 return $services->getDBLoadBalancerFactory()->getMainLB();
660 },
661
662 'DBLoadBalancerFactory' =>
663 static function ( MediaWikiServices $services ): Wikimedia\Rdbms\LBFactory {
664 $mainConfig = $services->getMainConfig();
665 $lbFactoryConfigBuilder = $services->getDBLoadBalancerFactoryConfigBuilder();
666
667 $lbConf = $lbFactoryConfigBuilder->applyDefaultConfig(
668 $mainConfig->get( MainConfigNames::LBFactoryConf )
669 );
670
671 $class = $lbFactoryConfigBuilder->getLBFactoryClass( $lbConf );
672 $instance = new $class( $lbConf );
673
674 $lbFactoryConfigBuilder->setDomainAliases( $instance );
675
676 // NOTE: This accesses ProxyLookup from the MediaWikiServices singleton
677 // for non-essential non-nonimal purposes (via WebRequest::getIP).
678 // This state is fine (and meant) to be consistent for a given PHP process,
679 // even if applied to the service container for a different wiki.
680 $lbFactoryConfigBuilder->applyGlobalState(
681 $instance,
682 $mainConfig,
683 $services->getStatsdDataFactory()
684 );
685
686 return $instance;
687 },
688
689 'DBLoadBalancerFactoryConfigBuilder' => static function ( MediaWikiServices $services ): MWLBFactory {
690 $mainConfig = $services->getMainConfig();
691 if ( ObjectCache::isDatabaseId( $mainConfig->get( MainConfigNames::MainCacheType ) ) ) {
692 $wanCache = WANObjectCache::newEmpty();
693 } else {
694 $wanCache = $services->getMainWANObjectCache();
695 }
696 $srvCache = $services->getLocalServerObjectCache();
697 if ( $srvCache instanceof EmptyBagOStuff ) {
698 // Use process cache if no APCU or other local-server cache (e.g. on CLI)
699 $srvCache = new HashBagOStuff( [ 'maxKeys' => 100 ] );
700 }
701
702 return new MWLBFactory(
703 new ServiceOptions( MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $services->getMainConfig() ),
705 $mainConfig->get( MainConfigNames::ReadOnly ),
706 $mainConfig->get( MainConfigNames::ReadOnlyFile )
707 ),
708 $services->getChronologyProtector(),
709 $srvCache,
710 $wanCache,
711 $services->getCriticalSectionProvider(),
712 $services->getStatsdDataFactory(),
713 ExtensionRegistry::getInstance()->getAttribute( 'DatabaseVirtualDomains' )
714 );
715 },
716
717 'DeletePageFactory' => static function ( MediaWikiServices $services ): DeletePageFactory {
718 return $services->getService( '_PageCommandFactory' );
719 },
720
721 'Emailer' => static function ( MediaWikiServices $services ): IEmailer {
722 return new Emailer();
723 },
724
725 'EmailUserFactory' => static function ( MediaWikiServices $services ): EmailUserFactory {
727 new ServiceOptions( EmailUser::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
728 $services->getHookContainer(),
729 $services->getUserOptionsLookup(),
730 $services->getCentralIdLookup(),
731 $services->getUserFactory(),
732 $services->getEmailer(),
733 $services->getMessageFormatterFactory(),
734 $services->getMessageFormatterFactory()->getTextFormatter( $services->getContentLanguage()->getCode() )
735 );
736 },
737
738 'EventRelayerGroup' => static function ( MediaWikiServices $services ): EventRelayerGroup {
739 return new EventRelayerGroup( $services->getMainConfig()->get( MainConfigNames::EventRelayerConfig ) );
740 },
741
742 'ExternalStoreAccess' => static function ( MediaWikiServices $services ): ExternalStoreAccess {
744 $services->getExternalStoreFactory(),
745 LoggerFactory::getInstance( 'ExternalStore' )
746 );
747 },
748
749 'ExternalStoreFactory' => static function ( MediaWikiServices $services ): ExternalStoreFactory {
750 $config = $services->getMainConfig();
751 $writeStores = $config->get( MainConfigNames::DefaultExternalStore );
752
753 return new ExternalStoreFactory(
754 $config->get( MainConfigNames::ExternalStores ),
755 ( $writeStores !== false ) ? (array)$writeStores : [],
756 $services->getDBLoadBalancer()->getLocalDomainID(),
757 LoggerFactory::getInstance( 'ExternalStore' )
758 );
759 },
760
761 'FileBackendGroup' => static function ( MediaWikiServices $services ): FileBackendGroup {
762 $mainConfig = $services->getMainConfig();
763
764 $ld = WikiMap::getCurrentWikiDbDomain();
765 $fallbackWikiId = WikiMap::getWikiIdFromDbDomain( $ld );
766 // If the local wiki ID and local domain ID do not match, probably due to a non-default
767 // schema, issue a warning. A non-default schema indicates that it might be used to
768 // disambiguate different wikis.
769 $legacyDomainId = strlen( $ld->getTablePrefix() )
770 ? "{$ld->getDatabase()}-{$ld->getTablePrefix()}"
771 : $ld->getDatabase();
772 if ( $ld->getSchema() !== null && $legacyDomainId !== $fallbackWikiId ) {
773 wfWarn(
774 "Legacy default 'domainId' is '$legacyDomainId' but wiki ID is '$fallbackWikiId'."
775 );
776 }
777
778 $cache = $services->getLocalServerObjectCache();
779 if ( $cache instanceof EmptyBagOStuff ) {
780 $cache = new HashBagOStuff();
781 }
782
783 return new FileBackendGroup(
784 new ServiceOptions( FileBackendGroup::CONSTRUCTOR_OPTIONS, $mainConfig,
785 [ 'fallbackWikiId' => $fallbackWikiId ] ),
786 $services->getReadOnlyMode(),
787 $cache,
788 $services->getMainWANObjectCache(),
789 $services->getMimeAnalyzer(),
790 $services->getLockManagerGroupFactory(),
791 $services->getTempFSFileFactory(),
792 $services->getObjectFactory()
793 );
794 },
795
796 'GenderCache' => static function ( MediaWikiServices $services ): GenderCache {
797 $nsInfo = $services->getNamespaceInfo();
798 // Database layer may be disabled, so processing without database connection
799 $dbLoadBalancer = $services->isServiceDisabled( 'DBLoadBalancer' )
800 ? null
801 : $services->getDBLoadBalancerFactory();
802 return new GenderCache( $nsInfo, $dbLoadBalancer, $services->get( '_DefaultOptionsLookup' ) );
803 },
804
805 'GlobalIdGenerator' => static function ( MediaWikiServices $services ): GlobalIdGenerator {
806 $mainConfig = $services->getMainConfig();
807
808 return new GlobalIdGenerator(
809 $mainConfig->get( MainConfigNames::TmpDirectory ),
810 static function ( $command ) {
811 return wfShellExec( $command );
812 }
813 );
814 },
815
816 'GrantsInfo' => static function ( MediaWikiServices $services ): GrantsInfo {
817 return new GrantsInfo(
818 new ServiceOptions(
819 GrantsInfo::CONSTRUCTOR_OPTIONS,
820 $services->getMainConfig()
821 )
822 );
823 },
824
825 'GrantsLocalization' => static function ( MediaWikiServices $services ): GrantsLocalization {
827 $services->getGrantsInfo(),
828 $services->getLinkRenderer(),
829 $services->getLanguageFactory(),
830 $services->getContentLanguage()
831 );
832 },
833
834 'GroupPermissionsLookup' => static function ( MediaWikiServices $services ): GroupPermissionsLookup {
836 new ServiceOptions( GroupPermissionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
837 );
838 },
839
840 'HookContainer' => static function ( MediaWikiServices $services ): HookContainer {
841 // NOTE: This is called while $services is being initialized, in order to call the
842 // MediaWikiServices hook.
843
844 $configHooks = $services->getBootstrapConfig()->get( MainConfigNames::Hooks );
845
846 // If we are instantiating this service after $wgHooks was replaced by a fake,
847 // get the original array out of the object. This should only happen in the installer,
848 // when it calls resetMediaWikiServices().
849 if ( $configHooks instanceof FauxGlobalHookArray ) {
850 $configHooks = $configHooks->getOriginalArray();
851 }
852
853 $extRegistry = ExtensionRegistry::getInstance();
854 $extHooks = $extRegistry->getAttribute( 'Hooks' );
855 $extDeprecatedHooks = $extRegistry->getAttribute( 'DeprecatedHooks' );
856
857 $hookRegistry = new StaticHookRegistry( $configHooks, $extHooks, $extDeprecatedHooks );
858 $hookContainer = new HookContainer(
859 $hookRegistry,
860 $services->getObjectFactory()
861 );
862
863 return $hookContainer;
864 },
865
866 'HtmlCacheUpdater' => static function ( MediaWikiServices $services ): HtmlCacheUpdater {
867 $config = $services->getMainConfig();
868
869 return new HtmlCacheUpdater(
870 $services->getHookContainer(),
871 $services->getTitleFactory(),
872 $config->get( MainConfigNames::CdnReboundPurgeDelay ),
873 $config->get( MainConfigNames::UseFileCache ),
874 $config->get( MainConfigNames::CdnMaxAge )
875 );
876 },
877
878 'HtmlTransformFactory' => static function ( MediaWikiServices $services ): HtmlTransformFactory {
880 $services->getService( '_Parsoid' ),
881 $services->getMainConfig()->get( MainConfigNames::ParsoidSettings ),
882 $services->getParsoidPageConfigFactory(),
883 $services->getContentHandlerFactory(),
884 $services->getParsoidSiteConfig(),
885 $services->getTitleFactory(),
886 $services->getLanguageConverterFactory(),
887 $services->getLanguageFactory()
888 );
889 },
890
891 'HttpRequestFactory' =>
892 static function ( MediaWikiServices $services ): HttpRequestFactory {
894 new ServiceOptions(
895 HttpRequestFactory::CONSTRUCTOR_OPTIONS,
896 $services->getMainConfig()
897 ),
898 LoggerFactory::getInstance( 'http' ),
899 Telemetry::getInstance()
900 );
901 },
902
903 'InterwikiLookup' => static function ( MediaWikiServices $services ): InterwikiLookup {
905 new ServiceOptions(
906 ClassicInterwikiLookup::CONSTRUCTOR_OPTIONS,
907 $services->getMainConfig(),
908 [ 'wikiId' => WikiMap::getCurrentWikiId() ]
909 ),
910 $services->getContentLanguage(),
911 $services->getMainWANObjectCache(),
912 $services->getHookContainer(),
913 $services->getDBLoadBalancerFactory()
914 );
915 },
916
917 'IntroMessageBuilder' => static function ( MediaWikiServices $services ): IntroMessageBuilder {
919 $services->getMainConfig(),
920 $services->getLinkRenderer(),
921 $services->getPermissionManager(),
922 $services->getUserNameUtils(),
923 $services->getTempUserCreator(),
924 $services->getUserFactory(),
925 $services->getRestrictionStore(),
926 $services->getReadOnlyMode(),
927 $services->getSpecialPageFactory(),
928 $services->getRepoGroup(),
929 $services->getNamespaceInfo(),
930 $services->getSkinFactory()
931 );
932 },
933
934 'JobFactory' => static function ( MediaWikiServices $services ): JobFactory {
935 return new JobFactory(
936 $services->getObjectFactory(),
937 $services->getMainConfig()->get( MainConfigNames::JobClasses )
938 );
939 },
940
941 'JobQueueGroup' => static function ( MediaWikiServices $services ): JobQueueGroup {
942 return $services->getJobQueueGroupFactory()->makeJobQueueGroup();
943 },
944
945 'JobQueueGroupFactory' => static function ( MediaWikiServices $services ): JobQueueGroupFactory {
947 new ServiceOptions( JobQueueGroupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
948 $services->getReadOnlyMode(),
949 $services->getStatsdDataFactory(),
950 $services->getMainWANObjectCache(),
951 $services->getGlobalIdGenerator()
952 );
953 },
954
955 'JobRunner' => static function ( MediaWikiServices $services ): JobRunner {
956 return new JobRunner(
957 new ServiceOptions( JobRunner::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
958 $services->getDBLoadBalancerFactory(),
959 $services->getJobQueueGroup(),
960 $services->getReadOnlyMode(),
961 $services->getLinkCache(),
962 $services->getStatsdDataFactory(),
963 LoggerFactory::getInstance( 'runJobs' )
964 );
965 },
966
967 'JsonCodec' => static function ( MediaWikiServices $services ): JsonCodec {
968 return new JsonCodec();
969 },
970
971 'LanguageConverterFactory' => static function ( MediaWikiServices $services ): LanguageConverterFactory {
972 $usePigLatinVariant = $services->getMainConfig()->get( MainConfigNames::UsePigLatinVariant );
973 $isConversionDisabled = $services->getMainConfig()->get( MainConfigNames::DisableLangConversion );
974 $isTitleConversionDisabled = $services->getMainConfig()->get( MainConfigNames::DisableTitleConversion );
975 return new LanguageConverterFactory(
976 $services->getObjectFactory(),
977 $usePigLatinVariant,
978 $isConversionDisabled,
979 $isTitleConversionDisabled,
980 static function () use ( $services ) {
981 return $services->getContentLanguage();
982 }
983 );
984 },
985
986 'LanguageFactory' => static function ( MediaWikiServices $services ): LanguageFactory {
988 new ServiceOptions( LanguageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
989 $services->getNamespaceInfo(),
990 $services->getLocalisationCache(),
991 $services->getLanguageNameUtils(),
992 $services->getLanguageFallback(),
993 $services->getLanguageConverterFactory(),
994 $services->getHookContainer(),
995 $services->getMainConfig()
996 );
997 },
998
999 'LanguageFallback' => static function ( MediaWikiServices $services ): LanguageFallback {
1001 $services->getMainConfig()->get( MainConfigNames::LanguageCode ),
1002 $services->getLocalisationCache(),
1003 $services->getLanguageNameUtils()
1004 );
1005 },
1006
1007 'LanguageNameUtils' => static function ( MediaWikiServices $services ): LanguageNameUtils {
1009 new ServiceOptions(
1010 LanguageNameUtils::CONSTRUCTOR_OPTIONS,
1011 $services->getMainConfig()
1012 ),
1013 $services->getHookContainer()
1014 );
1015 },
1016
1017 'LinkBatchFactory' => static function ( MediaWikiServices $services ): LinkBatchFactory {
1019 $services->getLinkCache(),
1020 $services->getTitleFormatter(),
1021 $services->getContentLanguage(),
1022 $services->getGenderCache(),
1023 $services->getDBLoadBalancerFactory(),
1024 $services->getLinksMigration(),
1025 LoggerFactory::getInstance( 'LinkBatch' )
1026 );
1027 },
1028
1029 'LinkCache' => static function ( MediaWikiServices $services ): LinkCache {
1030 // Database layer may be disabled, so processing without database connection
1031 $dbLoadBalancer = $services->isServiceDisabled( 'DBLoadBalancer' )
1032 ? null
1033 : $services->getDBLoadBalancer();
1034 $linkCache = new LinkCache(
1035 $services->getTitleFormatter(),
1036 $services->getMainWANObjectCache(),
1037 $services->getNamespaceInfo(),
1038 $dbLoadBalancer
1039 );
1040 $linkCache->setLogger( LoggerFactory::getInstance( 'LinkCache' ) );
1041 return $linkCache;
1042 },
1043
1044 'LinkRenderer' => static function ( MediaWikiServices $services ): LinkRenderer {
1045 return $services->getLinkRendererFactory()->create();
1046 },
1047
1048 'LinkRendererFactory' => static function ( MediaWikiServices $services ): LinkRendererFactory {
1050 $services->getTitleFormatter(),
1051 $services->getLinkCache(),
1052 $services->getSpecialPageFactory(),
1053 $services->getHookContainer()
1054 );
1055 },
1056
1057 'LinksMigration' => static function ( MediaWikiServices $services ): LinksMigration {
1059 $services->getMainConfig(),
1060 $services->getLinkTargetLookup()
1061 );
1062 },
1063
1064 'LinkTargetLookup' => static function ( MediaWikiServices $services ): LinkTargetLookup {
1066 $services->getDBLoadBalancerFactory(),
1067 $services->getLocalServerObjectCache(),
1068 $services->getMainWANObjectCache()
1069 );
1070 },
1071
1072 'LocalisationCache' => static function ( MediaWikiServices $services ): LocalisationCache {
1073 $conf = $services->getMainConfig()->get( MainConfigNames::LocalisationCacheConf );
1074
1075 $logger = LoggerFactory::getInstance( 'localisation' );
1076
1078 $conf, $services->getMainConfig()->get( MainConfigNames::CacheDirectory ) );
1079 $logger->debug( 'LocalisationCache using store ' . get_class( $store ) );
1080
1081 return new $conf['class'](
1082 new ServiceOptions(
1083 LocalisationCache::CONSTRUCTOR_OPTIONS,
1084 // Two of the options are stored in $wgLocalisationCacheConf
1085 $conf,
1086 // In case someone set that config variable and didn't reset all keys, set defaults.
1087 [
1088 'forceRecache' => false,
1089 'manualRecache' => false,
1090 ],
1091 // Some other options come from config itself
1092 $services->getMainConfig()
1093 ),
1094 $store,
1095 $logger,
1096 [ static function () use ( $services ) {
1097 // NOTE: Make sure we use the same cache object that is assigned in the
1098 // constructor of the MessageBlobStore class used by ResourceLoader.
1099 // T231866: Avoid circular dependency via ResourceLoader.
1100 MessageBlobStore::clearGlobalCacheEntry( $services->getMainWANObjectCache() );
1101 } ],
1102 $services->getLanguageNameUtils(),
1103 $services->getHookContainer()
1104 );
1105 },
1106
1107 'LocalServerObjectCache' => static function ( MediaWikiServices $services ): BagOStuff {
1108 return ObjectCache::makeLocalServerCache();
1109 },
1110
1111 'LockManagerGroupFactory' => static function ( MediaWikiServices $services ): LockManagerGroupFactory {
1113 WikiMap::getCurrentWikiDbDomain()->getId(),
1114 $services->getMainConfig()->get( MainConfigNames::LockManagers )
1115 );
1116 },
1117
1118 'MagicWordFactory' => static function ( MediaWikiServices $services ): MagicWordFactory {
1120 $services->getContentLanguage(),
1121 $services->getHookContainer()
1122 );
1123 },
1124
1125 'MainConfig' => static function ( MediaWikiServices $services ): Config {
1126 // Use the 'main' config from the ConfigFactory service.
1127 return $services->getConfigFactory()->makeConfig( 'main' );
1128 },
1129
1130 'MainObjectStash' => static function ( MediaWikiServices $services ): BagOStuff {
1131 $mainConfig = $services->getMainConfig();
1132
1133 $id = $mainConfig->get( MainConfigNames::MainStash );
1134 $params = $mainConfig->get( MainConfigNames::ObjectCaches )[$id] ?? null;
1135 if ( !$params ) {
1136 throw new ConfigException(
1137 "\$wgObjectCaches must have \"$id\" set (via \$wgMainStash)"
1138 );
1139 }
1140
1141 $store = ObjectCache::newFromParams( $params, $services );
1142 $store->getLogger()->debug( 'MainObjectStash using store {class}', [
1143 'class' => get_class( $store )
1144 ] );
1145
1146 return $store;
1147 },
1148
1149 'MainWANObjectCache' => static function ( MediaWikiServices $services ): WANObjectCache {
1150 $mainConfig = $services->getMainConfig();
1151
1152 $store = $services->get( '_LocalClusterCache' );
1153 $logger = $store->getLogger();
1154 $logger->debug( 'MainWANObjectCache using store {class}', [
1155 'class' => get_class( $store )
1156 ] );
1157
1158 $wanParams = $mainConfig->get( MainConfigNames::WANObjectCache ) + [
1159 'cache' => $store,
1160 'logger' => $logger,
1161 'secret' => $mainConfig->get( MainConfigNames::SecretKey ),
1162 ];
1163 if ( !$GLOBALS[ 'wgCommandLineMode' ] ) {
1164 // Send the statsd data post-send on HTTP requests; avoid in CLI mode (T181385)
1165 $wanParams['stats'] = $services->getStatsdDataFactory();
1166 // Let pre-emptive refreshes happen post-send on HTTP requests
1167 $wanParams['asyncHandler'] = [ DeferredUpdates::class, 'addCallableUpdate' ];
1168 }
1169 return new WANObjectCache( $wanParams );
1170 },
1171
1172 'MediaHandlerFactory' => static function ( MediaWikiServices $services ): MediaHandlerFactory {
1174 LoggerFactory::getInstance( 'MediaHandlerFactory' ),
1175 $services->getMainConfig()->get( MainConfigNames::MediaHandlers )
1176 );
1177 },
1178
1179 'MergeHistoryFactory' => static function ( MediaWikiServices $services ): MergeHistoryFactory {
1180 return $services->getService( '_PageCommandFactory' );
1181 },
1182
1183 'MessageCache' => static function ( MediaWikiServices $services ): MessageCache {
1184 $mainConfig = $services->getMainConfig();
1185 $clusterCache = ObjectCache::getInstance( $mainConfig->get( MainConfigNames::MessageCacheType ) );
1186 $srvCache = $mainConfig->get( MainConfigNames::UseLocalMessageCache )
1187 ? $services->getLocalServerObjectCache()
1188 : new EmptyBagOStuff();
1189
1190 $logger = LoggerFactory::getInstance( 'MessageCache' );
1191 $logger->debug( 'MessageCache using store {class}', [
1192 'class' => get_class( $clusterCache )
1193 ] );
1194
1195 $options = new ServiceOptions( MessageCache::CONSTRUCTOR_OPTIONS, $mainConfig );
1196
1197 return new MessageCache(
1198 $services->getMainWANObjectCache(),
1199 $clusterCache,
1200 $srvCache,
1201 $services->getContentLanguage(),
1202 $services->getLanguageConverterFactory(),
1203 $logger,
1204 $options,
1205 $services->getLanguageFactory(),
1206 $services->getLocalisationCache(),
1207 $services->getLanguageNameUtils(),
1208 $services->getLanguageFallback(),
1209 $services->getHookContainer(),
1210 $services->getParserFactory()
1211 );
1212 },
1213
1214 'MessageFormatterFactory' => static function ( MediaWikiServices $services ): IMessageFormatterFactory {
1216 },
1217
1218 'MimeAnalyzer' => static function ( MediaWikiServices $services ): MimeAnalyzer {
1219 $logger = LoggerFactory::getInstance( 'Mime' );
1220 $mainConfig = $services->getMainConfig();
1221 $hookRunner = new HookRunner( $services->getHookContainer() );
1222 $params = [
1223 'typeFile' => $mainConfig->get( MainConfigNames::MimeTypeFile ),
1224 'infoFile' => $mainConfig->get( MainConfigNames::MimeInfoFile ),
1225 'xmlTypes' => $mainConfig->get( MainConfigNames::XMLMimeTypes ),
1226 'guessCallback' =>
1227 static function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime )
1228 use ( $logger, $hookRunner ) {
1229 // Also test DjVu
1230 $deja = new DjVuImage( $file );
1231 if ( $deja->isValid() ) {
1232 $logger->info( "Detected $file as image/vnd.djvu\n" );
1233 $mime = 'image/vnd.djvu';
1234
1235 return;
1236 }
1237 // Some strings by reference for performance - assuming well-behaved hooks
1238 $hookRunner->onMimeMagicGuessFromContent(
1239 $mimeAnalyzer, $head, $tail, $file, $mime );
1240 },
1241 'extCallback' => static function ( $mimeAnalyzer, $ext, &$mime ) use ( $hookRunner ) {
1242 // Media handling extensions can improve the MIME detected
1243 $hookRunner->onMimeMagicImproveFromExtension( $mimeAnalyzer, $ext, $mime );
1244 },
1245 'initCallback' => static function ( $mimeAnalyzer ) use ( $hookRunner ) {
1246 // Allow media handling extensions adding MIME-types and MIME-info
1247 $hookRunner->onMimeMagicInit( $mimeAnalyzer );
1248 },
1249 'logger' => $logger
1250 ];
1251
1252 if ( $params['infoFile'] === 'includes/mime.info' ) {
1253 $params['infoFile'] = MimeAnalyzer::USE_INTERNAL;
1254 }
1255
1256 if ( $params['typeFile'] === 'includes/mime.types' ) {
1257 $params['typeFile'] = MimeAnalyzer::USE_INTERNAL;
1258 }
1259
1260 $detectorCmd = $mainConfig->get( MainConfigNames::MimeDetectorCommand );
1261 if ( $detectorCmd ) {
1262 $factory = $services->getShellCommandFactory();
1263 $params['detectCallback'] = static function ( $file ) use ( $detectorCmd, $factory ) {
1264 $result = $factory->create()
1265 // $wgMimeDetectorCommand can contain commands with parameters
1266 ->unsafeParams( $detectorCmd )
1267 ->params( $file )
1268 ->execute();
1269 return $result->getStdout();
1270 };
1271 }
1272
1273 return new MimeAnalyzer( $params );
1274 },
1275
1276 'MovePageFactory' => static function ( MediaWikiServices $services ): MovePageFactory {
1277 return $services->getService( '_PageCommandFactory' );
1278 },
1279
1280 'NamespaceInfo' => static function ( MediaWikiServices $services ): NamespaceInfo {
1282 new ServiceOptions( NamespaceInfo::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1283 $services->getHookContainer(),
1284 ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' ),
1285 ExtensionRegistry::getInstance()->getAttribute( 'ImmovableNamespaces' )
1286 );
1287 },
1288
1289 'NameTableStoreFactory' => static function ( MediaWikiServices $services ): NameTableStoreFactory {
1291 $services->getDBLoadBalancerFactory(),
1292 $services->getMainWANObjectCache(),
1293 LoggerFactory::getInstance( 'NameTableSqlStore' )
1294 );
1295 },
1296
1297 'ObjectFactory' => static function ( MediaWikiServices $services ): ObjectFactory {
1298 return new ObjectFactory( $services );
1299 },
1300
1301 'OldRevisionImporter' => static function ( MediaWikiServices $services ): OldRevisionImporter {
1303 true,
1304 LoggerFactory::getInstance( 'OldRevisionImporter' ),
1305 $services->getDBLoadBalancerFactory(),
1306 $services->getRevisionStore(),
1307 $services->getSlotRoleRegistry(),
1308 $services->getWikiPageFactory(),
1309 $services->getPageUpdaterFactory(),
1310 $services->getUserFactory()
1311 );
1312 },
1313
1314 'PageEditStash' => static function ( MediaWikiServices $services ): PageEditStash {
1316 ObjectCache::getLocalClusterInstance(),
1317 $services->getDBLoadBalancerFactory(),
1318 LoggerFactory::getInstance( 'StashEdit' ),
1319 $services->getStatsdDataFactory(),
1320 $services->getUserEditTracker(),
1321 $services->getUserFactory(),
1322 $services->getWikiPageFactory(),
1323 $services->getHookContainer(),
1324 defined( 'MEDIAWIKI_JOB_RUNNER' ) || $GLOBALS[ 'wgCommandLineMode' ]
1325 ? PageEditStash::INITIATOR_JOB_OR_CLI
1326 : PageEditStash::INITIATOR_USER
1327 );
1328 },
1329
1330 'PageProps' => static function ( MediaWikiServices $services ): PageProps {
1331 return new PageProps(
1332 $services->getLinkBatchFactory(),
1333 $services->getDBLoadBalancerFactory()
1334 );
1335 },
1336
1337 'PageRestHelperFactory' => static function ( MediaWikiServices $services ): PageRestHelperFactory {
1339 new ServiceOptions( PageRestHelperFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1340 $services->getRevisionLookup(),
1341 $services->getTitleFormatter(),
1342 $services->getPageStore(),
1343 $services->getParsoidOutputStash(),
1344 $services->getStatsdDataFactory(),
1345 $services->getParsoidOutputAccess(),
1346 $services->getHtmlTransformFactory(),
1347 $services->getContentHandlerFactory(),
1348 $services->getLanguageFactory(),
1349 $services->getRedirectStore(),
1350 $services->getLanguageConverterFactory()
1351 );
1352 },
1353
1354 'PageStore' => static function ( MediaWikiServices $services ): PageStore {
1355 return $services->getPageStoreFactory()->getPageStore();
1356 },
1357
1358 'PageStoreFactory' => static function ( MediaWikiServices $services ): PageStoreFactory {
1359 $options = new ServiceOptions(
1360 PageStoreFactory::CONSTRUCTOR_OPTIONS,
1361 $services->getMainConfig()
1362 );
1363
1364 return new PageStoreFactory(
1365 $options,
1366 $services->getDBLoadBalancerFactory(),
1367 $services->getNamespaceInfo(),
1368 $services->getTitleParser(),
1369 $services->getLinkCache(),
1370 $services->getStatsdDataFactory()
1371 );
1372 },
1373
1374 'PageUpdaterFactory' => static function (
1375 MediaWikiServices $services
1377 $editResultCache = new EditResultCache(
1378 $services->getMainObjectStash(),
1379 $services->getDBLoadBalancerFactory(),
1380 new ServiceOptions(
1381 EditResultCache::CONSTRUCTOR_OPTIONS,
1382 $services->getMainConfig()
1383 )
1384 );
1385
1386 return new PageUpdaterFactory(
1387 $services->getRevisionStore(),
1388 $services->getRevisionRenderer(),
1389 $services->getSlotRoleRegistry(),
1390 $services->getParserCache(),
1391 $services->getJobQueueGroup(),
1392 $services->getMessageCache(),
1393 $services->getContentLanguage(),
1394 $services->getDBLoadBalancerFactory(),
1395 $services->getContentHandlerFactory(),
1396 $services->getHookContainer(),
1397 $editResultCache,
1398 $services->getUserNameUtils(),
1399 LoggerFactory::getInstance( 'SavePage' ),
1400 new ServiceOptions(
1401 PageUpdaterFactory::CONSTRUCTOR_OPTIONS,
1402 $services->getMainConfig()
1403 ),
1404 $services->getUserEditTracker(),
1405 $services->getUserGroupManager(),
1406 $services->getTitleFormatter(),
1407 $services->getContentTransformer(),
1408 $services->getPageEditStash(),
1409 $services->getTalkPageNotificationManager(),
1410 $services->getMainWANObjectCache(),
1411 $services->getPermissionManager(),
1412 $services->getWikiPageFactory(),
1413 $services->getChangeTagsStore()->getSoftwareTags()
1414 );
1415 },
1416
1417 'Parser' => static function ( MediaWikiServices $services ): Parser {
1418 return $services->getParserFactory()->getMainInstance();
1419 },
1420
1421 'ParserCache' => static function ( MediaWikiServices $services ): ParserCache {
1422 return $services->getParserCacheFactory()
1423 ->getParserCache( ParserCacheFactory::DEFAULT_NAME );
1424 },
1425
1426 'ParserCacheFactory' => static function ( MediaWikiServices $services ): ParserCacheFactory {
1427 $config = $services->getMainConfig();
1428 $cache = ObjectCache::getInstance( $config->get( MainConfigNames::ParserCacheType ) );
1429 $wanCache = $services->getMainWANObjectCache();
1430
1431 $options = new ServiceOptions( ParserCacheFactory::CONSTRUCTOR_OPTIONS, $config );
1432
1433 return new ParserCacheFactory(
1434 $cache,
1435 $wanCache,
1436 $services->getHookContainer(),
1437 $services->getJsonCodec(),
1438 $services->getStatsdDataFactory(),
1439 LoggerFactory::getInstance( 'ParserCache' ),
1440 $options,
1441 $services->getTitleFactory(),
1442 $services->getWikiPageFactory()
1443 );
1444 },
1445
1446 'ParserFactory' => static function ( MediaWikiServices $services ): ParserFactory {
1447 $options = new ServiceOptions( Parser::CONSTRUCTOR_OPTIONS,
1448 $services->getMainConfig()
1449 );
1450
1451 return new ParserFactory(
1452 $options,
1453 $services->getMagicWordFactory(),
1454 $services->getContentLanguage(),
1455 $services->getUrlUtils(),
1456 $services->getSpecialPageFactory(),
1457 $services->getLinkRendererFactory(),
1458 $services->getNamespaceInfo(),
1459 LoggerFactory::getInstance( 'Parser' ),
1460 $services->getBadFileLookup(),
1461 $services->getLanguageConverterFactory(),
1462 $services->getHookContainer(),
1463 $services->getTidy(),
1464 $services->getMainWANObjectCache(),
1465 $services->getUserOptionsLookup(),
1466 $services->getUserFactory(),
1467 $services->getTitleFormatter(),
1468 $services->getHttpRequestFactory(),
1469 $services->getTrackingCategories(),
1470 $services->getSignatureValidatorFactory(),
1471 $services->getUserNameUtils()
1472 );
1473 },
1474
1475 'ParserOutputAccess' => static function ( MediaWikiServices $services ): ParserOutputAccess {
1477 $services->getParserCacheFactory(),
1478 $services->getRevisionLookup(),
1479 $services->getRevisionRenderer(),
1480 $services->getStatsdDataFactory(),
1481 $services->getDBLoadBalancerFactory(),
1482 $services->getChronologyProtector(),
1483 LoggerFactory::getProvider(),
1484 $services->getWikiPageFactory(),
1485 $services->getTitleFormatter()
1486 );
1487 },
1488
1489 'ParsoidDataAccess' => static function ( MediaWikiServices $services ): DataAccess {
1490 $mainConfig = $services->getMainConfig();
1491 return new MWDataAccess(
1493 $services->getRepoGroup(),
1494 $services->getBadFileLookup(),
1495 $services->getHookContainer(),
1496 $services->getContentTransformer(),
1497 $services->getReadOnlyMode(),
1498 $services->getParserFactory(), // *legacy* parser factory
1499 $services->getLinkBatchFactory()
1500 );
1501 },
1502
1503 'ParsoidOutputAccess' => static function ( MediaWikiServices $services ): ParsoidOutputAccess {
1505 new ServiceOptions(
1506 ParsoidOutputAccess::CONSTRUCTOR_OPTIONS,
1507 $services->getMainConfig(),
1508 [ 'ParsoidWikiID' => WikiMap::getCurrentWikiId() ]
1509 ),
1510 $services->getParsoidParserFactory(),
1511 $services->getParserOutputAccess(),
1512 $services->getPageStore(),
1513 $services->getRevisionLookup(),
1514 $services->getParsoidSiteConfig(),
1515 $services->getContentHandlerFactory()
1516 );
1517 },
1518
1519 'ParsoidOutputStash' => static function ( MediaWikiServices $services ): ParsoidOutputStash {
1520 // TODO: Determine storage requirements and config options for stashing parsoid
1521 // output for VE edits (T309016).
1522 $config = $services->getMainConfig()->get( MainConfigNames::ParsoidCacheConfig );
1523 $backend = $config['StashType']
1524 ? ObjectCache::getInstance( $config['StashType'] )
1525 : $services->getMainObjectStash();
1526
1527 return new SimpleParsoidOutputStash(
1528 $services->getContentHandlerFactory(),
1529 $backend,
1530 $config['StashDuration']
1531 );
1532 },
1533
1534 'ParsoidPageConfigFactory' => static function ( MediaWikiServices $services ): MWPageConfigFactory {
1535 return new MWPageConfigFactory(
1536 $services->getRevisionStore(),
1537 $services->getSlotRoleRegistry(),
1538 $services->getLanguageFactory()
1539 );
1540 },
1541
1542 'ParsoidParserFactory' => static function ( MediaWikiServices $services ): ParsoidParserFactory {
1544 $services->getParsoidSiteConfig(),
1545 $services->getParsoidDataAccess(),
1546 $services->getParsoidPageConfigFactory(),
1547 $services->getLanguageConverterFactory(),
1548 $services->getParserFactory(),
1549 $services->getGlobalIdGenerator()
1550 );
1551 },
1552
1553 'ParsoidSiteConfig' => static function ( MediaWikiServices $services ): SiteConfig {
1554 $mainConfig = $services->getMainConfig();
1555 $parsoidSettings = $mainConfig->get( MainConfigNames::ParsoidSettings );
1556 return new MWSiteConfig(
1558 $parsoidSettings,
1559 $services->getObjectFactory(),
1560 $services->getContentLanguage(),
1561 $services->getStatsdDataFactory(),
1562 $services->getMagicWordFactory(),
1563 $services->getNamespaceInfo(),
1564 $services->getSpecialPageFactory(),
1565 $services->getInterwikiLookup(),
1566 $services->getUserOptionsLookup(),
1567 $services->getLanguageFactory(),
1568 $services->getLanguageConverterFactory(),
1569 $services->getLanguageNameUtils(),
1570 $services->getUrlUtils(),
1571 ExtensionRegistry::getInstance()->getAttribute( 'ParsoidModules' ),
1572 // These arguments are temporary and will be removed once
1573 // better solutions are found.
1574 $services->getParserFactory(), // T268776
1575 $mainConfig, // T268777
1576 ExtensionRegistry::getInstance()->isLoaded( 'TimedMediaHandler' )
1577 );
1578 },
1579
1580 'PasswordFactory' => static function ( MediaWikiServices $services ): PasswordFactory {
1581 $config = $services->getMainConfig();
1582 return new PasswordFactory(
1583 $config->get( MainConfigNames::PasswordConfig ),
1584 $config->get( MainConfigNames::PasswordDefault )
1585 );
1586 },
1587
1588 'PasswordReset' => static function ( MediaWikiServices $services ): PasswordReset {
1589 $options = new ServiceOptions( PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig() );
1590 return new PasswordReset(
1591 $options,
1592 LoggerFactory::getInstance( 'authentication' ),
1593 $services->getAuthManager(),
1594 $services->getHookContainer(),
1595 $services->getDBLoadBalancerFactory(),
1596 $services->getUserFactory(),
1597 $services->getUserNameUtils(),
1598 $services->getUserOptionsLookup()
1599 );
1600 },
1601
1602 'PerDbNameStatsdDataFactory' =>
1603 static function ( MediaWikiServices $services ): StatsdDataFactoryInterface {
1604 $config = $services->getMainConfig();
1605 $wiki = $config->get( MainConfigNames::DBname );
1607 $services->getStatsdDataFactory(),
1608 $wiki
1609 );
1610 },
1611
1612 'PermissionManager' => static function ( MediaWikiServices $services ): PermissionManager {
1614 new ServiceOptions(
1615 PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
1616 ),
1617 $services->getSpecialPageFactory(),
1618 $services->getNamespaceInfo(),
1619 $services->getGroupPermissionsLookup(),
1620 $services->getUserGroupManager(),
1621 $services->getBlockErrorFormatter(),
1622 $services->getHookContainer(),
1623 $services->getUserCache(),
1624 $services->getRedirectLookup(),
1625 $services->getRestrictionStore(),
1626 $services->getTitleFormatter(),
1627 $services->getTempUserConfig(),
1628 $services->getUserFactory(),
1629 $services->getActionFactory()
1630 );
1631 },
1632
1633 'Pingback' => static function ( MediaWikiServices $services ): PingBack {
1634 return new Pingback(
1635 $services->getMainConfig(),
1636 $services->getDBLoadBalancerFactory(),
1637 ObjectCache::getLocalClusterInstance(),
1638 $services->getHttpRequestFactory(),
1639 LoggerFactory::getInstance( 'Pingback' )
1640 );
1641 },
1642
1643 'PoolCounterFactory' => static function ( MediaWikiServices $services ): PoolCounterFactory {
1644 $mainConfig = $services->getMainConfig();
1645 return new PoolCounterFactory(
1646 $mainConfig->get( MainConfigNames::PoolCounterConf ),
1647 $mainConfig->get( MainConfigNames::PoolCountClientConf )
1648 );
1649 },
1650
1651 'PreferencesFactory' => static function ( MediaWikiServices $services ): PreferencesFactory {
1652 $factory = new DefaultPreferencesFactory(
1653 new ServiceOptions(
1654 DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1655 $services->getContentLanguage(),
1656 $services->getAuthManager(),
1657 $services->getLinkRendererFactory()->create(),
1658 $services->getNamespaceInfo(),
1659 $services->getPermissionManager(),
1660 $services->getLanguageConverterFactory()->getLanguageConverter(),
1661 $services->getLanguageNameUtils(),
1662 $services->getHookContainer(),
1663 $services->getUserOptionsManager(),
1664 $services->getLanguageConverterFactory(),
1665 $services->getParserFactory(),
1666 $services->getSkinFactory(),
1667 $services->getUserGroupManager(),
1668 $services->getSignatureValidatorFactory(),
1669 $services->getMainConfig()
1670 );
1671 $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
1672
1673 return $factory;
1674 },
1675
1676 'PreloadedContentBuilder' => static function ( MediaWikiServices $services ): PreloadedContentBuilder {
1678 $services->getContentHandlerFactory(),
1679 $services->getWikiPageFactory(),
1680 $services->getRedirectLookup(),
1681 $services->getSpecialPageFactory(),
1682 $services->getContentTransformer(),
1683 $services->getHookContainer(),
1684 );
1685 },
1686
1687 'ProxyLookup' => static function ( MediaWikiServices $services ): ProxyLookup {
1688 $mainConfig = $services->getMainConfig();
1689 return new ProxyLookup(
1690 $mainConfig->get( MainConfigNames::CdnServers ),
1691 $mainConfig->get( MainConfigNames::CdnServersNoPurge ),
1692 $services->getHookContainer()
1693 );
1694 },
1695
1696 'RateLimiter' => static function ( MediaWikiServices $services ): RateLimiter {
1697 $rateLimiter = new RateLimiter(
1698 new ServiceOptions( RateLimiter::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1699 $services->getWRStatsFactory(),
1700 $services->getCentralIdLookupFactory()->getNonLocalLookup(),
1701 $services->getUserFactory(),
1702 $services->getUserGroupManager(),
1703 $services->getHookContainer()
1704 );
1705
1706 $rateLimiter->setStats( $services->getStatsdDataFactory() );
1707
1708 return $rateLimiter;
1709 },
1710
1711 'ReadOnlyMode' => static function ( MediaWikiServices $services ): ReadOnlyMode {
1712 return new ReadOnlyMode(
1714 $services->getMainConfig()->get( MainConfigNames::ReadOnly ),
1715 $services->getMainConfig()->get( MainConfigNames::ReadOnlyFile )
1716 ),
1717 $services->getDBLoadBalancerFactory()
1718 );
1719 },
1720
1721 'RedirectLookup' => static function ( MediaWikiServices $services ): RedirectLookup {
1722 return $services->getRedirectStore();
1723 },
1724
1725 'RedirectStore' => static function ( MediaWikiServices $services ): RedirectStore {
1726 return new RedirectStore( $services->getWikiPageFactory() );
1727 },
1728
1729 'RepoGroup' => static function ( MediaWikiServices $services ): RepoGroup {
1730 $config = $services->getMainConfig();
1731 return new RepoGroup(
1732 $config->get( MainConfigNames::LocalFileRepo ),
1733 $config->get( MainConfigNames::ForeignFileRepos ),
1734 $services->getMainWANObjectCache(),
1735 $services->getMimeAnalyzer()
1736 );
1737 },
1738
1739 'ResourceLoader' => static function ( MediaWikiServices $services ): ResourceLoader {
1740 $config = $services->getMainConfig();
1741
1742 $maxage = $config->get( MainConfigNames::ResourceLoaderMaxage );
1743 $rl = new ResourceLoader(
1744 $config,
1745 LoggerFactory::getInstance( 'resourceloader' ),
1746 $config->get( MainConfigNames::ResourceLoaderUseObjectCacheForDeps )
1747 ? new KeyValueDependencyStore( $services->getMainObjectStash() )
1748 : new SqlModuleDependencyStore( $services->getDBLoadBalancer() ),
1749 [
1750 'loadScript' => $config->get( MainConfigNames::LoadScript ),
1751 'maxageVersioned' => $maxage['versioned'] ?? null,
1752 'maxageUnversioned' => $maxage['unversioned'] ?? null,
1753 ]
1754 );
1755
1756 $extRegistry = ExtensionRegistry::getInstance();
1757 // Attribute has precedence over config
1758 $modules = $extRegistry->getAttribute( 'ResourceModules' )
1759 + $config->get( MainConfigNames::ResourceModules );
1760 $moduleSkinStyles = $extRegistry->getAttribute( 'ResourceModuleSkinStyles' )
1761 + $config->get( MainConfigNames::ResourceModuleSkinStyles );
1762
1763 $rl->setModuleSkinStyles( $moduleSkinStyles );
1764 $rl->addSource( $config->get( MainConfigNames::ResourceLoaderSources ) );
1765
1766 // Core modules, then extension/skin modules
1767 $rl->register( include MW_INSTALL_PATH . '/resources/Resources.php' );
1768 $rl->register( $modules );
1769 $hookRunner = new \MediaWiki\ResourceLoader\HookRunner( $services->getHookContainer() );
1770 $hookRunner->onResourceLoaderRegisterModules( $rl );
1771
1772 $msgPosterAttrib = $extRegistry->getAttribute( 'MessagePosterModule' );
1773 $rl->register( 'mediawiki.messagePoster', [
1774 'localBasePath' => MW_INSTALL_PATH,
1775 'debugRaw' => false,
1776 'scripts' => array_merge(
1777 [
1778 "resources/src/mediawiki.messagePoster/factory.js",
1779 "resources/src/mediawiki.messagePoster/MessagePoster.js",
1780 "resources/src/mediawiki.messagePoster/WikitextMessagePoster.js",
1781 ],
1782 $msgPosterAttrib['scripts'] ?? []
1783 ),
1784 'dependencies' => array_merge(
1785 [
1786 'oojs',
1787 'mediawiki.api',
1788 'mediawiki.ForeignApi',
1789 ],
1790 $msgPosterAttrib['dependencies'] ?? []
1791 ),
1792 'targets' => [ 'desktop', 'mobile' ],
1793 ] );
1794
1795 if ( $config->get( MainConfigNames::EnableJavaScriptTest ) === true ) {
1796 $rl->registerTestModules();
1797 }
1798
1799 return $rl;
1800 },
1801
1802 'RestrictionStore' => static function ( MediaWikiServices $services ): RestrictionStore {
1804 new ServiceOptions(
1805 RestrictionStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
1806 ),
1807 $services->getMainWANObjectCache(),
1808 $services->getDBLoadBalancer(),
1809 $services->getLinkCache(),
1810 $services->getLinksMigration(),
1811 $services->getCommentStore(),
1812 $services->getHookContainer(),
1813 $services->getPageStore()
1814 );
1815 },
1816
1817 'RevertedTagUpdateManager' => static function ( MediaWikiServices $services ): RevertedTagUpdateManager {
1818 $editResultCache = new EditResultCache(
1819 $services->getMainObjectStash(),
1820 $services->getDBLoadBalancerFactory(),
1821 new ServiceOptions(
1822 EditResultCache::CONSTRUCTOR_OPTIONS,
1823 $services->getMainConfig()
1824 )
1825 );
1826
1827 return new RevertedTagUpdateManager(
1828 $editResultCache,
1829 $services->getJobQueueGroup()
1830 );
1831 },
1832
1833 'RevisionFactory' => static function ( MediaWikiServices $services ): RevisionFactory {
1834 return $services->getRevisionStore();
1835 },
1836
1837 'RevisionLookup' => static function ( MediaWikiServices $services ): RevisionLookup {
1838 return $services->getRevisionStore();
1839 },
1840
1841 'RevisionRenderer' => static function ( MediaWikiServices $services ): RevisionRenderer {
1842 $renderer = new RevisionRenderer(
1843 $services->getDBLoadBalancer(),
1844 $services->getSlotRoleRegistry(),
1845 $services->getContentRenderer()
1846 );
1847
1848 $renderer->setLogger( LoggerFactory::getInstance( 'SaveParse' ) );
1849 return $renderer;
1850 },
1851
1852 'RevisionStore' => static function ( MediaWikiServices $services ): RevisionStore {
1853 return $services->getRevisionStoreFactory()->getRevisionStore();
1854 },
1855
1856 'RevisionStoreFactory' => static function ( MediaWikiServices $services ): RevisionStoreFactory {
1858 $services->getDBLoadBalancerFactory(),
1859 $services->getBlobStoreFactory(),
1860 $services->getNameTableStoreFactory(),
1861 $services->getSlotRoleRegistry(),
1862 $services->getMainWANObjectCache(),
1863 $services->getLocalServerObjectCache(),
1864 $services->getCommentStore(),
1865 $services->getActorMigration(),
1866 $services->getActorStoreFactory(),
1867 LoggerFactory::getInstance( 'RevisionStore' ),
1868 $services->getContentHandlerFactory(),
1869 $services->getPageStoreFactory(),
1870 $services->getTitleFactory(),
1871 $services->getHookContainer()
1872 );
1873 },
1874
1875 'RollbackPageFactory' => static function ( MediaWikiServices $services ): RollbackPageFactory {
1876 return $services->get( '_PageCommandFactory' );
1877 },
1878
1879 'RowCommentFormatter' => static function ( MediaWikiServices $services ): RowCommentFormatter {
1881 $services->getCommentParserFactory(),
1882 $services->getCommentStore()
1883 );
1884 },
1885
1886 'SearchEngineConfig' => static function ( MediaWikiServices $services ): SearchEngineConfig {
1887 // @todo This should not take a Config object, but it's not so easy to remove because it
1888 // exposes it in a getter, which is actually used.
1890 $services->getMainConfig(),
1891 $services->getContentLanguage(),
1892 $services->getHookContainer(),
1893 ExtensionRegistry::getInstance()->getAttribute( 'SearchMappings' ),
1894 $services->getUserOptionsLookup()
1895 );
1896 },
1897
1898 'SearchEngineFactory' => static function ( MediaWikiServices $services ): SearchEngineFactory {
1900 $services->getSearchEngineConfig(),
1901 $services->getHookContainer(),
1902 $services->getDBLoadBalancerFactory()
1903 );
1904 },
1905
1906 'SearchResultThumbnailProvider' => static function ( MediaWikiServices $services ): SearchResultThumbnailProvider {
1908 $services->getRepoGroup(),
1909 $services->getHookContainer()
1910 );
1911 },
1912
1913 'ShellboxClientFactory' => static function ( MediaWikiServices $services ): ShellboxClientFactory {
1914 $urls = $services->getMainConfig()->get( MainConfigNames::ShellboxUrls );
1915
1916 return new ShellboxClientFactory(
1917 $services->getHttpRequestFactory(),
1918 $urls,
1919 $services->getMainConfig()->get( MainConfigNames::ShellboxSecretKey )
1920 );
1921 },
1922
1923 'ShellCommandFactory' => static function ( MediaWikiServices $services ): CommandFactory {
1924 $config = $services->getMainConfig();
1925
1926 $limits = [
1927 'time' => $config->get( MainConfigNames::MaxShellTime ),
1928 'walltime' => $config->get( MainConfigNames::MaxShellWallClockTime ),
1929 'memory' => $config->get( MainConfigNames::MaxShellMemory ),
1930 'filesize' => $config->get( MainConfigNames::MaxShellFileSize ),
1931 ];
1932 $cgroup = $config->get( MainConfigNames::ShellCgroup );
1933 $restrictionMethod = $config->get( MainConfigNames::ShellRestrictionMethod );
1934
1935 $factory = new CommandFactory( $services->getShellboxClientFactory(),
1936 $limits, $cgroup, $restrictionMethod );
1937 $factory->setLogger( LoggerFactory::getInstance( 'exec' ) );
1938 $factory->logStderr();
1939
1940 return $factory;
1941 },
1942
1943 'SignatureValidatorFactory' => static function ( MediaWikiServices $services ): SignatureValidatorFactory {
1945 new ServiceOptions(
1946 SignatureValidator::CONSTRUCTOR_OPTIONS,
1947 $services->getMainConfig()
1948 ),
1949 // Use closures for these to avoid a circular dependency on Parser
1950 static function () use ( $services ) {
1951 return $services->getParserFactory();
1952 },
1953 static function () use ( $services ) {
1954 return $services->get( '_Parsoid' );
1955 },
1956 $services->getParsoidPageConfigFactory(),
1957 $services->getSpecialPageFactory(),
1958 $services->getTitleFactory()
1959 );
1960 },
1961
1962 'SiteLookup' => static function ( MediaWikiServices $services ): SiteLookup {
1963 // Use SiteStore as the SiteLookup as well. This was originally separated
1964 // to allow for a cacheable read-only interface, but this was never used.
1965 // SiteStore has caching (see below).
1966 return $services->getSiteStore();
1967 },
1968
1969 'SiteStore' => static function ( MediaWikiServices $services ): SiteStore {
1970 $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancerFactory() );
1971
1972 $cache = $services->getLocalServerObjectCache();
1973 if ( $cache instanceof EmptyBagOStuff ) {
1975 }
1976
1977 return new CachingSiteStore( $rawSiteStore, $cache );
1978 },
1979
1981 'SkinFactory' => static function ( MediaWikiServices $services ): SkinFactory {
1982 $factory = new SkinFactory(
1983 $services->getObjectFactory(),
1984 (array)$services->getMainConfig()->get( MainConfigNames::SkipSkins )
1985 );
1986
1987 $names = $services->getMainConfig()->get( MainConfigNames::ValidSkinNames );
1988
1989 foreach ( $names as $name => $skin ) {
1990 if ( is_array( $skin ) ) {
1991 $spec = $skin;
1992 $displayName = $skin['displayname'] ?? $name;
1993 $skippable = $skin['skippable'] ?? null;
1994 } else {
1995 $displayName = $skin;
1996 $skippable = null;
1997 $spec = [
1998 'name' => $name,
1999 'class' => "Skin$skin"
2000 ];
2001 }
2002 $factory->register( $name, $displayName, $spec, $skippable );
2003 }
2004
2005 // Register a hidden "fallback" skin
2006 $factory->register( 'fallback', 'Fallback', [
2007 'class' => SkinFallback::class,
2008 'args' => [
2009 [
2010 'name' => 'fallback',
2011 'styles' => [ 'mediawiki.skinning.interface' ],
2012 'templateDirectory' => __DIR__ . '/skins/templates/fallback',
2013 ]
2014 ]
2015 ], true );
2016 // Register a hidden skin for api output
2017 $factory->register( 'apioutput', 'ApiOutput', [
2018 'class' => SkinApi::class,
2019 'args' => [
2020 [
2021 'name' => 'apioutput',
2022 'styles' => [ 'mediawiki.skinning.interface' ],
2023 'templateDirectory' => __DIR__ . '/skins/templates/apioutput',
2024 ]
2025 ]
2026 ], true );
2027
2028 return $factory;
2029 },
2030
2031 'SlotRoleRegistry' => static function ( MediaWikiServices $services ): SlotRoleRegistry {
2032 $registry = new SlotRoleRegistry(
2033 $services->getSlotRoleStore()
2034 );
2035
2036 $config = $services->getMainConfig();
2037 $contentHandlerFactory = $services->getContentHandlerFactory();
2038 $hookContainer = $services->getHookContainer();
2039 $titleFactory = $services->getTitleFactory();
2040 $registry->defineRole(
2041 SlotRecord::MAIN,
2042 static function () use ( $config, $contentHandlerFactory, $hookContainer, $titleFactory ) {
2043 return new MainSlotRoleHandler(
2044 $config->get( MainConfigNames::NamespaceContentModels ),
2045 $contentHandlerFactory,
2046 $hookContainer,
2047 $titleFactory
2048 );
2049 }
2050 );
2051
2052 return $registry;
2053 },
2054
2055 'SlotRoleStore' => static function ( MediaWikiServices $services ): NameTableStore {
2056 return $services->getNameTableStoreFactory()->getSlotRoles();
2057 },
2058
2059 'SpamChecker' => static function ( MediaWikiServices $services ): SpamChecker {
2060 return new SpamChecker(
2061 (array)$services->getMainConfig()->get( MainConfigNames::SpamRegex ),
2062 (array)$services->getMainConfig()->get( MainConfigNames::SummarySpamRegex )
2063 );
2064 },
2065
2066 'SpecialPageFactory' => static function ( MediaWikiServices $services ): SpecialPageFactory {
2068 new ServiceOptions(
2069 SpecialPageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2070 $services->getContentLanguage(),
2071 $services->getObjectFactory(),
2072 $services->getTitleFactory(),
2073 $services->getHookContainer()
2074 );
2075 },
2076
2077 'StatsdDataFactory' => static function ( MediaWikiServices $services ): IBufferingStatsdDataFactory {
2079 rtrim( $services->getMainConfig()->get( MainConfigNames::StatsdMetricPrefix ), '.' )
2080 );
2081 },
2082
2083 'StatsFactory' => static function ( MediaWikiServices $services ): StatsFactory {
2084 $config = $services->getMainConfig();
2085 $format = \Wikimedia\Stats\OutputFormats::getFormatFromString(
2086 $config->get( MainConfigNames::StatsFormat ) ?? 'null'
2087 );
2088 $cache = new StatsCache;
2089 $emitter = \Wikimedia\Stats\OutputFormats::getNewEmitter(
2090 $config->get( MainConfigNames::StatsPrefix ) ?? 'MediaWiki',
2091 $cache,
2092 \Wikimedia\Stats\OutputFormats::getNewFormatter( $format ),
2093 $config->get( MainConfigNames::StatsTarget )
2094 );
2095 $factory = new StatsFactory( $cache, $emitter, LoggerFactory::getInstance( 'Stats' ) );
2096 return $factory->withStatsdDataFactory( $services->getStatsdDataFactory() );
2097 },
2098
2099 'TalkPageNotificationManager' => static function (
2100 MediaWikiServices $services
2103 new ServiceOptions(
2104 TalkPageNotificationManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2105 ),
2106 $services->getDBLoadBalancerFactory(),
2107 $services->getReadOnlyMode(),
2108 $services->getRevisionLookup(),
2109 $services->getHookContainer(),
2110 $services->getUserFactory()
2111 );
2112 },
2113
2114 'TempFSFileFactory' => static function ( MediaWikiServices $services ): TempFSFileFactory {
2115 return new TempFSFileFactory( $services->getMainConfig()->get( MainConfigNames::TmpDirectory ) );
2116 },
2117
2118 'TempUserConfig' => static function ( MediaWikiServices $services ): RealTempUserConfig {
2120 $services->getMainConfig()->get( MainConfigNames::AutoCreateTempUser )
2121 );
2122 },
2123
2124 'TempUserCreator' => static function ( MediaWikiServices $services ): TempUserCreator {
2125 $accountCreationThrottle = $services->getMainConfig()->get( MainConfigNames::AccountCreationThrottle );
2126 // T306878: Handle old $wgAccountCreationThrottle format (number of attempts per 24 hours)
2127 if ( !is_array( $accountCreationThrottle ) ) {
2128 $accountCreationThrottle = [ [
2129 'count' => $accountCreationThrottle,
2130 'seconds' => 86400,
2131 ] ];
2132 }
2133
2134 return new TempUserCreator(
2135 $services->getTempUserConfig(),
2136 $services->getObjectFactory(),
2137 $services->getUserFactory(),
2138 $services->getAuthManager(),
2139 // This is supposed to match ThrottlePreAuthenticationProvider
2140 new Throttler(
2141 $accountCreationThrottle,
2142 [
2143 'type' => 'acctcreate',
2144 'cache' => $services->getLocalServerObjectCache()
2145 ]
2146 )
2147 );
2148 },
2149
2150 'Tidy' => static function ( MediaWikiServices $services ): TidyDriverBase {
2151 return new RemexDriver(
2152 new ServiceOptions(
2153 RemexDriver::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2154 )
2155 );
2156 },
2157
2158 'TitleFactory' => static function ( MediaWikiServices $services ): TitleFactory {
2159 return new TitleFactory();
2160 },
2161
2162 'TitleFormatter' => static function ( MediaWikiServices $services ): TitleFormatter {
2163 return $services->getService( '_MediaWikiTitleCodec' );
2164 },
2165
2166 'TitleMatcher' => static function ( MediaWikiServices $services ): TitleMatcher {
2167 return new TitleMatcher(
2168 new ServiceOptions(
2169 TitleMatcher::CONSTRUCTOR_OPTIONS,
2170 $services->getMainConfig()
2171 ),
2172 $services->getContentLanguage(),
2173 $services->getLanguageConverterFactory(),
2174 $services->getHookContainer(),
2175 $services->getWikiPageFactory(),
2176 $services->getUserNameUtils(),
2177 $services->getRepoGroup(),
2178 $services->getTitleFactory()
2179 );
2180 },
2181
2182 'TitleParser' => static function ( MediaWikiServices $services ): TitleParser {
2183 return $services->getService( '_MediaWikiTitleCodec' );
2184 },
2185
2186 'TrackingCategories' => static function ( MediaWikiServices $services ): TrackingCategories {
2188 new ServiceOptions(
2189 TrackingCategories::CONSTRUCTOR_OPTIONS,
2190 $services->getMainConfig()
2191 ),
2192 $services->getNamespaceInfo(),
2193 $services->getTitleParser(),
2194 LoggerFactory::getInstance( 'TrackingCategories' )
2195 );
2196 },
2197
2198 'UnblockUserFactory' => static function ( MediaWikiServices $services ): UnblockUserFactory {
2199 return $services->getService( '_UserBlockCommandFactory' );
2200 },
2201
2202 'UndeletePageFactory' => static function ( MediaWikiServices $services ): UndeletePageFactory {
2203 return $services->getService( '_PageCommandFactory' );
2204 },
2205
2206 'UploadRevisionImporter' => static function ( MediaWikiServices $services ): UploadRevisionImporter {
2208 $services->getMainConfig()->get( MainConfigNames::EnableUploads ),
2209 LoggerFactory::getInstance( 'UploadRevisionImporter' )
2210 );
2211 },
2212
2213 'UrlUtils' => static function ( MediaWikiServices $services ): UrlUtils {
2214 $config = $services->getMainConfig();
2215 return new UrlUtils( [
2216 UrlUtils::SERVER => $config->get( MainConfigNames::Server ),
2217 UrlUtils::CANONICAL_SERVER => $config->get( MainConfigNames::CanonicalServer ),
2218 UrlUtils::INTERNAL_SERVER => $config->get( MainConfigNames::InternalServer ),
2219 UrlUtils::FALLBACK_PROTOCOL => RequestContext::getMain()->getRequest()->getProtocol(),
2220 UrlUtils::HTTPS_PORT => $config->get( MainConfigNames::HttpsPort ),
2221 UrlUtils::VALID_PROTOCOLS => $config->get( MainConfigNames::UrlProtocols ),
2222 ] );
2223 },
2224
2225 'UserCache' => static function ( MediaWikiServices $services ): UserCache {
2226 return new UserCache(
2227 LoggerFactory::getInstance( 'UserCache' ),
2228 $services->getDBLoadBalancerFactory(),
2229 $services->getLinkBatchFactory()
2230 );
2231 },
2232
2233 'UserEditTracker' => static function ( MediaWikiServices $services ): UserEditTracker {
2235 $services->getActorMigration(),
2236 $services->getDBLoadBalancerFactory(),
2237 $services->getJobQueueGroup()
2238 );
2239 },
2240
2241 'UserFactory' => static function ( MediaWikiServices $services ): UserFactory {
2242 return new UserFactory(
2243 new ServiceOptions(
2244 UserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2245 ),
2246 $services->getDBLoadBalancerFactory(),
2247 $services->getUserNameUtils()
2248 );
2249 },
2250
2251 'UserGroupManager' => static function ( MediaWikiServices $services ): UserGroupManager {
2252 return $services->getUserGroupManagerFactory()->getUserGroupManager();
2253 },
2254
2255 'UserGroupManagerFactory' => static function ( MediaWikiServices $services ): UserGroupManagerFactory {
2257 new ServiceOptions(
2258 UserGroupManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2259 ),
2260 $services->getReadOnlyMode(),
2261 $services->getDBLoadBalancerFactory(),
2262 $services->getHookContainer(),
2263 $services->getUserEditTracker(),
2264 $services->getGroupPermissionsLookup(),
2265 $services->getJobQueueGroupFactory(),
2266 LoggerFactory::getInstance( 'UserGroupManager' ),
2267 $services->getTempUserConfig(),
2268 [ static function ( UserIdentity $user ) use ( $services ) {
2269 if ( $user->getWikiId() === UserIdentity::LOCAL ) {
2270 $services->getPermissionManager()->invalidateUsersRightsCache( $user );
2271 }
2272 $services->getUserFactory()->invalidateCache( $user );
2273 } ]
2274 );
2275 },
2276
2277 'UserIdentityLookup' => static function ( MediaWikiServices $services ): UserIdentityLookup {
2278 return $services->getActorStoreFactory()->getUserIdentityLookup();
2279 },
2280
2281 'UserIdentityUtils' => static function ( MediaWikiServices $services ): UserIdentityUtils {
2283 $services->getTempUserConfig()
2284 );
2285 },
2286
2287 'UserNamePrefixSearch' => static function ( MediaWikiServices $services ): UserNamePrefixSearch {
2289 $services->getDBLoadBalancerFactory(),
2290 $services->getUserNameUtils()
2291 );
2292 },
2293
2294 'UserNameUtils' => static function ( MediaWikiServices $services ): UserNameUtils {
2295 $messageFormatterFactory = new MessageFormatterFactory( Message::FORMAT_PLAIN );
2296 return new UserNameUtils(
2297 new ServiceOptions(
2298 UserNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2299 ),
2300 $services->getContentLanguage(),
2301 LoggerFactory::getInstance( 'UserNameUtils' ),
2302 $services->getTitleParser(),
2303 $messageFormatterFactory->getTextFormatter(
2304 $services->getContentLanguage()->getCode()
2305 ),
2306 $services->getHookContainer(),
2307 $services->getTempUserConfig()
2308 );
2309 },
2310
2311 'UserOptionsLookup' => static function ( MediaWikiServices $services ): UserOptionsLookup {
2312 return $services->getUserOptionsManager();
2313 },
2314
2315 'UserOptionsManager' => static function ( MediaWikiServices $services ): UserOptionsManager {
2317 new ServiceOptions( UserOptionsManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2318 $services->get( '_DefaultOptionsLookup' ),
2319 $services->getLanguageConverterFactory(),
2320 $services->getDBLoadBalancerFactory(),
2321 LoggerFactory::getInstance( 'UserOptionsManager' ),
2322 $services->getHookContainer(),
2323 $services->getUserFactory(),
2324 $services->getUserNameUtils()
2325 );
2326 },
2327
2328 'UserRegistrationLookup' => static function ( MediaWikiServices $services ): UserRegistrationLookup {
2329 $lookup = new UserRegistrationLookup(
2330 new ServiceOptions( UserRegistrationLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2331 $services->getObjectFactory()
2332 );
2333 if ( !$lookup->isRegistered( LocalUserRegistrationProvider::TYPE ) ) {
2334 throw new ConfigException( 'UserRegistrationLookup: Local provider is required' );
2335 }
2336 return $lookup;
2337 },
2338
2339 'VirtualRESTServiceClient' =>
2340 static function ( MediaWikiServices $services ): VirtualRESTServiceClient {
2341 $config = $services->getMainConfig()->get( MainConfigNames::VirtualRestConfig );
2342
2343 $vrsClient = new VirtualRESTServiceClient(
2344 $services->getHttpRequestFactory()->createMultiClient() );
2345 foreach ( $config['paths'] as $prefix => $serviceConfig ) {
2346 $class = $serviceConfig['class'];
2347 // Merge in the global defaults
2348 $constructArg = $serviceConfig['options'] ?? [];
2349 $constructArg += $config['global'];
2350 // Make the VRS service available at the mount point
2351 $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] );
2352 }
2353
2354 return $vrsClient;
2355 },
2356
2357 'WatchedItemQueryService' =>
2358 static function ( MediaWikiServices $services ): WatchedItemQueryService {
2360 $services->getDBLoadBalancerFactory(),
2361 $services->getCommentStore(),
2362 $services->getWatchedItemStore(),
2363 $services->getHookContainer(),
2364 $services->getUserOptionsLookup(),
2365 $services->getMainConfig()->get( MainConfigNames::WatchlistExpiry ),
2366 $services->getMainConfig()->get( MainConfigNames::MaxExecutionTimeForExpensiveQueries )
2367 );
2368 },
2369
2370 'WatchedItemStore' => static function ( MediaWikiServices $services ): WatchedItemStore {
2371 $store = new WatchedItemStore(
2372 new ServiceOptions( WatchedItemStore::CONSTRUCTOR_OPTIONS,
2373 $services->getMainConfig() ),
2374 $services->getDBLoadBalancerFactory(),
2375 $services->getJobQueueGroup(),
2376 $services->getMainObjectStash(),
2377 new HashBagOStuff( [ 'maxKeys' => 100 ] ),
2378 $services->getReadOnlyMode(),
2379 $services->getNamespaceInfo(),
2380 $services->getRevisionLookup(),
2381 $services->getLinkBatchFactory()
2382 );
2383 $store->setStatsdDataFactory( $services->getStatsdDataFactory() );
2384
2385 if ( $services->getMainConfig()->get( MainConfigNames::ReadOnlyWatchedItemStore ) ) {
2386 $store = new NoWriteWatchedItemStore( $store );
2387 }
2388
2389 return $store;
2390 },
2391
2392 'WatchlistManager' => static function ( MediaWikiServices $services ): WatchlistManager {
2394 [
2395 WatchlistManager::OPTION_ENOTIF =>
2396 RecentChange::isEnotifEnabled( $services->getMainConfig() ),
2397 ],
2398 $services->getHookContainer(),
2399 $services->getReadOnlyMode(),
2400 $services->getRevisionLookup(),
2401 $services->getTalkPageNotificationManager(),
2402 $services->getWatchedItemStore(),
2403 $services->getUserFactory(),
2404 $services->getNamespaceInfo(),
2405 $services->getWikiPageFactory()
2406 );
2407 },
2408
2409 'WikiExporterFactory' => static function ( MediaWikiServices $services ): WikiExporterFactory {
2411 $services->getHookContainer(),
2412 $services->getRevisionStore(),
2413 $services->getTitleParser(),
2414 $services->getCommentStore()
2415 );
2416 },
2417
2418 'WikiImporterFactory' => static function ( MediaWikiServices $services ): WikiImporterFactory {
2420 $services->getMainConfig(),
2421 $services->getHookContainer(),
2422 $services->getContentLanguage(),
2423 $services->getNamespaceInfo(),
2424 $services->getTitleFactory(),
2425 $services->getWikiPageFactory(),
2426 $services->getWikiRevisionUploadImporter(),
2427 $services->getPermissionManager(),
2428 $services->getContentHandlerFactory(),
2429 $services->getSlotRoleRegistry()
2430 );
2431 },
2432
2433 'WikiPageFactory' => static function ( MediaWikiServices $services ): WikiPageFactory {
2435 $services->getTitleFactory(),
2436 new HookRunner( $services->getHookContainer() ),
2437 $services->getDBLoadBalancer()
2438 );
2439 },
2440
2441 'WikiRevisionOldRevisionImporterNoUpdates' =>
2442 static function ( MediaWikiServices $services ): ImportableOldRevisionImporter {
2444 false,
2445 LoggerFactory::getInstance( 'OldRevisionImporter' ),
2446 $services->getDBLoadBalancerFactory(),
2447 $services->getRevisionStore(),
2448 $services->getSlotRoleRegistry(),
2449 $services->getWikiPageFactory(),
2450 $services->getPageUpdaterFactory(),
2451 $services->getUserFactory()
2452 );
2453 },
2454
2455 'WRStatsFactory' => static function ( MediaWikiServices $services ): WRStatsFactory {
2458 ObjectCache::getInstance( $services->getMainConfig()->get( MainConfigNames::StatsCacheType ) )
2459 )
2460 );
2461 },
2462
2463 '_DefaultOptionsLookup' => static function ( MediaWikiServices $services ): DefaultOptionsLookup {
2465 new ServiceOptions( DefaultOptionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2466 $services->getContentLanguage(),
2467 $services->getHookContainer(),
2468 $services->getNamespaceInfo(),
2469 defined( 'MW_PHPUNIT_TEST' ) && $services->isStorageDisabled()
2470 );
2471 },
2472
2473 '_EditConstraintFactory' => static function ( MediaWikiServices $services ): EditConstraintFactory {
2474 // This service is internal and currently only exists because a significant number
2475 // of dependencies will be needed by different constraints. It is not part of
2476 // the public interface and has no corresponding method in MediaWikiServices
2478 // Multiple
2479 new ServiceOptions(
2480 EditConstraintFactory::CONSTRUCTOR_OPTIONS,
2481 $services->getMainConfig()
2482 ),
2483 LoggerFactory::getProvider(),
2484
2485 // UserBlockConstraint
2486 $services->getPermissionManager(),
2487
2488 // EditFilterMergedContentHookConstraint
2489 $services->getHookContainer(),
2490
2491 // ReadOnlyConstraint
2492 $services->getReadOnlyMode(),
2493
2494 // SpamRegexConstraint
2495 $services->getSpamChecker()
2496 );
2497 },
2498
2499 '_LocalClusterCache' => static function ( MediaWikiServices $services ): BagOStuff {
2500 $mainConfig = $services->getMainConfig();
2501 $id = $mainConfig->get( MainConfigNames::MainCacheType );
2502 $params = $mainConfig->get( MainConfigNames::ObjectCaches )[$id] ?? null;
2503 if ( !$params ) {
2504 throw new ConfigException(
2505 "\$wgObjectCaches must have \"$id\" set (via \$wgMainCacheType)"
2506 );
2507 }
2508 return ObjectCache::newFromParams( $params, $services );
2509 },
2510
2511 '_MediaWikiTitleCodec' => static function ( MediaWikiServices $services ): MediaWikiTitleCodec {
2513 $services->getContentLanguage(),
2514 $services->getGenderCache(),
2515 $services->getMainConfig()->get( MainConfigNames::LocalInterwikis ),
2516 $services->getInterwikiLookup(),
2517 $services->getNamespaceInfo()
2518 );
2519 },
2520
2521 '_PageCommandFactory' => static function ( MediaWikiServices $services ): PageCommandFactory {
2523 $services->getMainConfig(),
2524 $services->getDBLoadBalancerFactory(),
2525 $services->getNamespaceInfo(),
2526 $services->getWatchedItemStore(),
2527 $services->getRepoGroup(),
2528 $services->getReadOnlyMode(),
2529 $services->getContentHandlerFactory(),
2530 $services->getRevisionStore(),
2531 $services->getSpamChecker(),
2532 $services->getTitleFormatter(),
2533 $services->getHookContainer(),
2534 $services->getWikiPageFactory(),
2535 $services->getUserFactory(),
2536 $services->getActorMigration(),
2537 $services->getActorNormalization(),
2538 $services->getTitleFactory(),
2539 $services->getUserEditTracker(),
2540 $services->getCollationFactory(),
2541 $services->getJobQueueGroup(),
2542 $services->getCommentStore(),
2543 $services->getMainObjectStash(),
2544 WikiMap::getCurrentWikiDbDomain()->getId(),
2545 WebRequest::getRequestId(),
2546 $services->getBacklinkCacheFactory(),
2547 LoggerFactory::getInstance( 'UndeletePage' ),
2548 $services->getPageUpdaterFactory(),
2549 $services->getMessageFormatterFactory()->getTextFormatter(
2550 $services->getContentLanguage()->getCode()
2551 ),
2552 $services->getArchivedRevisionLookup(),
2553 $services->getRestrictionStore(),
2554 $services->getLinkTargetLookup()
2555 );
2556 },
2557
2558 '_ParserObserver' => static function ( MediaWikiServices $services ): ParserObserver {
2559 return new ParserObserver( LoggerFactory::getInstance( 'DuplicateParse' ) );
2560 },
2561
2562 '_Parsoid' => static function ( MediaWikiServices $services ): Parsoid {
2563 return new Parsoid(
2564 $services->getParsoidSiteConfig(),
2565 $services->getParsoidDataAccess()
2566 );
2567 },
2568
2569 '_SettingsBuilder' => static function ( MediaWikiServices $services ): SettingsBuilder {
2570 return SettingsBuilder::getInstance();
2571 },
2572
2573 '_SqlBlobStore' => static function ( MediaWikiServices $services ): SqlBlobStore {
2574 return $services->getBlobStoreFactory()->newSqlBlobStore();
2575 },
2576
2577 '_UserBlockCommandFactory' => static function ( MediaWikiServices $services ): UserBlockCommandFactory {
2579 new ServiceOptions( UserBlockCommandFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2580 $services->getHookContainer(),
2581 $services->getBlockPermissionCheckerFactory(),
2582 $services->getBlockUtils(),
2583 $services->getDatabaseBlockStore(),
2584 $services->getBlockRestrictionStore(),
2585 $services->getUserFactory(),
2586 $services->getUserEditTracker(),
2587 LoggerFactory::getInstance( 'BlockManager' ),
2588 $services->getTitleFactory(),
2589 $services->getTempUserConfig(),
2590 $services->getBlockActionInfo()
2591 );
2592 },
2593
2595 // NOTE: When adding a service here, don't forget to add a getter function
2596 // in the MediaWikiServices class. The convenience getter should just call
2597 // $this->getService( 'FooBarService' ).
2599
2600];
const SCHEMA_COMPAT_NEW
Definition Defines.php:277
wfWarn( $msg, $callerOffset=1, $level=E_USER_NOTICE)
Send a warning either to the debug log or in a PHP error depending on $wgDevelopmentWarnings.
wfShellExec( $cmd, &$retval=null, $environ=[], $limits=[], $options=[])
Execute a shell command, with time and memory limits mirrored from the PHP configuration if supported...
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
return[ 'ActionFactory'=> static function(MediaWikiServices $services):ActionFactory { return new ActionFactory($services->getMainConfig() ->get(MainConfigNames::Actions), LoggerFactory::getInstance( 'ActionFactory'), $services->getObjectFactory(), $services->getHookContainer());}, 'ActorMigration'=> static function(MediaWikiServices $services):ActorMigration { return new ActorMigration(SCHEMA_COMPAT_NEW, $services->getActorStoreFactory());}, 'ActorNormalization'=> static function(MediaWikiServices $services):ActorNormalization { return $services->getActorStoreFactory() ->getActorNormalization();}, 'ActorStore'=> static function(MediaWikiServices $services):ActorStore { return $services->getActorStoreFactory() ->getActorStore();}, 'ActorStoreFactory'=> static function(MediaWikiServices $services):ActorStoreFactory { return new ActorStoreFactory(new ServiceOptions(ActorStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getUserNameUtils(), $services->getTempUserConfig(), LoggerFactory::getInstance( 'ActorStore'));}, 'ArchivedRevisionLookup'=> static function(MediaWikiServices $services):ArchivedRevisionLookup { return new ArchivedRevisionLookup($services->getDBLoadBalancerFactory(), $services->getRevisionStore());}, 'AuthManager'=> static function(MediaWikiServices $services):AuthManager { $authManager=new AuthManager(RequestContext::getMain() ->getRequest(), $services->getMainConfig(), $services->getObjectFactory(), $services->getHookContainer(), $services->getReadOnlyMode(), $services->getUserNameUtils(), $services->getBlockManager(), $services->getWatchlistManager(), $services->getDBLoadBalancer(), $services->getContentLanguage(), $services->getLanguageConverterFactory(), $services->getBotPasswordStore(), $services->getUserFactory(), $services->getUserIdentityLookup(), $services->getUserOptionsManager());$authManager->setLogger(LoggerFactory::getInstance( 'authentication'));return $authManager;}, 'BacklinkCacheFactory'=> static function(MediaWikiServices $services):BacklinkCacheFactory { return new BacklinkCacheFactory(new ServiceOptions(BacklinkCache::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getLinksMigration(), $services->getMainWANObjectCache(), $services->getHookContainer(), $services->getDBLoadBalancerFactory());}, 'BadFileLookup'=> static function(MediaWikiServices $services):BadFileLookup { return new BadFileLookup(static function() { return wfMessage( 'bad_image_list') ->inContentLanguage() ->plain();}, $services->getLocalServerObjectCache(), $services->getRepoGroup(), $services->getTitleParser(), $services->getHookContainer());}, 'BlobStore'=> static function(MediaWikiServices $services):BlobStore { return $services->getService( '_SqlBlobStore');}, 'BlobStoreFactory'=> static function(MediaWikiServices $services):BlobStoreFactory { return new BlobStoreFactory($services->getDBLoadBalancerFactory(), $services->getExternalStoreAccess(), $services->getMainWANObjectCache(), new ServiceOptions(BlobStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'BlockActionInfo'=> static function(MediaWikiServices $services):BlockActionInfo { return new BlockActionInfo( $services->getHookContainer());}, 'BlockErrorFormatter'=> static function(MediaWikiServices $services):BlockErrorFormatter { return new BlockErrorFormatter($services->getTitleFormatter(), $services->getHookContainer(), $services->getUserIdentityUtils());}, 'BlockManager'=> static function(MediaWikiServices $services):BlockManager { return new BlockManager(new ServiceOptions(BlockManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getPermissionManager(), $services->getUserFactory(), $services->getUserIdentityUtils(), LoggerFactory::getInstance( 'BlockManager'), $services->getHookContainer());}, 'BlockPermissionCheckerFactory'=> static function(MediaWikiServices $services):BlockPermissionCheckerFactory { return new BlockPermissionCheckerFactory(new ServiceOptions(BlockPermissionCheckerFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getBlockUtils());}, 'BlockRestrictionStore'=> static function(MediaWikiServices $services):BlockRestrictionStore { return $services->getBlockRestrictionStoreFactory() ->getBlockRestrictionStore(WikiAwareEntity::LOCAL);}, 'BlockRestrictionStoreFactory'=> static function(MediaWikiServices $services):BlockRestrictionStoreFactory { return new BlockRestrictionStoreFactory($services->getDBLoadBalancerFactory());}, 'BlockUserFactory'=> static function(MediaWikiServices $services):BlockUserFactory { return $services->getService( '_UserBlockCommandFactory');}, 'BlockUtils'=> static function(MediaWikiServices $services):BlockUtils { return new BlockUtils(new ServiceOptions(BlockUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getUserIdentityLookup(), $services->getUserNameUtils());}, 'BotPasswordStore'=> static function(MediaWikiServices $services):BotPasswordStore { return new BotPasswordStore(new ServiceOptions(BotPasswordStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getCentralIdLookup(), $services->getDBLoadBalancerFactory());}, 'CentralIdLookup'=> static function(MediaWikiServices $services):CentralIdLookup { return $services->getCentralIdLookupFactory() ->getLookup();}, 'CentralIdLookupFactory'=> static function(MediaWikiServices $services):CentralIdLookupFactory { return new CentralIdLookupFactory(new ServiceOptions(CentralIdLookupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getObjectFactory(), $services->getUserIdentityLookup());}, 'ChangeTagDefStore'=> static function(MediaWikiServices $services):NameTableStore { return $services->getNameTableStoreFactory() ->getChangeTagDef();}, 'ChangeTagsStore'=> static function(MediaWikiServices $services):ChangeTagsStore { return new ChangeTagsStore($services->getDBLoadBalancerFactory(), $services->getChangeTagDefStore(), $services->getMainWANObjectCache(), $services->getHookContainer(), LoggerFactory::getInstance( 'ChangeTags'), $services->getUserFactory(), new ServiceOptions(ChangeTagsStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'ChronologyProtector'=> static function(MediaWikiServices $services):ChronologyProtector { $mainConfig=$services->getMainConfig();$cpStashType=$mainConfig->get(MainConfigNames::ChronologyProtectorStash);$isMainCacheBad=ObjectCache::isDatabaseId( $mainConfig->get(MainConfigNames::MainCacheType));if(is_string( $cpStashType)) { $cpStash=ObjectCache::getInstance( $cpStashType);} elseif( $isMainCacheBad) { $cpStash=new EmptyBagOStuff();} else { $cpStash=ObjectCache::getLocalClusterInstance();} $chronologyProtector=new ChronologyProtector($cpStash, $mainConfig->get(MainConfigNames::ChronologyProtectorSecret), $mainConfig->get( 'CommandLineMode'), LoggerFactory::getInstance( 'rdbms'));$req=RequestContext::getMain() ->getRequest();$reqStart=(int)( $_SERVER['REQUEST_TIME_FLOAT'] ?? time());$cpPosInfo=ChronologyProtector::getCPInfoFromCookieValue($req->getCookie( 'cpPosIndex', ''), $reqStart - ChronologyProtector::POSITION_COOKIE_TTL);$chronologyProtector->setRequestInfo(['IPAddress'=> $req->getIP(), 'UserAgent'=> $req->getHeader( 'User-Agent'), 'ChronologyPositionIndex'=> $req->getInt( 'cpPosIndex', $cpPosInfo['index']), 'ChronologyClientId'=> $cpPosInfo['clientId'] ?? null,]);return $chronologyProtector;}, 'CollationFactory'=> static function(MediaWikiServices $services):CollationFactory { return new CollationFactory(new ServiceOptions(CollationFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getObjectFactory(), $services->getHookContainer());}, 'CommentFormatter'=> static function(MediaWikiServices $services):CommentFormatter { return new CommentFormatter($services->getCommentParserFactory());}, 'CommentParserFactory'=> static function(MediaWikiServices $services):CommentParserFactory { return new CommentParserFactory($services->getLinkRendererFactory() ->create([ 'renderForComment'=> true]), $services->getLinkBatchFactory(), $services->getLinkCache(), $services->getRepoGroup(), RequestContext::getMain() ->getLanguage(), $services->getContentLanguage(), $services->getTitleParser(), $services->getNamespaceInfo(), $services->getHookContainer());}, 'CommentStore'=> static function(MediaWikiServices $services):CommentStore { return new CommentStore( $services->getContentLanguage());}, 'ConfigFactory'=> static function(MediaWikiServices $services):ConfigFactory { $registry=$services->getBootstrapConfig() ->get(MainConfigNames::ConfigRegistry);$factory=new ConfigFactory();foreach( $registry as $name=> $callback) { $factory->register( $name, $callback);} return $factory;}, 'ConfigRepository'=> static function(MediaWikiServices $services):ConfigRepository { return new ConfigRepository( $services->getConfigFactory());}, 'ConfigSchema'=> static function(MediaWikiServices $services):ConfigSchema { $settings=$services->get( '_SettingsBuilder');return $settings->getConfigSchema();}, 'ConfiguredReadOnlyMode'=> static function(MediaWikiServices $services):ConfiguredReadOnlyMode { $config=$services->getMainConfig();return new ConfiguredReadOnlyMode($config->get(MainConfigNames::ReadOnly), $config->get(MainConfigNames::ReadOnlyFile));}, 'ContentHandlerFactory'=> static function(MediaWikiServices $services):IContentHandlerFactory { $contentHandlerConfig=$services->getMainConfig() ->get(MainConfigNames::ContentHandlers);return new ContentHandlerFactory($contentHandlerConfig, $services->getObjectFactory(), $services->getHookContainer(), LoggerFactory::getInstance( 'ContentHandler'));}, 'ContentLanguage'=> static function(MediaWikiServices $services):Language { return $services->getLanguageFactory() ->getLanguage($services->getMainConfig() ->get(MainConfigNames::LanguageCode));}, 'ContentModelChangeFactory'=> static function(MediaWikiServices $services):ContentModelChangeFactory { return $services->getService( '_PageCommandFactory');}, 'ContentModelStore'=> static function(MediaWikiServices $services):NameTableStore { return $services->getNameTableStoreFactory() ->getContentModels();}, 'ContentRenderer'=> static function(MediaWikiServices $services):ContentRenderer { return new ContentRenderer( $services->getContentHandlerFactory());}, 'ContentTransformer'=> static function(MediaWikiServices $services):ContentTransformer { return new ContentTransformer( $services->getContentHandlerFactory());}, 'ContributionsLookup'=> static function(MediaWikiServices $services):ContributionsLookup { return new ContributionsLookup($services->getRevisionStore(), $services->getLinkRendererFactory(), $services->getLinkBatchFactory(), $services->getHookContainer(), $services->getDBLoadBalancerFactory(), $services->getNamespaceInfo(), $services->getCommentFormatter());}, 'CriticalSectionProvider'=> static function(MediaWikiServices $services):CriticalSectionProvider { $config=$services->getMainConfig();$limit=$GLOBALS[ 'wgCommandLineMode'] ? INF :$config->get(MainConfigNames::CriticalSectionTimeLimit);return RequestTimeout::singleton() ->createCriticalSectionProvider( $limit);}, 'CryptHKDF'=> static function(MediaWikiServices $services):CryptHKDF { $config=$services->getMainConfig();$secret=$config->get(MainConfigNames::HKDFSecret) ?:$config->get(MainConfigNames::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(MainConfigNames::HKDFAlgorithm), $cache, $context);}, 'DatabaseBlockStore'=> static function(MediaWikiServices $services):DatabaseBlockStore { return $services->getDatabaseBlockStoreFactory() ->getDatabaseBlockStore(DatabaseBlock::LOCAL);}, 'DatabaseBlockStoreFactory'=> static function(MediaWikiServices $services):DatabaseBlockStoreFactory { return new DatabaseBlockStoreFactory(new ServiceOptions(DatabaseBlockStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), LoggerFactory::getInstance( 'DatabaseBlockStore'), $services->getActorStoreFactory(), $services->getBlockRestrictionStoreFactory(), $services->getCommentStore(), $services->getHookContainer(), $services->getDBLoadBalancerFactory(), $services->getReadOnlyMode(), $services->getUserFactory());}, 'DatabaseFactory'=> static function(MediaWikiServices $services):DatabaseFactory { return new DatabaseFactory([ 'debugSql'=> $services->getMainConfig() ->get(MainConfigNames::DebugDumpSql)]);}, 'DateFormatterFactory'=> static function(MediaWikiServices $services):DateFormatterFactory { return new DateFormatterFactory();}, 'DBLoadBalancer'=> static function(MediaWikiServices $services):Wikimedia\Rdbms\ILoadBalancer { return $services->getDBLoadBalancerFactory() ->getMainLB();}, 'DBLoadBalancerFactory'=> static function(MediaWikiServices $services):Wikimedia\Rdbms\LBFactory { $mainConfig=$services->getMainConfig();$lbFactoryConfigBuilder=$services->getDBLoadBalancerFactoryConfigBuilder();$lbConf=$lbFactoryConfigBuilder->applyDefaultConfig($mainConfig->get(MainConfigNames::LBFactoryConf));$class=$lbFactoryConfigBuilder->getLBFactoryClass( $lbConf);$instance=new $class( $lbConf);$lbFactoryConfigBuilder->setDomainAliases( $instance);$lbFactoryConfigBuilder->applyGlobalState($instance, $mainConfig, $services->getStatsdDataFactory());return $instance;}, 'DBLoadBalancerFactoryConfigBuilder'=> static function(MediaWikiServices $services):MWLBFactory { $mainConfig=$services->getMainConfig();if(ObjectCache::isDatabaseId( $mainConfig->get(MainConfigNames::MainCacheType))) { $wanCache=WANObjectCache::newEmpty();} else { $wanCache=$services->getMainWANObjectCache();} $srvCache=$services->getLocalServerObjectCache();if( $srvCache instanceof EmptyBagOStuff) { $srvCache=new HashBagOStuff([ 'maxKeys'=> 100]);} return new MWLBFactory(new ServiceOptions(MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $services->getMainConfig()), new ConfiguredReadOnlyMode($mainConfig->get(MainConfigNames::ReadOnly), $mainConfig->get(MainConfigNames::ReadOnlyFile)), $services->getChronologyProtector(), $srvCache, $wanCache, $services->getCriticalSectionProvider(), $services->getStatsdDataFactory(), ExtensionRegistry::getInstance() ->getAttribute( 'DatabaseVirtualDomains'));}, 'DeletePageFactory'=> static function(MediaWikiServices $services):DeletePageFactory { return $services->getService( '_PageCommandFactory');}, 'Emailer'=> static function(MediaWikiServices $services):IEmailer { return new Emailer();}, 'EmailUserFactory'=> static function(MediaWikiServices $services):EmailUserFactory { return new EmailUserFactory(new ServiceOptions(EmailUser::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer(), $services->getUserOptionsLookup(), $services->getCentralIdLookup(), $services->getUserFactory(), $services->getEmailer(), $services->getMessageFormatterFactory(), $services->getMessageFormatterFactory() ->getTextFormatter( $services->getContentLanguage() ->getCode()));}, 'EventRelayerGroup'=> static function(MediaWikiServices $services):EventRelayerGroup { return new EventRelayerGroup( $services->getMainConfig() ->get(MainConfigNames::EventRelayerConfig));}, 'ExternalStoreAccess'=> static function(MediaWikiServices $services):ExternalStoreAccess { return new ExternalStoreAccess($services->getExternalStoreFactory(), LoggerFactory::getInstance( 'ExternalStore'));}, 'ExternalStoreFactory'=> static function(MediaWikiServices $services):ExternalStoreFactory { $config=$services->getMainConfig();$writeStores=$config->get(MainConfigNames::DefaultExternalStore);return new ExternalStoreFactory($config->get(MainConfigNames::ExternalStores),( $writeStores !==false) ?(array) $writeStores :[], $services->getDBLoadBalancer() ->getLocalDomainID(), LoggerFactory::getInstance( 'ExternalStore'));}, 'FileBackendGroup'=> static function(MediaWikiServices $services):FileBackendGroup { $mainConfig=$services->getMainConfig();$ld=WikiMap::getCurrentWikiDbDomain();$fallbackWikiId=WikiMap::getWikiIdFromDbDomain( $ld);$legacyDomainId=strlen( $ld->getTablePrefix()) ? "{$ld->getDatabase()}-{$ld->getTablePrefix()}" :$ld->getDatabase();if( $ld->getSchema() !==null && $legacyDomainId !==$fallbackWikiId) { wfWarn("Legacy default 'domainId' is '$legacyDomainId' but wiki ID is '$fallbackWikiId'.");} $cache=$services->getLocalServerObjectCache();if( $cache instanceof EmptyBagOStuff) { $cache=new HashBagOStuff();} return new FileBackendGroup(new ServiceOptions(FileBackendGroup::CONSTRUCTOR_OPTIONS, $mainConfig, [ 'fallbackWikiId'=> $fallbackWikiId]), $services->getReadOnlyMode(), $cache, $services->getMainWANObjectCache(), $services->getMimeAnalyzer(), $services->getLockManagerGroupFactory(), $services->getTempFSFileFactory(), $services->getObjectFactory());}, 'GenderCache'=> static function(MediaWikiServices $services):GenderCache { $nsInfo=$services->getNamespaceInfo();$dbLoadBalancer=$services->isServiceDisabled( 'DBLoadBalancer') ? null :$services->getDBLoadBalancerFactory();return new GenderCache( $nsInfo, $dbLoadBalancer, $services->get( '_DefaultOptionsLookup'));}, 'GlobalIdGenerator'=> static function(MediaWikiServices $services):GlobalIdGenerator { $mainConfig=$services->getMainConfig();return new GlobalIdGenerator($mainConfig->get(MainConfigNames::TmpDirectory), static function( $command) { return wfShellExec( $command);});}, 'GrantsInfo'=> static function(MediaWikiServices $services):GrantsInfo { return new GrantsInfo(new ServiceOptions(GrantsInfo::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'GrantsLocalization'=> static function(MediaWikiServices $services):GrantsLocalization { return new GrantsLocalization($services->getGrantsInfo(), $services->getLinkRenderer(), $services->getLanguageFactory(), $services->getContentLanguage());}, 'GroupPermissionsLookup'=> static function(MediaWikiServices $services):GroupPermissionsLookup { return new GroupPermissionsLookup(new ServiceOptions(GroupPermissionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'HookContainer'=> static function(MediaWikiServices $services):HookContainer { $configHooks=$services->getBootstrapConfig() ->get(MainConfigNames::Hooks);if( $configHooks instanceof FauxGlobalHookArray) { $configHooks=$configHooks->getOriginalArray();} $extRegistry=ExtensionRegistry::getInstance();$extHooks=$extRegistry->getAttribute( 'Hooks');$extDeprecatedHooks=$extRegistry->getAttribute( 'DeprecatedHooks');$hookRegistry=new StaticHookRegistry( $configHooks, $extHooks, $extDeprecatedHooks);$hookContainer=new HookContainer($hookRegistry, $services->getObjectFactory());return $hookContainer;}, 'HtmlCacheUpdater'=> static function(MediaWikiServices $services):HtmlCacheUpdater { $config=$services->getMainConfig();return new HtmlCacheUpdater($services->getHookContainer(), $services->getTitleFactory(), $config->get(MainConfigNames::CdnReboundPurgeDelay), $config->get(MainConfigNames::UseFileCache), $config->get(MainConfigNames::CdnMaxAge));}, 'HtmlTransformFactory'=> static function(MediaWikiServices $services):HtmlTransformFactory { return new HtmlTransformFactory($services->getService( '_Parsoid'), $services->getMainConfig() ->get(MainConfigNames::ParsoidSettings), $services->getParsoidPageConfigFactory(), $services->getContentHandlerFactory(), $services->getParsoidSiteConfig(), $services->getTitleFactory(), $services->getLanguageConverterFactory(), $services->getLanguageFactory());}, 'HttpRequestFactory'=> static function(MediaWikiServices $services):HttpRequestFactory { return new HttpRequestFactory(new ServiceOptions(HttpRequestFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), LoggerFactory::getInstance( 'http'), Telemetry::getInstance());}, 'InterwikiLookup'=> static function(MediaWikiServices $services):InterwikiLookup { return new ClassicInterwikiLookup(new ServiceOptions(ClassicInterwikiLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig(), [ 'wikiId'=> WikiMap::getCurrentWikiId()]), $services->getContentLanguage(), $services->getMainWANObjectCache(), $services->getHookContainer(), $services->getDBLoadBalancerFactory());}, 'IntroMessageBuilder'=> static function(MediaWikiServices $services):IntroMessageBuilder { return new IntroMessageBuilder($services->getMainConfig(), $services->getLinkRenderer(), $services->getPermissionManager(), $services->getUserNameUtils(), $services->getTempUserCreator(), $services->getUserFactory(), $services->getRestrictionStore(), $services->getReadOnlyMode(), $services->getSpecialPageFactory(), $services->getRepoGroup(), $services->getNamespaceInfo(), $services->getSkinFactory());}, 'JobFactory'=> static function(MediaWikiServices $services):JobFactory { return new JobFactory($services->getObjectFactory(), $services->getMainConfig() ->get(MainConfigNames::JobClasses));}, 'JobQueueGroup'=> static function(MediaWikiServices $services):JobQueueGroup { return $services->getJobQueueGroupFactory() ->makeJobQueueGroup();}, 'JobQueueGroupFactory'=> static function(MediaWikiServices $services):JobQueueGroupFactory { return new JobQueueGroupFactory(new ServiceOptions(JobQueueGroupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getReadOnlyMode(), $services->getStatsdDataFactory(), $services->getMainWANObjectCache(), $services->getGlobalIdGenerator());}, 'JobRunner'=> static function(MediaWikiServices $services):JobRunner { return new JobRunner(new ServiceOptions(JobRunner::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getJobQueueGroup(), $services->getReadOnlyMode(), $services->getLinkCache(), $services->getStatsdDataFactory(), LoggerFactory::getInstance( 'runJobs'));}, 'JsonCodec'=> static function(MediaWikiServices $services):JsonCodec { return new JsonCodec();}, 'LanguageConverterFactory'=> static function(MediaWikiServices $services):LanguageConverterFactory { $usePigLatinVariant=$services->getMainConfig() ->get(MainConfigNames::UsePigLatinVariant);$isConversionDisabled=$services->getMainConfig() ->get(MainConfigNames::DisableLangConversion);$isTitleConversionDisabled=$services->getMainConfig() ->get(MainConfigNames::DisableTitleConversion);return new LanguageConverterFactory($services->getObjectFactory(), $usePigLatinVariant, $isConversionDisabled, $isTitleConversionDisabled, static function() use( $services) { return $services->getContentLanguage();});}, 'LanguageFactory'=> static function(MediaWikiServices $services):LanguageFactory { return new LanguageFactory(new ServiceOptions(LanguageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getNamespaceInfo(), $services->getLocalisationCache(), $services->getLanguageNameUtils(), $services->getLanguageFallback(), $services->getLanguageConverterFactory(), $services->getHookContainer(), $services->getMainConfig());}, 'LanguageFallback'=> static function(MediaWikiServices $services):LanguageFallback { return new LanguageFallback($services->getMainConfig() ->get(MainConfigNames::LanguageCode), $services->getLocalisationCache(), $services->getLanguageNameUtils());}, 'LanguageNameUtils'=> static function(MediaWikiServices $services):LanguageNameUtils { return new LanguageNameUtils(new ServiceOptions(LanguageNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer());}, 'LinkBatchFactory'=> static function(MediaWikiServices $services):LinkBatchFactory { return new LinkBatchFactory($services->getLinkCache(), $services->getTitleFormatter(), $services->getContentLanguage(), $services->getGenderCache(), $services->getDBLoadBalancerFactory(), $services->getLinksMigration(), LoggerFactory::getInstance( 'LinkBatch'));}, 'LinkCache'=> static function(MediaWikiServices $services):LinkCache { $dbLoadBalancer=$services->isServiceDisabled( 'DBLoadBalancer') ? null :$services->getDBLoadBalancer();$linkCache=new LinkCache($services->getTitleFormatter(), $services->getMainWANObjectCache(), $services->getNamespaceInfo(), $dbLoadBalancer);$linkCache->setLogger(LoggerFactory::getInstance( 'LinkCache'));return $linkCache;}, 'LinkRenderer'=> static function(MediaWikiServices $services):LinkRenderer { return $services->getLinkRendererFactory() ->create();}, 'LinkRendererFactory'=> static function(MediaWikiServices $services):LinkRendererFactory { return new LinkRendererFactory($services->getTitleFormatter(), $services->getLinkCache(), $services->getSpecialPageFactory(), $services->getHookContainer());}, 'LinksMigration'=> static function(MediaWikiServices $services):LinksMigration { return new LinksMigration($services->getMainConfig(), $services->getLinkTargetLookup());}, 'LinkTargetLookup'=> static function(MediaWikiServices $services):LinkTargetLookup { return new LinkTargetStore($services->getDBLoadBalancerFactory(), $services->getLocalServerObjectCache(), $services->getMainWANObjectCache());}, 'LocalisationCache'=> static function(MediaWikiServices $services):LocalisationCache { $conf=$services->getMainConfig() ->get(MainConfigNames::LocalisationCacheConf);$logger=LoggerFactory::getInstance( 'localisation');$store=LocalisationCache::getStoreFromConf($conf, $services->getMainConfig() ->get(MainConfigNames::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, [static function() use( $services) { MessageBlobStore::clearGlobalCacheEntry( $services->getMainWANObjectCache());}], $services->getLanguageNameUtils(), $services->getHookContainer());}, 'LocalServerObjectCache'=> static function(MediaWikiServices $services):BagOStuff { return ObjectCache::makeLocalServerCache();}, 'LockManagerGroupFactory'=> static function(MediaWikiServices $services):LockManagerGroupFactory { return new LockManagerGroupFactory(WikiMap::getCurrentWikiDbDomain() ->getId(), $services->getMainConfig() ->get(MainConfigNames::LockManagers));}, 'MagicWordFactory'=> static function(MediaWikiServices $services):MagicWordFactory { return new MagicWordFactory($services->getContentLanguage(), $services->getHookContainer());}, 'MainConfig'=> static function(MediaWikiServices $services):Config { return $services->getConfigFactory() ->makeConfig( 'main');}, 'MainObjectStash'=> static function(MediaWikiServices $services):BagOStuff { $mainConfig=$services->getMainConfig();$id=$mainConfig->get(MainConfigNames::MainStash);$params=$mainConfig->get(MainConfigNames::ObjectCaches)[$id] ?? null;if(! $params) { throw new ConfigException("\$wgObjectCaches must have \"$id\" set (via \$wgMainStash)");} $store=ObjectCache::newFromParams( $params, $services);$store->getLogger() ->debug( 'MainObjectStash using store {class}', ['class'=> get_class( $store)]);return $store;}, 'MainWANObjectCache'=> static function(MediaWikiServices $services):WANObjectCache { $mainConfig=$services->getMainConfig();$store=$services->get( '_LocalClusterCache');$logger=$store->getLogger();$logger->debug( 'MainWANObjectCache using store {class}', ['class'=> get_class( $store)]);$wanParams=$mainConfig->get(MainConfigNames::WANObjectCache)+['cache'=> $store, 'logger'=> $logger, 'secret'=> $mainConfig->get(MainConfigNames::SecretKey),];if(! $GLOBALS[ 'wgCommandLineMode']) { $wanParams['stats']=$services->getStatsdDataFactory();$wanParams['asyncHandler']=[DeferredUpdates::class, 'addCallableUpdate'];} return new WANObjectCache( $wanParams);}, 'MediaHandlerFactory'=> static function(MediaWikiServices $services):MediaHandlerFactory { return new MediaHandlerFactory(LoggerFactory::getInstance( 'MediaHandlerFactory'), $services->getMainConfig() ->get(MainConfigNames::MediaHandlers));}, 'MergeHistoryFactory'=> static function(MediaWikiServices $services):MergeHistoryFactory { return $services->getService( '_PageCommandFactory');}, 'MessageCache'=> static function(MediaWikiServices $services):MessageCache { $mainConfig=$services->getMainConfig();$clusterCache=ObjectCache::getInstance( $mainConfig->get(MainConfigNames::MessageCacheType));$srvCache=$mainConfig->get(MainConfigNames::UseLocalMessageCache) ? $services->getLocalServerObjectCache() :new EmptyBagOStuff();$logger=LoggerFactory::getInstance( 'MessageCache');$logger->debug( 'MessageCache using store {class}', ['class'=> get_class( $clusterCache)]);$options=new ServiceOptions(MessageCache::CONSTRUCTOR_OPTIONS, $mainConfig);return new MessageCache($services->getMainWANObjectCache(), $clusterCache, $srvCache, $services->getContentLanguage(), $services->getLanguageConverterFactory(), $logger, $options, $services->getLanguageFactory(), $services->getLocalisationCache(), $services->getLanguageNameUtils(), $services->getLanguageFallback(), $services->getHookContainer(), $services->getParserFactory());}, 'MessageFormatterFactory'=> static function(MediaWikiServices $services):IMessageFormatterFactory { return new MessageFormatterFactory();}, 'MimeAnalyzer'=> static function(MediaWikiServices $services):MimeAnalyzer { $logger=LoggerFactory::getInstance( 'Mime');$mainConfig=$services->getMainConfig();$hookRunner=new HookRunner( $services->getHookContainer());$params=['typeFile'=> $mainConfig->get(MainConfigNames::MimeTypeFile), 'infoFile'=> $mainConfig->get(MainConfigNames::MimeInfoFile), 'xmlTypes'=> $mainConfig->get(MainConfigNames::XMLMimeTypes), 'guessCallback'=> static function( $mimeAnalyzer, &$head, &$tail, $file, &$mime) use( $logger, $hookRunner) { $deja=new DjVuImage( $file);if( $deja->isValid()) { $logger->info("Detected $file as image/vnd.djvu\n");$mime='image/vnd.djvu';return;} $hookRunner->onMimeMagicGuessFromContent($mimeAnalyzer, $head, $tail, $file, $mime);}, 'extCallback'=> static function( $mimeAnalyzer, $ext, &$mime) use( $hookRunner) { $hookRunner->onMimeMagicImproveFromExtension( $mimeAnalyzer, $ext, $mime);}, 'initCallback'=> static function( $mimeAnalyzer) use( $hookRunner) { $hookRunner->onMimeMagicInit( $mimeAnalyzer);}, 'logger'=> $logger];if( $params['infoFile']==='includes/mime.info') { $params['infoFile']=MimeAnalyzer::USE_INTERNAL;} if( $params['typeFile']==='includes/mime.types') { $params['typeFile']=MimeAnalyzer::USE_INTERNAL;} $detectorCmd=$mainConfig->get(MainConfigNames::MimeDetectorCommand);if( $detectorCmd) { $factory=$services->getShellCommandFactory();$params['detectCallback']=static function( $file) use( $detectorCmd, $factory) { $result=$factory->create() ->unsafeParams( $detectorCmd) ->params( $file) ->execute();return $result->getStdout();};} return new MimeAnalyzer( $params);}, 'MovePageFactory'=> static function(MediaWikiServices $services):MovePageFactory { return $services->getService( '_PageCommandFactory');}, 'NamespaceInfo'=> static function(MediaWikiServices $services):NamespaceInfo { return new NamespaceInfo(new ServiceOptions(NamespaceInfo::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer(), ExtensionRegistry::getInstance() ->getAttribute( 'ExtensionNamespaces'), ExtensionRegistry::getInstance() ->getAttribute( 'ImmovableNamespaces'));}, 'NameTableStoreFactory'=> static function(MediaWikiServices $services):NameTableStoreFactory { return new NameTableStoreFactory($services->getDBLoadBalancerFactory(), $services->getMainWANObjectCache(), LoggerFactory::getInstance( 'NameTableSqlStore'));}, 'ObjectFactory'=> static function(MediaWikiServices $services):ObjectFactory { return new ObjectFactory( $services);}, 'OldRevisionImporter'=> static function(MediaWikiServices $services):OldRevisionImporter { return new ImportableOldRevisionImporter(true, LoggerFactory::getInstance( 'OldRevisionImporter'), $services->getDBLoadBalancerFactory(), $services->getRevisionStore(), $services->getSlotRoleRegistry(), $services->getWikiPageFactory(), $services->getPageUpdaterFactory(), $services->getUserFactory());}, 'PageEditStash'=> static function(MediaWikiServices $services):PageEditStash { return new PageEditStash(ObjectCache::getLocalClusterInstance(), $services->getDBLoadBalancerFactory(), LoggerFactory::getInstance( 'StashEdit'), $services->getStatsdDataFactory(), $services->getUserEditTracker(), $services->getUserFactory(), $services->getWikiPageFactory(), $services->getHookContainer(), defined( 'MEDIAWIKI_JOB_RUNNER')|| $GLOBALS[ 'wgCommandLineMode'] ? PageEditStash::INITIATOR_JOB_OR_CLI :PageEditStash::INITIATOR_USER);}, 'PageProps'=> static function(MediaWikiServices $services):PageProps { return new PageProps($services->getLinkBatchFactory(), $services->getDBLoadBalancerFactory());}, 'PageRestHelperFactory'=> static function(MediaWikiServices $services):PageRestHelperFactory { return new PageRestHelperFactory(new ServiceOptions(PageRestHelperFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getRevisionLookup(), $services->getTitleFormatter(), $services->getPageStore(), $services->getParsoidOutputStash(), $services->getStatsdDataFactory(), $services->getParsoidOutputAccess(), $services->getHtmlTransformFactory(), $services->getContentHandlerFactory(), $services->getLanguageFactory(), $services->getRedirectStore(), $services->getLanguageConverterFactory());}, 'PageStore'=> static function(MediaWikiServices $services):PageStore { return $services->getPageStoreFactory() ->getPageStore();}, 'PageStoreFactory'=> static function(MediaWikiServices $services):PageStoreFactory { $options=new ServiceOptions(PageStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new PageStoreFactory($options, $services->getDBLoadBalancerFactory(), $services->getNamespaceInfo(), $services->getTitleParser(), $services->getLinkCache(), $services->getStatsdDataFactory());}, 'PageUpdaterFactory'=> static function(MediaWikiServices $services):PageUpdaterFactory { $editResultCache=new EditResultCache($services->getMainObjectStash(), $services->getDBLoadBalancerFactory(), new ServiceOptions(EditResultCache::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));return new PageUpdaterFactory($services->getRevisionStore(), $services->getRevisionRenderer(), $services->getSlotRoleRegistry(), $services->getParserCache(), $services->getJobQueueGroup(), $services->getMessageCache(), $services->getContentLanguage(), $services->getDBLoadBalancerFactory(), $services->getContentHandlerFactory(), $services->getHookContainer(), $editResultCache, $services->getUserNameUtils(), LoggerFactory::getInstance( 'SavePage'), new ServiceOptions(PageUpdaterFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getUserEditTracker(), $services->getUserGroupManager(), $services->getTitleFormatter(), $services->getContentTransformer(), $services->getPageEditStash(), $services->getTalkPageNotificationManager(), $services->getMainWANObjectCache(), $services->getPermissionManager(), $services->getWikiPageFactory(), $services->getChangeTagsStore() ->getSoftwareTags());}, 'Parser'=> static function(MediaWikiServices $services):Parser { return $services->getParserFactory() ->getMainInstance();}, 'ParserCache'=> static function(MediaWikiServices $services):ParserCache { return $services->getParserCacheFactory() ->getParserCache(ParserCacheFactory::DEFAULT_NAME);}, 'ParserCacheFactory'=> static function(MediaWikiServices $services):ParserCacheFactory { $config=$services->getMainConfig();$cache=ObjectCache::getInstance( $config->get(MainConfigNames::ParserCacheType));$wanCache=$services->getMainWANObjectCache();$options=new ServiceOptions(ParserCacheFactory::CONSTRUCTOR_OPTIONS, $config);return new ParserCacheFactory($cache, $wanCache, $services->getHookContainer(), $services->getJsonCodec(), $services->getStatsdDataFactory(), LoggerFactory::getInstance( 'ParserCache'), $options, $services->getTitleFactory(), $services->getWikiPageFactory());}, 'ParserFactory'=> static function(MediaWikiServices $services):ParserFactory { $options=new ServiceOptions(Parser::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new ParserFactory($options, $services->getMagicWordFactory(), $services->getContentLanguage(), $services->getUrlUtils(), $services->getSpecialPageFactory(), $services->getLinkRendererFactory(), $services->getNamespaceInfo(), LoggerFactory::getInstance( 'Parser'), $services->getBadFileLookup(), $services->getLanguageConverterFactory(), $services->getHookContainer(), $services->getTidy(), $services->getMainWANObjectCache(), $services->getUserOptionsLookup(), $services->getUserFactory(), $services->getTitleFormatter(), $services->getHttpRequestFactory(), $services->getTrackingCategories(), $services->getSignatureValidatorFactory(), $services->getUserNameUtils());}, 'ParserOutputAccess'=> static function(MediaWikiServices $services):ParserOutputAccess { return new ParserOutputAccess($services->getParserCacheFactory(), $services->getRevisionLookup(), $services->getRevisionRenderer(), $services->getStatsdDataFactory(), $services->getDBLoadBalancerFactory(), $services->getChronologyProtector(), LoggerFactory::getProvider(), $services->getWikiPageFactory(), $services->getTitleFormatter());}, 'ParsoidDataAccess'=> static function(MediaWikiServices $services):DataAccess { $mainConfig=$services->getMainConfig();return new MWDataAccess(new ServiceOptions(MWDataAccess::CONSTRUCTOR_OPTIONS, $mainConfig), $services->getRepoGroup(), $services->getBadFileLookup(), $services->getHookContainer(), $services->getContentTransformer(), $services->getReadOnlyMode(), $services->getParserFactory(), $services->getLinkBatchFactory());}, 'ParsoidOutputAccess'=> static function(MediaWikiServices $services):ParsoidOutputAccess { return new ParsoidOutputAccess(new ServiceOptions(ParsoidOutputAccess::CONSTRUCTOR_OPTIONS, $services->getMainConfig(), [ 'ParsoidWikiID'=> WikiMap::getCurrentWikiId()]), $services->getParsoidParserFactory(), $services->getParserOutputAccess(), $services->getPageStore(), $services->getRevisionLookup(), $services->getParsoidSiteConfig(), $services->getContentHandlerFactory());}, 'ParsoidOutputStash'=> static function(MediaWikiServices $services):ParsoidOutputStash { $config=$services->getMainConfig() ->get(MainConfigNames::ParsoidCacheConfig);$backend=$config['StashType'] ? ObjectCache::getInstance( $config['StashType']) :$services->getMainObjectStash();return new SimpleParsoidOutputStash($services->getContentHandlerFactory(), $backend, $config['StashDuration']);}, 'ParsoidPageConfigFactory'=> static function(MediaWikiServices $services):MWPageConfigFactory { return new MWPageConfigFactory($services->getRevisionStore(), $services->getSlotRoleRegistry(), $services->getLanguageFactory());}, 'ParsoidParserFactory'=> static function(MediaWikiServices $services):ParsoidParserFactory { return new ParsoidParserFactory($services->getParsoidSiteConfig(), $services->getParsoidDataAccess(), $services->getParsoidPageConfigFactory(), $services->getLanguageConverterFactory(), $services->getParserFactory(), $services->getGlobalIdGenerator());}, 'ParsoidSiteConfig'=> static function(MediaWikiServices $services):SiteConfig { $mainConfig=$services->getMainConfig();$parsoidSettings=$mainConfig->get(MainConfigNames::ParsoidSettings);return new MWSiteConfig(new ServiceOptions(MWSiteConfig::CONSTRUCTOR_OPTIONS, $mainConfig), $parsoidSettings, $services->getObjectFactory(), $services->getContentLanguage(), $services->getStatsdDataFactory(), $services->getMagicWordFactory(), $services->getNamespaceInfo(), $services->getSpecialPageFactory(), $services->getInterwikiLookup(), $services->getUserOptionsLookup(), $services->getLanguageFactory(), $services->getLanguageConverterFactory(), $services->getLanguageNameUtils(), $services->getUrlUtils(), ExtensionRegistry::getInstance() ->getAttribute( 'ParsoidModules'), $services->getParserFactory(), $mainConfig, ExtensionRegistry::getInstance() ->isLoaded( 'TimedMediaHandler'));}, 'PasswordFactory'=> static function(MediaWikiServices $services):PasswordFactory { $config=$services->getMainConfig();return new PasswordFactory($config->get(MainConfigNames::PasswordConfig), $config->get(MainConfigNames::PasswordDefault));}, 'PasswordReset'=> static function(MediaWikiServices $services):PasswordReset { $options=new ServiceOptions(PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new PasswordReset($options, LoggerFactory::getInstance( 'authentication'), $services->getAuthManager(), $services->getHookContainer(), $services->getDBLoadBalancerFactory(), $services->getUserFactory(), $services->getUserNameUtils(), $services->getUserOptionsLookup());}, 'PerDbNameStatsdDataFactory'=> static function(MediaWikiServices $services):StatsdDataFactoryInterface { $config=$services->getMainConfig();$wiki=$config->get(MainConfigNames::DBname);return new PrefixingStatsdDataFactoryProxy($services->getStatsdDataFactory(), $wiki);}, 'PermissionManager'=> static function(MediaWikiServices $services):PermissionManager { return new PermissionManager(new ServiceOptions(PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getSpecialPageFactory(), $services->getNamespaceInfo(), $services->getGroupPermissionsLookup(), $services->getUserGroupManager(), $services->getBlockErrorFormatter(), $services->getHookContainer(), $services->getUserCache(), $services->getRedirectLookup(), $services->getRestrictionStore(), $services->getTitleFormatter(), $services->getTempUserConfig(), $services->getUserFactory(), $services->getActionFactory());}, 'Pingback'=> static function(MediaWikiServices $services):PingBack { return new Pingback($services->getMainConfig(), $services->getDBLoadBalancerFactory(), ObjectCache::getLocalClusterInstance(), $services->getHttpRequestFactory(), LoggerFactory::getInstance( 'Pingback'));}, 'PoolCounterFactory'=> static function(MediaWikiServices $services):PoolCounterFactory { $mainConfig=$services->getMainConfig();return new PoolCounterFactory($mainConfig->get(MainConfigNames::PoolCounterConf), $mainConfig->get(MainConfigNames::PoolCountClientConf));}, 'PreferencesFactory'=> static function(MediaWikiServices $services):PreferencesFactory { $factory=new DefaultPreferencesFactory(new ServiceOptions(DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguage(), $services->getAuthManager(), $services->getLinkRendererFactory() ->create(), $services->getNamespaceInfo(), $services->getPermissionManager(), $services->getLanguageConverterFactory() ->getLanguageConverter(), $services->getLanguageNameUtils(), $services->getHookContainer(), $services->getUserOptionsManager(), $services->getLanguageConverterFactory(), $services->getParserFactory(), $services->getSkinFactory(), $services->getUserGroupManager(), $services->getSignatureValidatorFactory(), $services->getMainConfig());$factory->setLogger(LoggerFactory::getInstance( 'preferences'));return $factory;}, 'PreloadedContentBuilder'=> static function(MediaWikiServices $services):PreloadedContentBuilder { return new PreloadedContentBuilder($services->getContentHandlerFactory(), $services->getWikiPageFactory(), $services->getRedirectLookup(), $services->getSpecialPageFactory(), $services->getContentTransformer(), $services->getHookContainer(),);}, 'ProxyLookup'=> static function(MediaWikiServices $services):ProxyLookup { $mainConfig=$services->getMainConfig();return new ProxyLookup($mainConfig->get(MainConfigNames::CdnServers), $mainConfig->get(MainConfigNames::CdnServersNoPurge), $services->getHookContainer());}, 'RateLimiter'=> static function(MediaWikiServices $services):RateLimiter { $rateLimiter=new RateLimiter(new ServiceOptions(RateLimiter::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getWRStatsFactory(), $services->getCentralIdLookupFactory() ->getNonLocalLookup(), $services->getUserFactory(), $services->getUserGroupManager(), $services->getHookContainer());$rateLimiter->setStats( $services->getStatsdDataFactory());return $rateLimiter;}, 'ReadOnlyMode'=> static function(MediaWikiServices $services):ReadOnlyMode { return new ReadOnlyMode(new ConfiguredReadOnlyMode($services->getMainConfig() ->get(MainConfigNames::ReadOnly), $services->getMainConfig() ->get(MainConfigNames::ReadOnlyFile)), $services->getDBLoadBalancerFactory());}, 'RedirectLookup'=> static function(MediaWikiServices $services):RedirectLookup { return $services->getRedirectStore();}, 'RedirectStore'=> static function(MediaWikiServices $services):RedirectStore { return new RedirectStore( $services->getWikiPageFactory());}, 'RepoGroup'=> static function(MediaWikiServices $services):RepoGroup { $config=$services->getMainConfig();return new RepoGroup($config->get(MainConfigNames::LocalFileRepo), $config->get(MainConfigNames::ForeignFileRepos), $services->getMainWANObjectCache(), $services->getMimeAnalyzer());}, 'ResourceLoader'=> static function(MediaWikiServices $services):ResourceLoader { $config=$services->getMainConfig();$maxage=$config->get(MainConfigNames::ResourceLoaderMaxage);$rl=new ResourceLoader($config, LoggerFactory::getInstance( 'resourceloader'), $config->get(MainConfigNames::ResourceLoaderUseObjectCacheForDeps) ? new KeyValueDependencyStore( $services->getMainObjectStash()) :new SqlModuleDependencyStore( $services->getDBLoadBalancer()), ['loadScript'=> $config->get(MainConfigNames::LoadScript), 'maxageVersioned'=> $maxage['versioned'] ?? null, 'maxageUnversioned'=> $maxage['unversioned'] ?? null,]);$extRegistry=ExtensionRegistry::getInstance();$modules=$extRegistry->getAttribute( 'ResourceModules')+ $config->get(MainConfigNames::ResourceModules);$moduleSkinStyles=$extRegistry->getAttribute( 'ResourceModuleSkinStyles')+ $config->get(MainConfigNames::ResourceModuleSkinStyles);$rl->setModuleSkinStyles( $moduleSkinStyles);$rl->addSource( $config->get(MainConfigNames::ResourceLoaderSources));$rl->register(include MW_INSTALL_PATH . '/resources/Resources.php');$rl->register( $modules);$hookRunner=new \MediaWiki\ResourceLoader\HookRunner( $services->getHookContainer());$hookRunner->onResourceLoaderRegisterModules( $rl);$msgPosterAttrib=$extRegistry->getAttribute( 'MessagePosterModule');$rl->register( 'mediawiki.messagePoster', ['localBasePath'=> MW_INSTALL_PATH, 'debugRaw'=> false, 'scripts'=> array_merge(["resources/src/mediawiki.messagePoster/factory.js", "resources/src/mediawiki.messagePoster/MessagePoster.js", "resources/src/mediawiki.messagePoster/WikitextMessagePoster.js",], $msgPosterAttrib['scripts'] ??[]), 'dependencies'=> array_merge(['oojs', 'mediawiki.api', 'mediawiki.ForeignApi',], $msgPosterAttrib['dependencies'] ??[]), 'targets'=>[ 'desktop', 'mobile'],]);if( $config->get(MainConfigNames::EnableJavaScriptTest)===true) { $rl->registerTestModules();} return $rl;}, 'RestrictionStore'=> static function(MediaWikiServices $services):RestrictionStore { return new RestrictionStore(new ServiceOptions(RestrictionStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getMainWANObjectCache(), $services->getDBLoadBalancer(), $services->getLinkCache(), $services->getLinksMigration(), $services->getCommentStore(), $services->getHookContainer(), $services->getPageStore());}, 'RevertedTagUpdateManager'=> static function(MediaWikiServices $services):RevertedTagUpdateManager { $editResultCache=new EditResultCache($services->getMainObjectStash(), $services->getDBLoadBalancerFactory(), new ServiceOptions(EditResultCache::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));return new RevertedTagUpdateManager($editResultCache, $services->getJobQueueGroup());}, 'RevisionFactory'=> static function(MediaWikiServices $services):RevisionFactory { return $services->getRevisionStore();}, 'RevisionLookup'=> static function(MediaWikiServices $services):RevisionLookup { return $services->getRevisionStore();}, 'RevisionRenderer'=> static function(MediaWikiServices $services):RevisionRenderer { $renderer=new RevisionRenderer($services->getDBLoadBalancer(), $services->getSlotRoleRegistry(), $services->getContentRenderer());$renderer->setLogger(LoggerFactory::getInstance( 'SaveParse'));return $renderer;}, 'RevisionStore'=> static function(MediaWikiServices $services):RevisionStore { return $services->getRevisionStoreFactory() ->getRevisionStore();}, 'RevisionStoreFactory'=> static function(MediaWikiServices $services):RevisionStoreFactory { return new RevisionStoreFactory($services->getDBLoadBalancerFactory(), $services->getBlobStoreFactory(), $services->getNameTableStoreFactory(), $services->getSlotRoleRegistry(), $services->getMainWANObjectCache(), $services->getLocalServerObjectCache(), $services->getCommentStore(), $services->getActorMigration(), $services->getActorStoreFactory(), LoggerFactory::getInstance( 'RevisionStore'), $services->getContentHandlerFactory(), $services->getPageStoreFactory(), $services->getTitleFactory(), $services->getHookContainer());}, 'RollbackPageFactory'=> static function(MediaWikiServices $services):RollbackPageFactory { return $services->get( '_PageCommandFactory');}, 'RowCommentFormatter'=> static function(MediaWikiServices $services):RowCommentFormatter { return new RowCommentFormatter($services->getCommentParserFactory(), $services->getCommentStore());}, 'SearchEngineConfig'=> static function(MediaWikiServices $services):SearchEngineConfig { return new SearchEngineConfig($services->getMainConfig(), $services->getContentLanguage(), $services->getHookContainer(), ExtensionRegistry::getInstance() ->getAttribute( 'SearchMappings'), $services->getUserOptionsLookup());}, 'SearchEngineFactory'=> static function(MediaWikiServices $services):SearchEngineFactory { return new SearchEngineFactory($services->getSearchEngineConfig(), $services->getHookContainer(), $services->getDBLoadBalancerFactory());}, 'SearchResultThumbnailProvider'=> static function(MediaWikiServices $services):SearchResultThumbnailProvider { return new SearchResultThumbnailProvider($services->getRepoGroup(), $services->getHookContainer());}, 'ShellboxClientFactory'=> static function(MediaWikiServices $services):ShellboxClientFactory { $urls=$services->getMainConfig() ->get(MainConfigNames::ShellboxUrls);return new ShellboxClientFactory($services->getHttpRequestFactory(), $urls, $services->getMainConfig() ->get(MainConfigNames::ShellboxSecretKey));}, 'ShellCommandFactory'=> static function(MediaWikiServices $services):CommandFactory { $config=$services->getMainConfig();$limits=['time'=> $config->get(MainConfigNames::MaxShellTime), 'walltime'=> $config->get(MainConfigNames::MaxShellWallClockTime), 'memory'=> $config->get(MainConfigNames::MaxShellMemory), 'filesize'=> $config->get(MainConfigNames::MaxShellFileSize),];$cgroup=$config->get(MainConfigNames::ShellCgroup);$restrictionMethod=$config->get(MainConfigNames::ShellRestrictionMethod);$factory=new CommandFactory( $services->getShellboxClientFactory(), $limits, $cgroup, $restrictionMethod);$factory->setLogger(LoggerFactory::getInstance( 'exec'));$factory->logStderr();return $factory;}, 'SignatureValidatorFactory'=> static function(MediaWikiServices $services):SignatureValidatorFactory { return new SignatureValidatorFactory(new ServiceOptions(SignatureValidator::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), static function() use( $services) { return $services->getParserFactory();}, static function() use( $services) { return $services->get( '_Parsoid');}, $services->getParsoidPageConfigFactory(), $services->getSpecialPageFactory(), $services->getTitleFactory());}, 'SiteLookup'=> static function(MediaWikiServices $services):SiteLookup { return $services->getSiteStore();}, 'SiteStore'=> static function(MediaWikiServices $services):SiteStore { $rawSiteStore=new DBSiteStore( $services->getDBLoadBalancerFactory());$cache=$services->getLocalServerObjectCache();if( $cache instanceof EmptyBagOStuff) { $cache=ObjectCache::getLocalClusterInstance();} return new CachingSiteStore( $rawSiteStore, $cache);}, 'SkinFactory'=> static function(MediaWikiServices $services):SkinFactory { $factory=new SkinFactory($services->getObjectFactory(),(array) $services->getMainConfig() ->get(MainConfigNames::SkipSkins));$names=$services->getMainConfig() ->get(MainConfigNames::ValidSkinNames);foreach( $names as $name=> $skin) { if(is_array( $skin)) { $spec=$skin;$displayName=$skin['displayname'] ?? $name;$skippable=$skin['skippable'] ?? null;} else { $displayName=$skin;$skippable=null;$spec=['name'=> $name, 'class'=> "Skin$skin"];} $factory->register( $name, $displayName, $spec, $skippable);} $factory->register( 'fallback', 'Fallback', ['class'=> SkinFallback::class, 'args'=>[['name'=> 'fallback', 'styles'=>[ 'mediawiki.skinning.interface'], 'templateDirectory'=> __DIR__ . '/skins/templates/fallback',]]], true);$factory->register( 'apioutput', 'ApiOutput', ['class'=> SkinApi::class, 'args'=>[['name'=> 'apioutput', 'styles'=>[ 'mediawiki.skinning.interface'], 'templateDirectory'=> __DIR__ . '/skins/templates/apioutput',]]], true);return $factory;}, 'SlotRoleRegistry'=> static function(MediaWikiServices $services):SlotRoleRegistry { $registry=new SlotRoleRegistry($services->getSlotRoleStore());$config=$services->getMainConfig();$contentHandlerFactory=$services->getContentHandlerFactory();$hookContainer=$services->getHookContainer();$titleFactory=$services->getTitleFactory();$registry->defineRole(SlotRecord::MAIN, static function() use( $config, $contentHandlerFactory, $hookContainer, $titleFactory) { return new MainSlotRoleHandler($config->get(MainConfigNames::NamespaceContentModels), $contentHandlerFactory, $hookContainer, $titleFactory);});return $registry;}, 'SlotRoleStore'=> static function(MediaWikiServices $services):NameTableStore { return $services->getNameTableStoreFactory() ->getSlotRoles();}, 'SpamChecker'=> static function(MediaWikiServices $services):SpamChecker { return new SpamChecker((array) $services->getMainConfig() ->get(MainConfigNames::SpamRegex),(array) $services->getMainConfig() ->get(MainConfigNames::SummarySpamRegex));}, 'SpecialPageFactory'=> static function(MediaWikiServices $services):SpecialPageFactory { return new SpecialPageFactory(new ServiceOptions(SpecialPageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguage(), $services->getObjectFactory(), $services->getTitleFactory(), $services->getHookContainer());}, 'StatsdDataFactory'=> static function(MediaWikiServices $services):IBufferingStatsdDataFactory { return new BufferingStatsdDataFactory(rtrim( $services->getMainConfig() ->get(MainConfigNames::StatsdMetricPrefix), '.'));}, 'StatsFactory'=> static function(MediaWikiServices $services):StatsFactory { $config=$services->getMainConfig();$format=\Wikimedia\Stats\OutputFormats::getFormatFromString($config->get(MainConfigNames::StatsFormat) ?? 'null');$cache=new StatsCache;$emitter=\Wikimedia\Stats\OutputFormats::getNewEmitter($config->get(MainConfigNames::StatsPrefix) ?? 'MediaWiki', $cache, \Wikimedia\Stats\OutputFormats::getNewFormatter( $format), $config->get(MainConfigNames::StatsTarget));$factory=new StatsFactory( $cache, $emitter, LoggerFactory::getInstance( 'Stats'));return $factory->withStatsdDataFactory( $services->getStatsdDataFactory());}, 'TalkPageNotificationManager'=> static function(MediaWikiServices $services):TalkPageNotificationManager { return new TalkPageNotificationManager(new ServiceOptions(TalkPageNotificationManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getReadOnlyMode(), $services->getRevisionLookup(), $services->getHookContainer(), $services->getUserFactory());}, 'TempFSFileFactory'=> static function(MediaWikiServices $services):TempFSFileFactory { return new TempFSFileFactory( $services->getMainConfig() ->get(MainConfigNames::TmpDirectory));}, 'TempUserConfig'=> static function(MediaWikiServices $services):RealTempUserConfig { return new RealTempUserConfig($services->getMainConfig() ->get(MainConfigNames::AutoCreateTempUser));}, 'TempUserCreator'=> static function(MediaWikiServices $services):TempUserCreator { $accountCreationThrottle=$services->getMainConfig() ->get(MainConfigNames::AccountCreationThrottle);if(!is_array( $accountCreationThrottle)) { $accountCreationThrottle=[['count'=> $accountCreationThrottle, 'seconds'=> 86400,]];} return new TempUserCreator($services->getTempUserConfig(), $services->getObjectFactory(), $services->getUserFactory(), $services->getAuthManager(), new Throttler($accountCreationThrottle, ['type'=> 'acctcreate', 'cache'=> $services->getLocalServerObjectCache()]));}, 'Tidy'=> static function(MediaWikiServices $services):TidyDriverBase { return new RemexDriver(new ServiceOptions(RemexDriver::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'TitleFactory'=> static function(MediaWikiServices $services):TitleFactory { return new TitleFactory();}, 'TitleFormatter'=> static function(MediaWikiServices $services):TitleFormatter { return $services->getService( '_MediaWikiTitleCodec');}, 'TitleMatcher'=> static function(MediaWikiServices $services):TitleMatcher { return new TitleMatcher(new ServiceOptions(TitleMatcher::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguage(), $services->getLanguageConverterFactory(), $services->getHookContainer(), $services->getWikiPageFactory(), $services->getUserNameUtils(), $services->getRepoGroup(), $services->getTitleFactory());}, 'TitleParser'=> static function(MediaWikiServices $services):TitleParser { return $services->getService( '_MediaWikiTitleCodec');}, 'TrackingCategories'=> static function(MediaWikiServices $services):TrackingCategories { return new TrackingCategories(new ServiceOptions(TrackingCategories::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getNamespaceInfo(), $services->getTitleParser(), LoggerFactory::getInstance( 'TrackingCategories'));}, 'UnblockUserFactory'=> static function(MediaWikiServices $services):UnblockUserFactory { return $services->getService( '_UserBlockCommandFactory');}, 'UndeletePageFactory'=> static function(MediaWikiServices $services):UndeletePageFactory { return $services->getService( '_PageCommandFactory');}, 'UploadRevisionImporter'=> static function(MediaWikiServices $services):UploadRevisionImporter { return new ImportableUploadRevisionImporter($services->getMainConfig() ->get(MainConfigNames::EnableUploads), LoggerFactory::getInstance( 'UploadRevisionImporter'));}, 'UrlUtils'=> static function(MediaWikiServices $services):UrlUtils { $config=$services->getMainConfig();return new UrlUtils([UrlUtils::SERVER=> $config->get(MainConfigNames::Server), UrlUtils::CANONICAL_SERVER=> $config->get(MainConfigNames::CanonicalServer), UrlUtils::INTERNAL_SERVER=> $config->get(MainConfigNames::InternalServer), UrlUtils::FALLBACK_PROTOCOL=> RequestContext::getMain() ->getRequest() ->getProtocol(), UrlUtils::HTTPS_PORT=> $config->get(MainConfigNames::HttpsPort), UrlUtils::VALID_PROTOCOLS=> $config->get(MainConfigNames::UrlProtocols),]);}, 'UserCache'=> static function(MediaWikiServices $services):UserCache { return new UserCache(LoggerFactory::getInstance( 'UserCache'), $services->getDBLoadBalancerFactory(), $services->getLinkBatchFactory());}, 'UserEditTracker'=> static function(MediaWikiServices $services):UserEditTracker { return new UserEditTracker($services->getActorMigration(), $services->getDBLoadBalancerFactory(), $services->getJobQueueGroup());}, 'UserFactory'=> static function(MediaWikiServices $services):UserFactory { return new UserFactory(new ServiceOptions(UserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getUserNameUtils());}, 'UserGroupManager'=> static function(MediaWikiServices $services):UserGroupManager { return $services->getUserGroupManagerFactory() ->getUserGroupManager();}, 'UserGroupManagerFactory'=> static function(MediaWikiServices $services):UserGroupManagerFactory { return new UserGroupManagerFactory(new ServiceOptions(UserGroupManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getReadOnlyMode(), $services->getDBLoadBalancerFactory(), $services->getHookContainer(), $services->getUserEditTracker(), $services->getGroupPermissionsLookup(), $services->getJobQueueGroupFactory(), LoggerFactory::getInstance( 'UserGroupManager'), $services->getTempUserConfig(), [static function(UserIdentity $user) use( $services) { if( $user->getWikiId()===UserIdentity::LOCAL) { $services->getPermissionManager() ->invalidateUsersRightsCache( $user);} $services->getUserFactory() ->invalidateCache( $user);}]);}, 'UserIdentityLookup'=> static function(MediaWikiServices $services):UserIdentityLookup { return $services->getActorStoreFactory() ->getUserIdentityLookup();}, 'UserIdentityUtils'=> static function(MediaWikiServices $services):UserIdentityUtils { return new UserIdentityUtils($services->getTempUserConfig());}, 'UserNamePrefixSearch'=> static function(MediaWikiServices $services):UserNamePrefixSearch { return new UserNamePrefixSearch($services->getDBLoadBalancerFactory(), $services->getUserNameUtils());}, 'UserNameUtils'=> static function(MediaWikiServices $services):UserNameUtils { $messageFormatterFactory=new MessageFormatterFactory(Message::FORMAT_PLAIN);return new UserNameUtils(new ServiceOptions(UserNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguage(), LoggerFactory::getInstance( 'UserNameUtils'), $services->getTitleParser(), $messageFormatterFactory->getTextFormatter($services->getContentLanguage() ->getCode()), $services->getHookContainer(), $services->getTempUserConfig());}, 'UserOptionsLookup'=> static function(MediaWikiServices $services):UserOptionsLookup { return $services->getUserOptionsManager();}, 'UserOptionsManager'=> static function(MediaWikiServices $services):UserOptionsManager { return new UserOptionsManager(new ServiceOptions(UserOptionsManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->get( '_DefaultOptionsLookup'), $services->getLanguageConverterFactory(), $services->getDBLoadBalancerFactory(), LoggerFactory::getInstance( 'UserOptionsManager'), $services->getHookContainer(), $services->getUserFactory(), $services->getUserNameUtils());}, 'UserRegistrationLookup'=> static function(MediaWikiServices $services):UserRegistrationLookup { $lookup=new UserRegistrationLookup(new ServiceOptions(UserRegistrationLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getObjectFactory());if(! $lookup->isRegistered(LocalUserRegistrationProvider::TYPE)) { throw new ConfigException( 'UserRegistrationLookup:Local provider is required');} return $lookup;}, 'VirtualRESTServiceClient'=> static function(MediaWikiServices $services):VirtualRESTServiceClient { $config=$services->getMainConfig() ->get(MainConfigNames::VirtualRestConfig);$vrsClient=new VirtualRESTServiceClient($services->getHttpRequestFactory() ->createMultiClient());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'=> static function(MediaWikiServices $services):WatchedItemQueryService { return new WatchedItemQueryService($services->getDBLoadBalancerFactory(), $services->getCommentStore(), $services->getWatchedItemStore(), $services->getHookContainer(), $services->getUserOptionsLookup(), $services->getMainConfig() ->get(MainConfigNames::WatchlistExpiry), $services->getMainConfig() ->get(MainConfigNames::MaxExecutionTimeForExpensiveQueries));}, 'WatchedItemStore'=> static function(MediaWikiServices $services):WatchedItemStore { $store=new WatchedItemStore(new ServiceOptions(WatchedItemStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getJobQueueGroup(), $services->getMainObjectStash(), new HashBagOStuff([ 'maxKeys'=> 100]), $services->getReadOnlyMode(), $services->getNamespaceInfo(), $services->getRevisionLookup(), $services->getLinkBatchFactory());$store->setStatsdDataFactory( $services->getStatsdDataFactory());if( $services->getMainConfig() ->get(MainConfigNames::ReadOnlyWatchedItemStore)) { $store=new NoWriteWatchedItemStore( $store);} return $store;}, 'WatchlistManager'=> static function(MediaWikiServices $services):WatchlistManager { return new WatchlistManager([WatchlistManager::OPTION_ENOTIF=> RecentChange::isEnotifEnabled( $services->getMainConfig()),], $services->getHookContainer(), $services->getReadOnlyMode(), $services->getRevisionLookup(), $services->getTalkPageNotificationManager(), $services->getWatchedItemStore(), $services->getUserFactory(), $services->getNamespaceInfo(), $services->getWikiPageFactory());}, 'WikiExporterFactory'=> static function(MediaWikiServices $services):WikiExporterFactory { return new WikiExporterFactory($services->getHookContainer(), $services->getRevisionStore(), $services->getTitleParser(), $services->getCommentStore());}, 'WikiImporterFactory'=> static function(MediaWikiServices $services):WikiImporterFactory { return new WikiImporterFactory($services->getMainConfig(), $services->getHookContainer(), $services->getContentLanguage(), $services->getNamespaceInfo(), $services->getTitleFactory(), $services->getWikiPageFactory(), $services->getWikiRevisionUploadImporter(), $services->getPermissionManager(), $services->getContentHandlerFactory(), $services->getSlotRoleRegistry());}, 'WikiPageFactory'=> static function(MediaWikiServices $services):WikiPageFactory { return new WikiPageFactory($services->getTitleFactory(), new HookRunner( $services->getHookContainer()), $services->getDBLoadBalancer());}, 'WikiRevisionOldRevisionImporterNoUpdates'=> static function(MediaWikiServices $services):ImportableOldRevisionImporter { return new ImportableOldRevisionImporter(false, LoggerFactory::getInstance( 'OldRevisionImporter'), $services->getDBLoadBalancerFactory(), $services->getRevisionStore(), $services->getSlotRoleRegistry(), $services->getWikiPageFactory(), $services->getPageUpdaterFactory(), $services->getUserFactory());}, 'WRStatsFactory'=> static function(MediaWikiServices $services):WRStatsFactory { return new WRStatsFactory(new BagOStuffStatsStore(ObjectCache::getInstance( $services->getMainConfig() ->get(MainConfigNames::StatsCacheType))));}, '_DefaultOptionsLookup'=> static function(MediaWikiServices $services):DefaultOptionsLookup { return new DefaultOptionsLookup(new ServiceOptions(DefaultOptionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguage(), $services->getHookContainer(), $services->getNamespaceInfo(), defined( 'MW_PHPUNIT_TEST') && $services->isStorageDisabled());}, '_EditConstraintFactory'=> static function(MediaWikiServices $services):EditConstraintFactory { return new EditConstraintFactory(new ServiceOptions(EditConstraintFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), LoggerFactory::getProvider(), $services->getPermissionManager(), $services->getHookContainer(), $services->getReadOnlyMode(), $services->getSpamChecker());}, '_LocalClusterCache'=> static function(MediaWikiServices $services):BagOStuff { $mainConfig=$services->getMainConfig();$id=$mainConfig->get(MainConfigNames::MainCacheType);$params=$mainConfig->get(MainConfigNames::ObjectCaches)[$id] ?? null;if(! $params) { throw new ConfigException("\$wgObjectCaches must have \"$id\" set (via \$wgMainCacheType)");} return ObjectCache::newFromParams( $params, $services);}, '_MediaWikiTitleCodec'=> static function(MediaWikiServices $services):MediaWikiTitleCodec { return new MediaWikiTitleCodec($services->getContentLanguage(), $services->getGenderCache(), $services->getMainConfig() ->get(MainConfigNames::LocalInterwikis), $services->getInterwikiLookup(), $services->getNamespaceInfo());}, '_PageCommandFactory'=> static function(MediaWikiServices $services):PageCommandFactory { return new PageCommandFactory($services->getMainConfig(), $services->getDBLoadBalancerFactory(), $services->getNamespaceInfo(), $services->getWatchedItemStore(), $services->getRepoGroup(), $services->getReadOnlyMode(), $services->getContentHandlerFactory(), $services->getRevisionStore(), $services->getSpamChecker(), $services->getTitleFormatter(), $services->getHookContainer(), $services->getWikiPageFactory(), $services->getUserFactory(), $services->getActorMigration(), $services->getActorNormalization(), $services->getTitleFactory(), $services->getUserEditTracker(), $services->getCollationFactory(), $services->getJobQueueGroup(), $services->getCommentStore(), $services->getMainObjectStash(), WikiMap::getCurrentWikiDbDomain() ->getId(), WebRequest::getRequestId(), $services->getBacklinkCacheFactory(), LoggerFactory::getInstance( 'UndeletePage'), $services->getPageUpdaterFactory(), $services->getMessageFormatterFactory() ->getTextFormatter($services->getContentLanguage() ->getCode()), $services->getArchivedRevisionLookup(), $services->getRestrictionStore(), $services->getLinkTargetLookup());}, '_ParserObserver'=> static function(MediaWikiServices $services):ParserObserver { return new ParserObserver(LoggerFactory::getInstance( 'DuplicateParse'));}, '_Parsoid'=> static function(MediaWikiServices $services):Parsoid { return new Parsoid($services->getParsoidSiteConfig(), $services->getParsoidDataAccess());}, '_SettingsBuilder'=> static function(MediaWikiServices $services):SettingsBuilder { return SettingsBuilder::getInstance();}, '_SqlBlobStore'=> static function(MediaWikiServices $services):SqlBlobStore { return $services->getBlobStoreFactory() ->newSqlBlobStore();}, '_UserBlockCommandFactory'=> static function(MediaWikiServices $services):UserBlockCommandFactory { return new UserBlockCommandFactory(new ServiceOptions(UserBlockCommandFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer(), $services->getBlockPermissionCheckerFactory(), $services->getBlockUtils(), $services->getDatabaseBlockStore(), $services->getBlockRestrictionStore(), $services->getUserFactory(), $services->getUserEditTracker(), LoggerFactory::getInstance( 'BlockManager'), $services->getTitleFactory(), $services->getTempUserConfig(), $services->getBlockActionInfo());},]
@phpcs-require-sorted-array
Class for fetching backlink lists, approximate backlink counts and partitions.
Class representing a cache/ephemeral data store.
Definition BagOStuff.php:85
get( $key, $flags=0)
Get an item.
MediaWiki adaption of StatsdDataFactory that provides buffering and metric prefixing.
Hold a configured list of sites (SiteList), with a caching layer.
Holds a list of sites stored in the database.
Support for detecting/validating DjVu image files and getting some basic file metadata (resolution et...
Definition DjVuImage.php:41
A BagOStuff object with no objects in it.
Load JSON files, and uses a Processor to extract information.
This is the main interface for fetching or inserting objects with ExternalStore.
Class to handle file backend registration.
Look up "gender" user preference.
Simple store for keeping values in an associative array for the current process.
Hooks class.
Definition Hooks.php:38
Class to invalidate the CDN and HTMLFileCache entries associated with URLs/titles.
Handle enqueueing of background jobs.
Job queue runner utility methods.
Definition JobRunner.php:42
Methods for dealing with language codes.
Base class for language-specific code.
Definition Language.php:63
Cache for article titles (prefixed DB keys) and ids linked from one source.
Definition LinkCache.php:45
Caching for the contents of localisation files.
static getStoreFromConf(array $conf, $fallbackCacheDir)
Return a suitable LCStore as specified by the given configuration.
MediaWiki-specific class for generating database load balancers.
Class to construct MediaHandler objects.
This serves as the entry point to the authentication system.
setLogger(LoggerInterface $logger)
Defines the actions that can be blocked by a partial block.
A service class for getting formatted information about a block.
A service class for checking blocks.
Backend class for blocking utils.
A DatabaseBlock (unlike a SystemBlock) is stored in the database, may give rise to autoblocks and may...
This class performs some operations related to tracking categories, such as adding a tracking categor...
Gateway class for change_tags table.
Common factory to construct collation classes.
This is the main service interface for converting single-line comments from various DB comment fields...
This is basically a CommentFormatter with a CommentStore dependency, allowing it to retrieve comment ...
Handle database storage of comments such as edit summaries and log reasons.
Exceptions for config failures.
Factory class to create Config objects.
Object which holds currently registered configuration options.
A class for passing options to services.
Constraints reflect possible errors that need to be checked.
Provides the intro messages (edit notices and others) to be displayed before an edit form.
Provides the initial content of the edit box displayed in an edit form when creating a new page or a ...
Service to check if text (either content or a summary) qualifies as spam.
Factory service for WikiExporter instances.
This class provides an implementation of the core hook interfaces, forwarding hook calls to HookConta...
This is a simple immutable HookRegistry which can be used to set up a local HookContainer in tests an...
Factory creating MWHttpRequest objects.
Service for handling telemetry data.
Definition Telemetry.php:29
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:47
InterwikiLookup backed by the interwiki database table or $wgInterwikiCache.
Class to construct JobQueueGroups.
An interface for creating language converters.
Internationalisation code See https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation for more...
A service that provides utilities to do with language names and codes.
Factory to create LinkRender objects.
Class that generates HTML for internal links.
Service for retrieving and storing link targets.
Service for compat reading of links tables.
Create PSR-3 logger objects.
Factory for EmailUser objects.
Command for sending emails to users.
Definition EmailUser.php:47
A class containing constants representing the names of configuration variables.
Service locator for MediaWiki core services.
The MediaWiki-specific implementation of IMessageFormatterFactory.
Implementation of various page action services.
Gives access to properties of a page.
Definition PageProps.php:35
Service for getting rendered output of a given page.
Service for storing and retrieving page redirect information.
Service for creating WikiPage objects.
A factory that stores information about MagicWords, and creates them on demand with caching.
Implement Parsoid's abstract class for data access.
Helper class used by MediaWiki to create Parsoid PageConfig objects.
Site-level configuration for Parsoid.
MediaWiki service for getting Parsoid Output objects.
Users can authorize applications to use their account via OAuth.
This separate service is needed because the ::getGrantsLink method requires a LinkRenderer and if we ...
A service class for checking permissions To obtain an instance, use MediaWikiServices::getInstance()-...
Provides rate limiting for a set of actions based on several counter buckets.
setStats(StatsdDataFactoryInterface $stats)
This is the default implementation of PreferencesFactory.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form stripping il...
This class generates message blobs for use by ResourceLoader.
ResourceLoader is a loading system for JavaScript and CSS resources.
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.
Value object representing a content slot associated with a page revision.
A registry service for SlotRoleHandlers, used to define which slot roles are available on which page.
defineRole( $role, callable $instantiator)
Defines a slot role.
Service implementation of near match title search.
Builder class for constructing a Config object from a set of sources during bootstrap.
Factory facilitating dependency injection for Command.
This is a service which provides a configured client to access a remote Shellbox installation.
Factory for handling the special page list and generating SpecialPage objects.
Service for instantiating BlobStores.
Class allowing easy storage and retrieval of EditResults associated with revisions.
Manage the pre-emptive page parsing for edits to wiki pages.
A factory for PageUpdater and DerivedPageDataUpdater instances.
Class for managing delayed RevertedTagUpdateJob waiting for user approval.
Service for storing and loading Content objects representing revision data blobs.
Base class for HTML cleanup utilities.
A codec for MediaWiki page titles.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
Creates Title objects.
This is not intended to be a long-term part of MediaWiki; it will be deprecated and removed once acto...
The CentralIdLookup service allows for connecting local users with cluster-wide IDs.
A service class to control default user options.
Helper class for the password reset functionality shared by the web UI and the API.
The real TempUserConfig including internal methods used by TempUserCreator.
Service for temporary user creation.
Track info about user edit counts and timings.
Creates User objects.
Factory service for UserGroupManager instances.
Convenience functions for interpreting UserIdentity objects using additional services or config.
Handles searching prefixes of user names.
UserNameUtils service.
Provides access to user options.
A service class to control user options.
A service to expand, parse, and otherwise manipulate URLs.
Definition UrlUtils.php:17
Tools for dealing with other locally-hosted wikis.
Definition WikiMap.php:31
Cache messages that are defined by MediaWiki-namespace pages or by hooks.
The Message class deals with fetching and processing of interface message into a variety of formats.
Definition Message.php:144
Functions to get cache objects.
static isDatabaseId( $id)
Determine whether a config ID would access the database.
static newFromParams(array $params, MediaWikiServices $services=null)
Create a new cache object from parameters.
static getInstance( $id)
Get a cached instance of the specified type of cache object.
static getLocalClusterInstance()
Get the main cluster-local cache object.
Cache for ParserOutput objects corresponding to the latest page revisions.
PHP Parser - Processes wiki markup (which uses a more user-friendly syntax, such as "[[link]]" for ma...
Definition Parser.php:115
Factory class for creating and checking Password objects.
Proxy to prefix metric keys sent to a StatsdDataFactoryInterface.
Utility class for creating new RC entries.
Prioritized list of file repositories.
Definition RepoGroup.php:30
Group all the pieces relevant to the context of a request into one instance.
static getMain()
Get the RequestContext object associated with the main request.
Configuration handling class for SearchEngine.
Factory class for SearchEngine.
Factory class to create Skin objects.
register( $name, $displayName, $spec, bool $skippable=null)
Register a new skin.
Virtual HTTP service client loosely styled after a Virtual File System.
Multi-datacenter aware caching interface.
get( $key, &$curTTL=null, array $checkKeys=[], &$info=[])
Fetch the value of a key from cache.
static newEmpty()
Get an instance that wraps EmptyBagOStuff.
Storage layer class for WatchedItems.
setStatsdDataFactory(StatsdDataFactoryInterface $stats)
Factory service for WikiImporter instances.
Track per-module file dependencies in object cache via BagOStuff.
Track per-module file dependencies in the core module_deps table.
Factory class for spawning EventRelayer objects using configuration.
Provide a given client with protection against visible database lag.
Determine whether a site is statically configured as read-only.
Constructs Database objects.
Determine whether a site is currently in read-only mode.
Singleton cache for Metric instances.
StatsFactory Implementation.
Class for getting statistically unique IDs without a central coordinator.
An adaptor allowing WRStats to store data in MediaWiki's BagOStuff.
A factory for WRStats readers and writers.
MediaWiki adaptation of StatsdDataFactory that provides buffering functionality.
Interface for configuration instances.
Definition Config.php:32
Marker interface for entities aware of the wiki they belong to.
Stash for Parsoid output and associated data as needed to perform selective serialization (aka "selse...
Service interface for looking up Interwiki records.
Interface for sending emails.
Definition IEmailer.php:32
Service for changing the content model of wiki pages.
Service for page delete actions.
Service for mergehistory actions.
Service for page rename actions.
Service for resolving a wiki page redirect.
Service for page rollback actions.
Service for page undelete actions.
A PreferencesFactory is a MediaWiki service that provides the definitions of preferences for a given ...
Service for constructing RevisionRecord objects.
Service for looking up page revisions.
Represents a config schema.
Service for loading and storing data blobs.
Definition BlobStore.php:33
A title formatter service for MediaWiki.
A title parser service for MediaWiki.
Service for dealing with the actor table.
Interface for objects representing user identity.
Interface to retrieve Site objects, for implementation by service classes.
Interface for storing and retrieving Site objects.
Definition SiteStore.php:30
A simple factory providing a message formatter for a given language code.
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:92
$mime
Definition router.php:60
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