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