MediaWiki master
ServiceWiring.php
Go to the documentation of this file.
1<?php
30use GuzzleHttp\Client;
31use GuzzleHttp\Psr7\HttpFactory;
32use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
319use Psr\Http\Client\ClientInterface;
324use Wikimedia\Mime\MimeAnalyzer;
329use Wikimedia\ObjectFactory\ObjectFactory;
330use Wikimedia\Parsoid\Config\DataAccess;
331use Wikimedia\Parsoid\Parsoid;
337use Wikimedia\RequestTimeout\CriticalSectionProvider;
338use Wikimedia\RequestTimeout\RequestTimeout;
357
358// PHP unit does not understand code coverage for this file
359// as the @covers annotation cannot cover a specific file
360// This is tested in MediaWikiServicesTest::testGetService
361// @codeCoverageIgnoreStart
362
364return [
366 // NOTE: When adding a service here, don't forget to add a getter function
367 // in the MediaWikiServices class. The convenience getter should just call
368 // $this->getService( 'FooBarService' ).
370
371 'ActionFactory' => static function ( MediaWikiServices $services ): ActionFactory {
373 $services->getMainConfig()->get( MainConfigNames::Actions ),
374 LoggerFactory::getInstance( 'ActionFactory' ),
375 $services->getObjectFactory(),
376 $services->getHookContainer(),
377 $services->getContentHandlerFactory()
378 );
379 },
380
381 'ActorMigration' => static function ( MediaWikiServices $services ): ActorMigration {
383 $services->getActorStoreFactory()
384 );
385 },
386
387 'ActorNormalization' => static function ( MediaWikiServices $services ): ActorNormalization {
388 return $services->getActorStoreFactory()->getActorNormalization();
389 },
390
391 'ActorStore' => static function ( MediaWikiServices $services ): ActorStore {
392 return $services->getActorStoreFactory()->getActorStore();
393 },
394
395 'ActorStoreFactory' => static function ( MediaWikiServices $services ): ActorStoreFactory {
397 new ServiceOptions( ActorStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
398 $services->getDBLoadBalancerFactory(),
399 $services->getUserNameUtils(),
400 $services->getTempUserConfig(),
401 LoggerFactory::getInstance( 'ActorStore' ),
402 $services->getHideUserUtils()
403 );
404 },
405
406 'ArchivedRevisionLookup' => static function ( MediaWikiServices $services ): ArchivedRevisionLookup {
408 $services->getConnectionProvider(),
409 $services->getRevisionStore()
410 );
411 },
412
413 'AuthManager' => static function ( MediaWikiServices $services ): AuthManager {
414 $authManager = new AuthManager(
415 RequestContext::getMain()->getRequest(),
416 $services->getMainConfig(),
417 $services->getChangeTagsStore(),
418 $services->getObjectFactory(),
419 $services->getObjectCacheFactory(),
420 $services->getHookContainer(),
421 $services->getReadOnlyMode(),
422 $services->getUserNameUtils(),
423 $services->getBlockManager(),
424 $services->getWatchlistManager(),
425 $services->getDBLoadBalancer(),
426 $services->getContentLanguage(),
427 $services->getLanguageConverterFactory(),
428 $services->getBotPasswordStore(),
429 $services->getUserFactory(),
430 $services->getUserIdentityLookup(),
431 $services->getUserIdentityUtils(),
432 $services->getUserOptionsManager(),
433 $services->getNotificationService(),
434 $services->getSessionManager()
435 );
436 $authManager->setLogger( LoggerFactory::getInstance( 'authentication' ) );
437 $authManager->setAuthEventsLogger( LoggerFactory::getInstance( 'authevents' ) );
438 return $authManager;
439 },
440
441 'AutoblockExemptionList' => static function ( MediaWikiServices $services ): AutoblockExemptionList {
442 $messageFormatterFactory = new MessageFormatterFactory( Message::FORMAT_PLAIN );
443 return new AutoblockExemptionList(
444 new ServiceOptions(
445 AutoblockExemptionList::CONSTRUCTOR_OPTIONS,
446 $services->getMainConfig(),
447 ),
448 LoggerFactory::getInstance( 'AutoblockExemptionList' ),
449 $messageFormatterFactory->getTextFormatter(
450 $services->getContentLanguageCode()->toString()
451 )
452 );
453 },
454
455 'BacklinkCacheFactory' => static function ( MediaWikiServices $services ): BacklinkCacheFactory {
457 new ServiceOptions(
458 BacklinkCache::CONSTRUCTOR_OPTIONS,
459 $services->getMainConfig()
460 ),
461 $services->getLinksMigration(),
462 $services->getMainWANObjectCache(),
463 $services->getHookContainer(),
464 $services->getConnectionProvider(),
465 $services->getRestrictionStore(),
466 LoggerFactory::getInstance( 'BacklinkCache' )
467 );
468 },
469
470 'BadFileLookup' => static function ( MediaWikiServices $services ): BadFileLookup {
472 static function () {
473 return wfMessage( 'bad_image_list' )->inContentLanguage()->plain();
474 },
475 $services->getLocalServerObjectCache(),
476 $services->getRepoGroup(),
477 $services->getTitleParser(),
478 $services->getHookContainer()
479 );
480 },
481
482 'BlobStore' => static function ( MediaWikiServices $services ): BlobStore {
483 return $services->getService( '_SqlBlobStore' );
484 },
485
486 'BlobStoreFactory' => static function ( MediaWikiServices $services ): BlobStoreFactory {
488 $services->getDBLoadBalancerFactory(),
489 $services->getExternalStoreAccess(),
490 $services->getMainWANObjectCache(),
491 new ServiceOptions( BlobStoreFactory::CONSTRUCTOR_OPTIONS,
492 $services->getMainConfig() )
493 );
494 },
495
496 'BlockActionInfo' => static function ( MediaWikiServices $services ): BlockActionInfo {
497 return new BlockActionInfo( $services->getHookContainer() );
498 },
499
500 'BlockErrorFormatter' => static function ( MediaWikiServices $services ): BlockErrorFormatter {
501 return $services->getFormatterFactory()->getBlockErrorFormatter(
502 new LazyLocalizationContext( RequestContext::getMain( ... ) )
503 );
504 },
505
506 'BlockManager' => static function ( MediaWikiServices $services ): BlockManager {
508 new ServiceOptions(
509 BlockManager::CONSTRUCTOR_OPTIONS,
510 $services->getMainConfig()
511 ),
512 $services->getUserFactory(),
513 $services->getUserIdentityUtils(),
514 LoggerFactory::getInstance( 'BlockManager' ),
515 $services->getHookContainer(),
516 $services->getDatabaseBlockStore(),
517 $services->getBlockTargetFactory(),
518 $services->getProxyLookup()
519 );
520 },
521
522 'BlockPermissionCheckerFactory' => static function (
523 MediaWikiServices $services
526 new ServiceOptions(
527 BlockPermissionCheckerFactory::CONSTRUCTOR_OPTIONS,
528 $services->getMainConfig()
529 ),
530 $services->getBlockTargetFactory()
531 );
532 },
533
534 'BlockRestrictionStore' => static function ( MediaWikiServices $services ): BlockRestrictionStore {
535 return $services->getBlockRestrictionStoreFactory()->getBlockRestrictionStore( WikiAwareEntity::LOCAL );
536 },
537
538 'BlockRestrictionStoreFactory' => static function ( MediaWikiServices $services ): BlockRestrictionStoreFactory {
540 $services->getDBLoadBalancerFactory()
541 );
542 },
543
544 'BlockTargetFactory' => static function ( MediaWikiServices $services ): BlockTargetFactory {
545 return $services->getCrossWikiBlockTargetFactory()->getFactory();
546 },
547
548 'BlockUserFactory' => static function ( MediaWikiServices $services ): BlockUserFactory {
549 return $services->getService( '_UserBlockCommandFactory' );
550 },
551
552 'BlockUtils' => static function ( MediaWikiServices $services ): BlockUtils {
553 return $services->getBlockUtilsFactory()->getBlockUtils();
554 },
555
556 'BlockUtilsFactory' => static function ( MediaWikiServices $services ): BlockUtilsFactory {
558 $services->getCrossWikiBlockTargetFactory()
559 );
560 },
561
562 'BotPasswordStore' => static function ( MediaWikiServices $services ): BotPasswordStore {
564 new ServiceOptions(
565 BotPasswordStore::CONSTRUCTOR_OPTIONS,
566 $services->getMainConfig()
567 ),
568 $services->getCentralIdLookup(),
569 $services->getDBLoadBalancerFactory()
570 );
571 },
572
573 'CentralIdLookup' => static function ( MediaWikiServices $services ): CentralIdLookup {
574 return $services->getCentralIdLookupFactory()->getLookup();
575 },
576
577 'CentralIdLookupFactory' => static function ( MediaWikiServices $services ): CentralIdLookupFactory {
579 new ServiceOptions( CentralIdLookupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
580 $services->getObjectFactory(),
581 $services->getUserIdentityLookup(),
582 $services->getUserFactory()
583 );
584 },
585
586 'ChangesListQueryFactory' => static function ( MediaWikiServices $services ): ChangesListQueryFactory {
588 new ServiceOptions( ChangesListQueryFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
589 $services->getRecentChangeLookup(),
590 $services->getWatchedItemStore(),
591 $services->getTempUserConfig(),
592 $services->getUserFactory(),
593 $services->getLinkTargetLookup(),
594 $services->getChangeTagsStore(),
595 $services->getStatsFactory(),
596 $services->getSlotRoleStore(),
597 LoggerFactory::getInstance( 'ChangesListQuery' ),
598 $services->getConnectionProvider(),
599 );
600 },
601
602 'ChangeTagDefStore' => static function ( MediaWikiServices $services ): NameTableStore {
603 return $services->getNameTableStoreFactory()->getChangeTagDef();
604 },
605
606 'ChangeTagsFormatter' => static function ( MediaWikiServices $services ): ChangeTagsFormatter {
608 new ServiceOptions( ChangeTagsFormatter::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
609 $services->getChangeTagsStore(),
610 $services->getMainWANObjectCache(),
611 $services->getLanguageFactory(),
612 );
613 },
614
615 'ChangeTagsStore' => static function ( MediaWikiServices $services ): ChangeTagsStore {
616 return $services->getChangeTagsStoreFactory()->getChangeTagsStore();
617 },
618
619 'ChangeTagsStoreFactory' => static function ( MediaWikiServices $services ): ChangeTagsStoreFactory {
621 $services->getConnectionProvider(),
622 $services->getNameTableStoreFactory(),
623 $services->getMainWANObjectCache(),
624 $services->getHookContainer(),
625 LoggerFactory::getInstance( 'ChangeTags' ),
626 $services->getUserFactory(),
627 new ServiceOptions(
628 ChangeTagsStore::CONSTRUCTOR_OPTIONS,
629 $services->getMainConfig()
630 )
631 );
632 },
633
634 'ChangeToolsFactory' => static function ( MediaWikiServices $services ): ChangeToolsFactory {
636 new HookRunner( $services->getHookContainer() ),
637 $services->getLinkRenderer(),
638 );
639 },
640
641 'ChronologyProtector' => static function ( MediaWikiServices $services ): ChronologyProtector {
642 $mainConfig = $services->getMainConfig();
643 $microStashIsDatabase = $services->getObjectCacheFactory()->isDatabaseId(
644 $mainConfig->get( MainConfigNames::MicroStashType )
645 );
646 $cpStash = $microStashIsDatabase
647 ? new EmptyBagOStuff()
648 : $services->getMicroStash();
649
650 $chronologyProtector = new ChronologyProtector(
651 $cpStash,
652 $mainConfig->get( MainConfigNames::ChronologyProtectorSecret ),
653 MW_ENTRY_POINT === 'cli',
654 LoggerFactory::getInstance( 'rdbms' )
655 );
656
657 // Use the global WebRequest singleton. The main reason for using this
658 // is to call WebRequest::getIP() which is non-trivial to reproduce statically
659 // because it needs $wgUsePrivateIPs, as well as ProxyLookup and HookRunner services.
660 // TODO: Create a static version of WebRequest::getIP that accepts these three
661 // as dependencies, and then call that here. The other uses of $req below can
662 // trivially use $_COOKIES, $_GET and $_SERVER instead.
663 $req = RequestContext::getMain()->getRequest();
664
665 // Set user IP/agent information for agent session consistency purposes
666 $reqStart = (int)( $_SERVER['REQUEST_TIME_FLOAT'] ?? time() );
667 $cpPosInfo = ChronologyProtector::getCPInfoFromCookieValue(
668 // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
669 $req->getCookie( 'cpPosIndex', '' ),
670 // Mitigate broken client-side cookie expiration handling (T190082)
671 $reqStart - ChronologyProtector::POSITION_COOKIE_TTL
672 );
673 $chronologyProtector->setRequestInfo( [
674 'IPAddress' => $req->getIP(),
675 'UserAgent' => $req->getHeader( 'User-Agent' ),
676 'ChronologyPositionIndex' => $req->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
677 'ChronologyClientId' => $cpPosInfo['clientId'] ?? null,
678 ] );
679 return $chronologyProtector;
680 },
681
682 'CodeHighlighter' => static function ( MediaWikiServices $services ): CodeHighlighter {
684 $services->getObjectFactory(),
685 ExtensionRegistry::getInstance()->getAttribute( 'CodeHighlightProviders' ),
686 );
687 },
688
689 'CollationFactory' => static function ( MediaWikiServices $services ): CollationFactory {
691 new ServiceOptions(
692 CollationFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
693 $services->getObjectFactory(),
694 $services->getHookContainer()
695 );
696 },
697
698 'CommentFormatter' => static function ( MediaWikiServices $services ): CommentFormatter {
700 $services->getCommentParserFactory()
701 );
702 },
703
704 'CommentParserFactory' => static function ( MediaWikiServices $services ): CommentParserFactory {
706 $services->getLinkRendererFactory()->create( [ 'renderForComment' => true ] ),
707 $services->getLinkBatchFactory(),
708 $services->getLinkCache(),
709 $services->getRepoGroup(),
710 $services->getContentLanguage(),
711 $services->getTitleParser(),
712 $services->getNamespaceInfo(),
713 $services->getHookContainer()
714 );
715 },
716
717 'CommentStore' => static function ( MediaWikiServices $services ): CommentStore {
718 return new CommentStore( $services->getContentLanguage() );
719 },
720
721 'ConfigFactory' => static function ( MediaWikiServices $services ): ConfigFactory {
722 // Use the bootstrap config to initialize the ConfigFactory.
723 $registry = $services->getBootstrapConfig()->get( MainConfigNames::ConfigRegistry );
724 $factory = new ConfigFactory();
725
726 foreach ( $registry as $name => $callback ) {
727 $factory->register( $name, $callback );
728 }
729 return $factory;
730 },
731
732 'ConfigRepository' => static function ( MediaWikiServices $services ): ConfigRepository {
733 return new ConfigRepository( $services->getConfigFactory() );
734 },
735
736 'ConfigSchema' => static function ( MediaWikiServices $services ): ConfigSchema {
738 $settings = $services->get( '_SettingsBuilder' );
739 return $settings->getConfigSchema();
740 },
741
742 'ConfiguredReadOnlyMode' => static function ( MediaWikiServices $services ): ConfiguredReadOnlyMode {
743 $config = $services->getMainConfig();
744 return new ConfiguredReadOnlyMode(
745 $config->get( MainConfigNames::ReadOnly ),
746 $config->get( MainConfigNames::ReadOnlyFile )
747 );
748 },
749
750 'ConfirmEmailBuilderFactory' => static function ( MediaWikiServices $services ): ConfirmEmailBuilderFactory {
752 $services->getLocalServerObjectCache(),
753 $services->getUrlUtils()
754 );
755 },
756
757 'ConfirmEmailSender' => static function ( MediaWikiServices $services ): ConfirmEmailSender {
759 new ServiceOptions(
760 ConfirmEmailSender::CONSTRUCTOR_OPTIONS,
761 $services->getMainConfig()
762 ),
763 new HookRunner( $services->getHookContainer() ),
764 $services->getUserFactory(),
765 $services->getEmailer(),
766 $services->getConfirmEmailBuilderFactory(),
767 LoggerFactory::getInstance( 'confirmemail' )
768 );
769 },
770
771 'ConnectionProvider' => static function ( MediaWikiServices $services ): IConnectionProvider {
772 return $services->getDBLoadBalancerFactory();
773 },
774
775 'ContentHandlerFactory' => static function ( MediaWikiServices $services ): IContentHandlerFactory {
776 $contentHandlerConfig = $services->getMainConfig()->get( MainConfigNames::ContentHandlers );
777
778 return new ContentHandlerFactory(
779 $contentHandlerConfig,
780 $services->getObjectFactory(),
781 $services->getHookContainer(),
782 LoggerFactory::getInstance( 'ContentHandler' )
783 );
784 },
785
786 'ContentJsonCodec' => static function ( MediaWikiServices $services ): ContentJsonCodec {
788 $services->getContentHandlerFactory(),
789 );
790 },
791
792 'ContentLanguage' => static function ( MediaWikiServices $services ): Language {
793 return $services->getLanguageFactory()->getLanguage(
794 $services->getMainConfig()->get( MainConfigNames::LanguageCode ) );
795 },
796
797 'ContentLanguageCode' => static function ( MediaWikiServices $services ): LanguageCode {
798 return $services->getLanguageFactory()->getLanguageCode(
799 $services->getMainConfig()->get( MainConfigNames::LanguageCode ) );
800 },
801
802 'ContentModelChangeFactory' => static function ( MediaWikiServices $services ): ContentModelChangeFactory {
803 return $services->getService( '_PageCommandFactory' );
804 },
805
806 'ContentModelStore' => static function ( MediaWikiServices $services ): NameTableStore {
807 return $services->getNameTableStoreFactory()->getContentModels();
808 },
809
810 'ContentRenderer' => static function ( MediaWikiServices $services ): ContentRenderer {
812 $services->getContentHandlerFactory(),
813 $services->getGlobalIdGenerator()
814 );
815 },
816
817 'ContentTransformer' => static function ( MediaWikiServices $services ): ContentTransformer {
818 return new ContentTransformer( $services->getContentHandlerFactory() );
819 },
820
821 'CriticalSectionProvider' => static function ( MediaWikiServices $services ): CriticalSectionProvider {
822 $config = $services->getMainConfig();
823 $limit = MW_ENTRY_POINT === 'cli' ? INF : $config->get( MainConfigNames::CriticalSectionTimeLimit );
824 return RequestTimeout::singleton()->createCriticalSectionProvider( $limit );
825 },
826
827 'CrossWikiBlockTargetFactory' => static function ( MediaWikiServices $services ): CrossWikiBlockTargetFactory {
829 new ServiceOptions( CrossWikiBlockTargetFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
830 $services->getActorStoreFactory(),
831 $services->getUserNameUtils()
832 );
833 },
834
835 'DatabaseBlockStore' => static function ( MediaWikiServices $services ): DatabaseBlockStore {
836 return $services->getDatabaseBlockStoreFactory()->getDatabaseBlockStore( DatabaseBlock::LOCAL );
837 },
838
839 'DatabaseBlockStoreFactory' => static function ( MediaWikiServices $services ): DatabaseBlockStoreFactory {
841 new ServiceOptions(
842 DatabaseBlockStoreFactory::CONSTRUCTOR_OPTIONS,
843 $services->getMainConfig()
844 ),
845 LoggerFactory::getInstance( 'DatabaseBlockStore' ),
846 $services->getActorStoreFactory(),
847 $services->getBlockRestrictionStoreFactory(),
848 $services->getCommentStore(),
849 $services->getHookContainer(),
850 $services->getDBLoadBalancerFactory(),
851 $services->getReadOnlyMode(),
852 $services->getUserFactory(),
853 $services->getTempUserConfig(),
854 $services->getCrossWikiBlockTargetFactory(),
855 $services->getAutoblockExemptionList(),
856 $services->getSessionManager()
857 );
858 },
859
860 'DatabaseFactory' => static function ( MediaWikiServices $services ): DatabaseFactory {
862 [
863 'debugSql' => $services->getMainConfig()->get( MainConfigNames::DebugDumpSql ),
864 'tracer' => $services->getTracer(),
865 ]
866 );
867 },
868
869 'DateFormatterFactory' => static function ( MediaWikiServices $services ): DateFormatterFactory {
871 },
872
873 'DBLoadBalancer' => static function ( MediaWikiServices $services ): Wikimedia\Rdbms\ILoadBalancer {
874 // just return the default LB from the DBLoadBalancerFactory service
875 return $services->getDBLoadBalancerFactory()->getMainLB();
876 },
877
878 'DBLoadBalancerFactory' => static function ( MediaWikiServices $services ): Wikimedia\Rdbms\LBFactory {
879 $lbConf = $services->getDBLoadBalancerFactoryConfig()->getConfig();
880
881 $mainConfig = $services->getMainConfig();
882 if ( $services->getObjectCacheFactory()->isDatabaseId(
883 $mainConfig->get( MainConfigNames::MainCacheType )
884 ) ) {
885 $wanCache = WANObjectCache::newEmpty();
886 } else {
887 $wanCache = $services->getMainWANObjectCache();
888 }
889 $srvCache = $services->getLocalServerObjectCache();
890 if ( $srvCache instanceof EmptyBagOStuff ) {
891 // Use process cache if no APCU or other local-server cache (e.g. on CLI)
892 $srvCache = new HashBagOStuff( [ 'maxKeys' => 100 ] );
893 }
894
895 $lbFactoryConfigBuilder = new MWLBFactory(
897 $mainConfig->get( MainConfigNames::ReadOnly ),
898 $mainConfig->get( MainConfigNames::ReadOnlyFile )
899 ),
900 $services->getChronologyProtector(),
901 $srvCache,
902 $wanCache,
903 $services->getCriticalSectionProvider(),
904 $services->getStatsFactory(),
905 $services->getTracer(),
906 RequestContext::getMain()->getRequest()->getIP()
907 );
908 $lbConf = $lbFactoryConfigBuilder->applyServices( $lbConf );
909
910 $class = $lbFactoryConfigBuilder->getLBFactoryClass( $lbConf );
911 $instance = new $class( $lbConf );
912
913 $lbFactoryConfigBuilder->setDomainAliases( $instance );
914
915 return $instance;
916 },
917
918 'DBLoadBalancerFactoryConfig' => static function ( MediaWikiServices $services ): MWLBConfig {
919 return new MWLBConfig(
920 new ServiceOptions( MWLBConfig::APPLY_DEFAULT_CONFIG_OPTIONS, $services->getMainConfig() ),
921 ExtensionRegistry::getInstance()->getAttribute( 'DatabaseVirtualDomains' ),
922 $services->getMainConfig()->get( MainConfigNames::LBFactoryConf )
923 );
924 },
925
926 'DefaultOutputPipeline' => static function ( MediaWikiServices $services ): OutputTransformPipeline {
927 return $services->getDefaultOutputPipelineFactory()
928 ->buildDefaultOutputPipeline();
929 },
930
931 'DefaultOutputPipelineFactory' => static function ( MediaWikiServices $services ): DefaultOutputPipelineFactory {
933 new ServiceOptions(
934 DefaultOutputPipelineFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
935 ),
936 $services->getMainConfig(),
937 LoggerFactory::getInstance( 'Parser' ),
938 $services->getObjectFactory()
939 );
940 },
941
942 'DeletePageFactory' => static function ( MediaWikiServices $services ): DeletePageFactory {
943 return $services->getService( '_PageCommandFactory' );
944 },
945
946 'DomainEventDispatcher' => static function ( MediaWikiServices $services ): DomainEventDispatcher {
947 return $services->getService( '_DomainEventDispatcher' );
948 },
949
950 'DomainEventSource' => static function ( MediaWikiServices $services ): DomainEventSource {
951 return $services->getService( '_DomainEventDispatcher' );
952 },
953
954 'EmailConfirmationBannerHandler' =>
955 static function ( MediaWikiServices $services ): EmailConfirmationBannerHandler {
957 new ServiceOptions(
958 EmailConfirmationBannerHandler::CONSTRUCTOR_OPTIONS,
959 $services->getMainConfig()
960 )
961 );
962 },
963
964 'Emailer' => static function ( MediaWikiServices $services ): IEmailer {
965 return new Emailer();
966 },
967
968 'EmailUserFactory' => static function ( MediaWikiServices $services ): EmailUserFactory {
970 new ServiceOptions( EmailUser::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
971 $services->getHookContainer(),
972 $services->getUserOptionsLookup(),
973 $services->getCentralIdLookup(),
974 $services->getUserFactory(),
975 $services->getEmailer(),
976 $services->getMessageFormatterFactory(),
977 $services->getMessageFormatterFactory()->getTextFormatter(
978 $services->getContentLanguageCode()->toString()
979 )
980 );
981 },
982
983 'EventRelayerGroup' => static function ( MediaWikiServices $services ): EventRelayerGroup {
984 return new EventRelayerGroup( $services->getMainConfig()->get( MainConfigNames::EventRelayerConfig ) );
985 },
986
987 'ExtensionRegistry' => static function ( MediaWikiServices $services ): ExtensionRegistry {
988 return ExtensionRegistry::getInstance();
989 },
990
991 'ExternalStoreAccess' => static function ( MediaWikiServices $services ): ExternalStoreAccess {
993 $services->getExternalStoreFactory(),
994 LoggerFactory::getInstance( 'ExternalStore' )
995 );
996 },
997
998 'ExternalStoreFactory' => static function ( MediaWikiServices $services ): ExternalStoreFactory {
999 $config = $services->getMainConfig();
1000 $writeStores = $config->get( MainConfigNames::DefaultExternalStore );
1001
1002 return new ExternalStoreFactory(
1003 $config->get( MainConfigNames::ExternalStores ),
1004 ( $writeStores !== false ) ? (array)$writeStores : [],
1005 $services->getDBLoadBalancer()->getLocalDomainID(),
1006 LoggerFactory::getInstance( 'ExternalStore' )
1007 );
1008 },
1009
1010 'FeatureShutdown' => static function ( MediaWikiServices $services ): FeatureShutdown {
1012 new ServiceOptions(
1013 FeatureShutdown::CONSTRUCTOR_OPTIONS,
1014 $services->getMainConfig()
1015 )
1016 );
1017 },
1018
1019 'FileBackendGroup' => static function ( MediaWikiServices $services ): FileBackendGroup {
1020 $mainConfig = $services->getMainConfig();
1021
1022 $ld = WikiMap::getCurrentWikiDbDomain();
1023 $fallbackWikiId = WikiMap::getWikiIdFromDbDomain( $ld );
1024 // If the local wiki ID and local domain ID do not match, probably due to a non-default
1025 // schema, issue a warning. A non-default schema indicates that it might be used to
1026 // disambiguate different wikis.
1027 $legacyDomainId = strlen( $ld->getTablePrefix() )
1028 ? "{$ld->getDatabase()}-{$ld->getTablePrefix()}"
1029 : $ld->getDatabase();
1030 if ( $ld->getSchema() !== null && $legacyDomainId !== $fallbackWikiId ) {
1031 wfWarn(
1032 "Legacy default 'domainId' is '$legacyDomainId' but wiki ID is '$fallbackWikiId'."
1033 );
1034 }
1035
1036 $cache = $services->getLocalServerObjectCache();
1037 if ( $cache instanceof EmptyBagOStuff ) {
1038 $cache = new HashBagOStuff();
1039 }
1040
1041 return new FileBackendGroup(
1042 new ServiceOptions( FileBackendGroup::CONSTRUCTOR_OPTIONS, $mainConfig,
1043 [ 'fallbackWikiId' => $fallbackWikiId ] ),
1044 $services->getReadOnlyMode(),
1045 $cache,
1046 $services->getMainWANObjectCache(),
1047 $services->getMimeAnalyzer(),
1048 $services->getLockManagerGroupFactory(),
1049 $services->getTempFSFileFactory(),
1050 $services->getTracer()
1051 );
1052 },
1053
1054 'FormatterFactory' => static function ( MediaWikiServices $services ): FormatterFactory {
1056 $services->getMessageParser(),
1057 $services->getTitleFormatter(),
1058 $services->getHookContainer(),
1059 $services->getUserIdentityUtils(),
1060 $services->getLanguageFactory(),
1061 LoggerFactory::getInstance( 'status' )
1062 );
1063 },
1064
1065 'GenderCache' => static function ( MediaWikiServices $services ): GenderCache {
1066 $nsInfo = $services->getNamespaceInfo();
1067 // If there is no database, use defaults
1068 if ( $services->isServiceDisabled( 'DBLoadBalancer' ) ) {
1069 $userOptionsLookup = new StaticUserOptionsLookup(
1070 [],
1071 $services->getMainConfig()->get( MainConfigNames::DefaultUserOptions )
1072 );
1073 } else {
1074 $userOptionsLookup = $services->getUserOptionsLookup();
1075 }
1076 return new GenderCache( $nsInfo, $userOptionsLookup );
1077 },
1078
1079 'GlobalIdGenerator' => static function ( MediaWikiServices $services ): GlobalIdGenerator {
1080 $mainConfig = $services->getMainConfig();
1081
1082 return new GlobalIdGenerator(
1083 $mainConfig->get( MainConfigNames::TmpDirectory ),
1084 static function ( $command ) {
1085 return wfShellExec( $command );
1086 }
1087 );
1088 },
1089
1090 'GrantsInfo' => static function ( MediaWikiServices $services ): GrantsInfo {
1091 return new GrantsInfo(
1092 new ServiceOptions(
1093 GrantsInfo::CONSTRUCTOR_OPTIONS,
1094 $services->getMainConfig()
1095 )
1096 );
1097 },
1098
1099 'GrantsLocalization' => static function ( MediaWikiServices $services ): GrantsLocalization {
1101 $services->getGrantsInfo(),
1102 $services->getLinkRenderer(),
1103 $services->getLanguageFactory(),
1104 $services->getContentLanguage()
1105 );
1106 },
1107
1108 'GroupPermissionsLookup' => static function ( MediaWikiServices $services ): GroupPermissionsLookup {
1110 new ServiceOptions( GroupPermissionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
1111 );
1112 },
1113
1114 'HideUserUtils' => static function ( MediaWikiServices $services ): HideUserUtils {
1115 return new HideUserUtils();
1116 },
1117
1118 'HookContainer' => static function ( MediaWikiServices $services ): HookContainer {
1119 // NOTE: This is called while $services is being initialized, in order to call the
1120 // MediaWikiServices hook.
1121
1122 $configHooks = $services->getBootstrapConfig()->get( MainConfigNames::Hooks );
1123
1124 $extRegistry = ExtensionRegistry::getInstance();
1125 $extHooks = $extRegistry->getAttribute( 'Hooks' );
1126 $extDeprecatedHooks = $extRegistry->getAttribute( 'DeprecatedHooks' );
1127
1128 return new HookContainer(
1129 new StaticHookRegistry( $configHooks, $extHooks, $extDeprecatedHooks ),
1130 $services->getObjectFactory()
1131 );
1132 },
1133
1134 'HTMLCacheUpdater' => static function ( MediaWikiServices $services ): HTMLCacheUpdater {
1135 $config = $services->getMainConfig();
1136
1137 return new HTMLCacheUpdater(
1138 $services->getHookContainer(),
1139 $services->getTitleFactory(),
1140 $config->get( MainConfigNames::CdnReboundPurgeDelay ),
1141 $config->get( MainConfigNames::UseFileCache ),
1142 $config->get( MainConfigNames::CdnMaxAge )
1143 );
1144 },
1145
1146 'HtmlTransformFactory' => static function ( MediaWikiServices $services ): HtmlTransformFactory {
1148 $services->getService( '_Parsoid' ),
1149 $services->getMainConfig()->get( MainConfigNames::ParsoidSettings ),
1150 $services->getParsoidPageConfigFactory(),
1151 $services->getContentHandlerFactory(),
1152 $services->getParsoidSiteConfig(),
1153 $services->getTitleFactory(),
1154 $services->getLanguageConverterPipeline(),
1155 $services->getLanguageFactory()
1156 );
1157 },
1158
1159 'HttpRequestFactory' => static function ( MediaWikiServices $services ): HttpRequestFactory {
1161 new ServiceOptions(
1162 HttpRequestFactory::CONSTRUCTOR_OPTIONS,
1163 $services->getMainConfig()
1164 ),
1165 LoggerFactory::getInstance( 'http' ),
1166 $services->getTracer()
1167 );
1168 },
1169
1170 'InterwikiLookup' => static function ( MediaWikiServices $services ): InterwikiLookup {
1172 new ServiceOptions(
1173 ClassicInterwikiLookup::CONSTRUCTOR_OPTIONS,
1174 $services->getMainConfig(),
1175 [ 'wikiId' => WikiMap::getCurrentWikiId() ]
1176 ),
1177 $services->getContentLanguage(),
1178 $services->getMainWANObjectCache(),
1179 $services->getHookContainer(),
1180 $services->getConnectionProvider(),
1181 $services->getLanguageNameUtils()
1182 );
1183 },
1184
1185 'IntroMessageBuilder' => static function ( MediaWikiServices $services ): IntroMessageBuilder {
1187 $services->getMainConfig(),
1188 $services->getLinkRenderer(),
1189 $services->getPermissionManager(),
1190 $services->getUserNameUtils(),
1191 $services->getTempUserCreator(),
1192 $services->getUserFactory(),
1193 $services->getRestrictionStore(),
1194 $services->getDatabaseBlockStore(),
1195 $services->getReadOnlyMode(),
1196 $services->getSpecialPageFactory(),
1197 $services->getRepoGroup(),
1198 $services->getNamespaceInfo(),
1199 $services->getSkinFactory(),
1200 $services->getConnectionProvider(),
1201 $services->getUrlUtils(),
1202 $services->getShadowPageLoader(),
1203 );
1204 },
1205
1206 'JobFactory' => static function ( MediaWikiServices $services ): JobFactory {
1207 return new JobFactory(
1208 $services->getObjectFactory(),
1209 $services->getMainConfig()->get( MainConfigNames::JobClasses )
1210 );
1211 },
1212
1213 'JobQueueGroup' => static function ( MediaWikiServices $services ): JobQueueGroup {
1214 return $services->getJobQueueGroupFactory()->makeJobQueueGroup();
1215 },
1216
1217 'JobQueueGroupFactory' => static function ( MediaWikiServices $services ): JobQueueGroupFactory {
1219 new ServiceOptions( JobQueueGroupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1220 $services->getReadOnlyMode(),
1221 $services->getStatsFactory(),
1222 $services->getObjectCacheFactory()->getLocalClusterInstance(),
1223 $services->getGlobalIdGenerator()
1224 );
1225 },
1226
1227 'JobRunner' => static function ( MediaWikiServices $services ): JobRunner {
1228 return new JobRunner(
1229 new ServiceOptions( JobRunner::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1230 $services->getDBLoadBalancerFactory(),
1231 $services->getJobQueueGroup(),
1232 $services->getReadOnlyMode(),
1233 $services->getLinkCache(),
1234 $services->getStatsFactory(),
1235 LoggerFactory::getInstance( 'runJobs' )
1236 );
1237 },
1238
1239 'JsonCodec' => static function ( MediaWikiServices $services ): JsonCodec {
1240 return new JsonCodec( $services );
1241 },
1242
1243 'JwtCodec' => static function ( MediaWikiServices $services ): JwtCodec {
1244 return new RsaJwtCodec(
1245 new ServiceOptions( RsaJwtCodec::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
1246 );
1247 },
1248
1249 'LanguageConverterFactory' => static function ( MediaWikiServices $services ): LanguageConverterFactory {
1251 new ServiceOptions( LanguageConverterFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1252 $services->getObjectFactory(),
1253 static function () use ( $services ) {
1254 return $services->getContentLanguage();
1255 }
1256 );
1257 },
1258
1259 'LanguageConverterPipeline' => static function ( MediaWikiServices $services ): OutputTransformPipeline {
1260 return $services->getDefaultOutputPipelineFactory()
1261 ->buildLanguageConverterPipeline();
1262 },
1263
1264 'LanguageFactory' => static function ( MediaWikiServices $services ): LanguageFactory {
1266 new ServiceOptions( LanguageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1267 $services->getNamespaceInfo(),
1268 $services->getLocalisationCache(),
1269 $services->getLanguageNameUtils(),
1270 $services->getLanguageFallback(),
1271 $services->getLanguageConverterFactory(),
1272 $services->getHookContainer(),
1273 $services->getMainConfig(),
1274 $services->getLeximorphFactory()
1275 );
1276 },
1277
1278 'LanguageFallback' => static function ( MediaWikiServices $services ): LanguageFallback {
1280 $services->getMainConfig()->get( MainConfigNames::LanguageCode ),
1281 $services->getLocalisationCache(),
1282 $services->getLanguageNameUtils()
1283 );
1284 },
1285
1286 'LanguageNameSearch' => static function ( MediaWikiServices $services ): LanguageNameSearch {
1288 $services->getLanguageNameUtils()
1289 );
1290 },
1291
1292 'LanguageNameUtils' => static function ( MediaWikiServices $services ): LanguageNameUtils {
1294 new ServiceOptions(
1295 LanguageNameUtils::CONSTRUCTOR_OPTIONS,
1296 $services->getMainConfig()
1297 ),
1298 $services->getHookContainer()
1299 );
1300 },
1301
1302 'LeximorphFactory' => static function ( MediaWikiServices $services ): LeximorphFactory {
1305 MediaWiki\Language\LeximorphFactory::CONSTRUCTOR_OPTIONS,
1306 $services->getMainConfig()
1307 ),
1308 LoggerFactory::getInstance( 'leximorph' )
1309 );
1310 },
1311
1312 'LinkBatchFactory' => static function ( MediaWikiServices $services ): LinkBatchFactory {
1314 $services->getLinkCache(),
1315 $services->getTitleFormatter(),
1316 $services->getContentLanguage(),
1317 $services->getGenderCache(),
1318 $services->getConnectionProvider(),
1319 $services->getLinksMigration(),
1320 $services->getTempUserDetailsLookup(),
1321 LoggerFactory::getInstance( 'LinkBatch' )
1322 );
1323 },
1324
1325 'LinkCache' => static function ( MediaWikiServices $services ): LinkCache {
1326 // Database layer may be disabled, so processing without database connection
1327 $dbLoadBalancer = $services->isServiceDisabled( 'DBLoadBalancer' )
1328 ? null
1329 : $services->getDBLoadBalancer();
1330 $linkCache = new LinkCache(
1331 $services->getTitleFormatter(),
1332 $services->getMainWANObjectCache(),
1333 $services->getNamespaceInfo(),
1334 $dbLoadBalancer
1335 );
1336 $linkCache->setLogger( LoggerFactory::getInstance( 'LinkCache' ) );
1337 return $linkCache;
1338 },
1339
1340 'LinkRenderer' => static function ( MediaWikiServices $services ): LinkRenderer {
1341 return $services->getLinkRendererFactory()->create();
1342 },
1343
1344 'LinkRendererFactory' => static function ( MediaWikiServices $services ): LinkRendererFactory {
1346 $services->getTitleFormatter(),
1347 $services->getLinkCache(),
1348 $services->getSpecialPageFactory(),
1349 $services->getHookContainer(),
1350 $services->getTempUserConfig(),
1351 $services->getTempUserDetailsLookup(),
1352 $services->getUserIdentityLookup(),
1353 $services->getUserNameUtils(),
1354 $services->getUrlUtils(),
1355 new ServiceOptions(
1356 LinkRendererFactory::CONSTRUCTOR_OPTIONS,
1357 $services->getMainConfig()
1358 )
1359 );
1360 },
1361
1362 'LinksMigration' => static function ( MediaWikiServices $services ): LinksMigration {
1364 $services->getMainConfig(),
1365 $services->getLinkTargetLookup()
1366 );
1367 },
1368
1369 'LinkTargetLookup' => static function ( MediaWikiServices $services ): LinkTargetLookup {
1371 $services->getConnectionProvider(),
1372 $services->getLocalServerObjectCache(),
1373 $services->getMainWANObjectCache()
1374 );
1375 },
1376
1377 'LinkWriteDuplicator' => static function ( MediaWikiServices $services ): WriteDuplicator {
1379 $services->getConnectionProvider(),
1380 ExternalLinksTable::VIRTUAL_DOMAIN,
1381 array_key_exists(
1382 ExternalLinksTable::VIRTUAL_DOMAIN,
1383 $services->getMainConfig()->get( MainConfigNames::VirtualDomainsMapping )
1384 )
1385 );
1386 },
1387
1388 'LintErrorChecker' => static function ( MediaWikiServices $services ): LintErrorChecker {
1390 $services->get( '_Parsoid' ),
1391 $services->getParsoidPageConfigFactory(),
1392 $services->getTitleFactory(),
1393 ExtensionRegistry::getInstance(),
1394 $services->getMainConfig(),
1395 );
1396 },
1397
1398 'LocalisationCache' => static function ( MediaWikiServices $services ): LocalisationCache {
1399 $conf = $services->getMainConfig()->get( MainConfigNames::LocalisationCacheConf );
1400
1401 $logger = LoggerFactory::getInstance( 'localisation' );
1402
1403 $store = LocalisationCache::getStoreFromConf(
1404 $conf, $services->getMainConfig()->get( MainConfigNames::CacheDirectory ) );
1405 $logger->debug( 'LocalisationCache using store ' . get_class( $store ) );
1406
1407 return new $conf['class'](
1408 new ServiceOptions(
1409 LocalisationCache::CONSTRUCTOR_OPTIONS,
1410 // Two of the options are stored in $wgLocalisationCacheConf
1411 $conf,
1412 // In case someone set that config variable and didn't reset all keys, set defaults.
1413 [
1414 'forceRecache' => false,
1415 'manualRecache' => false,
1416 ],
1417 // Some other options come from config itself
1418 $services->getMainConfig()
1419 ),
1420 $store,
1421 $logger,
1422 [ static function () use ( $services ) {
1423 // NOTE: Make sure we use the same cache object that is assigned in the
1424 // constructor of the MessageBlobStore class used by ResourceLoader.
1425 // T231866: Avoid circular dependency via ResourceLoader.
1426 MessageBlobStore::clearGlobalCacheEntry( $services->getMainWANObjectCache() );
1427 } ],
1428 $services->getLanguageNameUtils(),
1429 $services->getHookContainer()
1430 );
1431 },
1432
1433 'LocalServerObjectCache' => static function ( MediaWikiServices $services ): BagOStuff {
1434 return $services->getObjectCacheFactory()->getInstance( CACHE_ACCEL );
1435 },
1436
1437 'LockManager' => static function ( MediaWikiServices $services ): LockManager {
1438 // TODO: This probably should move to a dedicated factory but the current state
1439 // of lock manager factories needs refactoring first.
1440 if ( defined( 'MW_PHPUNIT_TEST' ) ) {
1441 return new NullLockManager( [] );
1442 }
1443 $lockManager = $services->getMainConfig()->get( MainConfigNames::DefaultLockManager );
1444 if ( !$lockManager ) {
1445 return new DatabaseLockManager(
1446 [
1447 'domain' => WikiMap::getCurrentWikiDbDomain()->getId(),
1448 'dbProvider' => $services->getConnectionProvider(),
1449 'logger' => LoggerFactory::getInstance( 'lockManager' )
1450 ]
1451 );
1452 }
1453 return $services->getLockManagerGroupFactory()
1454 ->getLockManagerGroup( WikiMap::getCurrentWikiDbDomain()->getId() )
1455 ->get( $lockManager );
1456 },
1457
1458 'LockManagerGroupFactory' => static function ( MediaWikiServices $services ): LockManagerGroupFactory {
1460 WikiMap::getCurrentWikiDbDomain()->getId(),
1461 $services->getMainConfig()->get( MainConfigNames::LockManagers )
1462 );
1463 },
1464
1465 'LogFormatterFactory' => static function ( MediaWikiServices $services ): LogFormatterFactory {
1467 new ServiceOptions( LogFormatterFactory::SERVICE_OPTIONS, $services->getMainConfig() ),
1468 $services->getObjectFactory(),
1469 $services->getHookContainer(),
1470 $services->getLinkRenderer(),
1471 $services->getContentLanguage(),
1472 $services->getCommentFormatter(),
1473 $services->getUserEditTracker()
1474 );
1475 },
1476
1477 'MagicWordFactory' => static function ( MediaWikiServices $services ): MagicWordFactory {
1479 $services->getContentLanguage(),
1480 $services->getHookContainer()
1481 );
1482 },
1483
1484 'MainConfig' => static function ( MediaWikiServices $services ): Config {
1485 // Use the 'main' config from the ConfigFactory service.
1486 return $services->getConfigFactory()->makeConfig( 'main' );
1487 },
1488
1489 'MainObjectStash' => static function ( MediaWikiServices $services ): BagOStuff {
1490 $mainConfig = $services->getMainConfig();
1491
1492 $id = $mainConfig->get( MainConfigNames::MainStash );
1493 $store = $services->getObjectCacheFactory()->getInstance( $id );
1494 $store->getLogger()->debug( 'MainObjectStash using store {class}', [
1495 'class' => get_class( $store )
1496 ] );
1497
1498 return $store;
1499 },
1500
1501 'MainWANObjectCache' => static function ( MediaWikiServices $services ): WANObjectCache {
1502 $mainConfig = $services->getMainConfig();
1503
1504 $store = $services->getObjectCacheFactory()->getLocalClusterInstance();
1505 $logger = $store->getLogger();
1506 $logger->debug( 'MainWANObjectCache using store {class}', [
1507 'class' => get_class( $store )
1508 ] );
1509
1510 $wanParams = $mainConfig->get( MainConfigNames::WANObjectCache ) + [
1511 'cache' => $store,
1512 'logger' => $logger,
1513 'tracer' => $services->getTracer(),
1514 ];
1515 if ( MW_ENTRY_POINT !== 'cli' ) {
1516 // Send the statsd data post-send on HTTP requests; avoid in CLI mode (T181385)
1517 $wanParams['stats'] = $services->getStatsFactory();
1518 // Let pre-emptive refreshes happen post-send on HTTP requests
1519 $wanParams['asyncHandler'] = DeferredUpdates::addCallableUpdate( ... );
1520 }
1521
1522 // Only the callback only if it's a simple one-database setup.
1523 $lbConf = $services->getDBLoadBalancerFactoryConfig()->getConfig();
1524 if (
1525 isset( $lbConf['servers'] ) &&
1526 count( $lbConf['servers'] ) === 1 &&
1527 !defined( 'MW_PHPUNIT_TEST' )
1528 ) {
1529 $wanParams['pendingCallback'] = static function () use ( $services ) {
1530 return $services->getDBLoadBalancer()->hasOrMadeRecentPrimaryChanges();
1531 };
1532 }
1533 return new WANObjectCache( $wanParams );
1534 },
1535
1536 'MediaHandlerFactory' => static function ( MediaWikiServices $services ): MediaHandlerFactory {
1538 $services->getLanguageFactory(),
1539 LoggerFactory::getInstance( 'MediaHandlerFactory' ),
1540 $services->getMainConfig()->get( MainConfigNames::MediaHandlers )
1541 );
1542 },
1543
1544 'MergeHistoryFactory' => static function ( MediaWikiServices $services ): MergeHistoryFactory {
1545 return $services->getService( '_PageCommandFactory' );
1546 },
1547
1548 'MessageCache' => static function ( MediaWikiServices $services ): MessageCache {
1549 $mainConfig = $services->getMainConfig();
1550 $mainCache = $services->getObjectCacheFactory()
1551 ->getInstance( $mainConfig->get( MainConfigNames::MessageCacheType ) );
1552 $srvCache = $mainConfig->get( MainConfigNames::UseLocalMessageCache )
1553 ? $services->getLocalServerObjectCache()
1554 : new EmptyBagOStuff();
1555
1556 $logger = LoggerFactory::getInstance( 'MessageCache' );
1557 $logger->debug( 'MessageCache using store {class}', [
1558 'class' => get_class( $mainCache )
1559 ] );
1560
1561 $options = new ServiceOptions( MessageCache::CONSTRUCTOR_OPTIONS, $mainConfig );
1562
1563 return new MessageCache(
1564 $services->getMainWANObjectCache(),
1565 $mainCache,
1566 $srvCache,
1567 $services->getContentLanguage(),
1568 $services->getLanguageConverterFactory(),
1569 $logger,
1570 $options,
1571 $services->getLocalisationCache(),
1572 $services->getLanguageNameUtils(),
1573 $services->getLanguageFallback(),
1574 $services->getHookContainer(),
1575 $services->getMessageParser()
1576 );
1577 },
1578
1579 'MessageFormatterFactory' => static function ( MediaWikiServices $services ): IMessageFormatterFactory {
1581 },
1582
1583 'MessageParser' => static function ( MediaWikiServices $services ): MessageParser {
1585 $services->getParserFactory(),
1586 $services->getDefaultOutputPipeline(),
1587 $services->getLanguageFactory(),
1588 LoggerFactory::getInstance( 'MessageParser' )
1589 );
1590 },
1591
1592 'MicroStash' => static function ( MediaWikiServices $services ): BagOStuff {
1593 $mainConfig = $services->getMainConfig();
1594
1595 $id = $mainConfig->get( MainConfigNames::MicroStashType );
1596 $store = $services->getObjectCacheFactory()->getInstance( $id );
1597
1598 $store->getLogger()->debug( 'MicroStash using store {class}', [
1599 'class' => get_class( $store )
1600 ] );
1601
1602 return $store;
1603 },
1604
1605 'MimeAnalyzer' => static function ( MediaWikiServices $services ): MimeAnalyzer {
1606 $logger = LoggerFactory::getInstance( 'Mime' );
1607 $mainConfig = $services->getMainConfig();
1608 $hookRunner = new HookRunner( $services->getHookContainer() );
1609 $params = [
1610 'typeFile' => $mainConfig->get( MainConfigNames::MimeTypeFile ),
1611 'infoFile' => $mainConfig->get( MainConfigNames::MimeInfoFile ),
1612 'xmlTypes' => $mainConfig->get( MainConfigNames::XMLMimeTypes ),
1613 'guessCallback' => static function (
1614 $mimeAnalyzer, &$head, &$tail, $file, &$mime
1615 ) use ( $logger, $hookRunner ) {
1616 // Also test DjVu
1617 $deja = new DjVuImage( $file );
1618 if ( $deja->isValid() ) {
1619 $logger->info( "Detected $file as image/vnd.djvu\n" );
1620 $mime = 'image/vnd.djvu';
1621
1622 return;
1623 }
1624 // Some strings by reference for performance - assuming well-behaved hooks
1625 $hookRunner->onMimeMagicGuessFromContent(
1626 $mimeAnalyzer, $head, $tail, $file, $mime );
1627 },
1628 'extCallback' => static function ( $mimeAnalyzer, $ext, &$mime ) use ( $hookRunner ) {
1629 // Media handling extensions can improve the MIME detected
1630 $hookRunner->onMimeMagicImproveFromExtension( $mimeAnalyzer, $ext, $mime );
1631 },
1632 'initCallback' => static function ( $mimeAnalyzer ) use ( $hookRunner ) {
1633 // Allow media handling extensions adding MIME-types and MIME-info
1634 $hookRunner->onMimeMagicInit( $mimeAnalyzer );
1635 },
1636 'logger' => $logger
1637 ];
1638
1639 if ( $params['infoFile'] === 'includes/mime.info' ) {
1640 $params['infoFile'] = MimeAnalyzer::USE_INTERNAL;
1641 }
1642
1643 if ( $params['typeFile'] === 'includes/mime.types' ) {
1644 $params['typeFile'] = MimeAnalyzer::USE_INTERNAL;
1645 }
1646
1647 $detectorCmd = $mainConfig->get( MainConfigNames::MimeDetectorCommand );
1648 if ( $detectorCmd ) {
1649 $factory = $services->getShellCommandFactory();
1650 $params['detectCallback'] = static function ( $file ) use ( $detectorCmd, $factory ) {
1651 $result = $factory->create()
1652 // $wgMimeDetectorCommand can contain commands with parameters
1653 ->unsafeParams( $detectorCmd )
1654 ->params( $file )
1655 ->execute();
1656 return $result->getStdout();
1657 };
1658 }
1659
1660 return new MimeAnalyzer( $params );
1661 },
1662
1663 'MovePageFactory' => static function ( MediaWikiServices $services ): MovePageFactory {
1664 return $services->getService( '_PageCommandFactory' );
1665 },
1666
1667 'MultiFormatUserIdentityLookup' => static function ( MediaWikiServices $services ): MultiFormatUserIdentityLookup {
1669 $services->getActorStoreFactory(),
1670 $services->getUserFactory(),
1671 new ServiceOptions( MultiFormatUserIdentityLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
1672 );
1673 },
1674
1675 'NamespaceInfo' => static function ( MediaWikiServices $services ): NamespaceInfo {
1677 new ServiceOptions( NamespaceInfo::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1678 $services->getHookContainer(),
1679 ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' ),
1680 ExtensionRegistry::getInstance()->getAttribute( 'ImmovableNamespaces' )
1681 );
1682 },
1683
1684 'NameTableStoreFactory' => static function ( MediaWikiServices $services ): NameTableStoreFactory {
1686 $services->getDBLoadBalancerFactory(),
1687 $services->getMainWANObjectCache(),
1688 LoggerFactory::getInstance( 'NameTableSqlStore' )
1689 );
1690 },
1691
1692 'NotificationEmailSender' => static function ( MediaWikiServices $services ): NotificationEmailSender {
1694 new ServiceOptions(
1695 NotificationEmailSender::CONSTRUCTOR_OPTIONS,
1696 $services->getMainConfig()
1697 ),
1698 $services->getEmailer(),
1699 $services->getLocalServerObjectCache(),
1700 $services->getUrlUtils()
1701 );
1702 },
1703
1704 'NotificationService' => static function ( MediaWikiServices $services ): NotificationService {
1705 $handlers = ExtensionRegistry::getInstance()->getAttribute( 'NotificationHandlers' );
1706 // Inject default MediaWiki handlers
1707 $handlers[] = NotificationService::RECENT_CHANGE_HANDLER_SPEC;
1708
1709 return new NotificationService(
1710 LoggerFactory::getInstance( 'Notification' ),
1711 $services->getObjectFactory(),
1712 $services->getService( '_NotificationMiddlewareChain' ),
1713 $handlers
1714 );
1715 },
1716
1717 'ObjectCacheFactory' => static function ( MediaWikiServices $services ): ObjectCacheFactory {
1719 new ServiceOptions(
1720 ObjectCacheFactory::CONSTRUCTOR_OPTIONS,
1721 $services->getMainConfig()
1722 ),
1723 $services->getStatsFactory(),
1724 LoggerFactory::getProvider(),
1725 // Prevent a recursive service instantiation on DBLoadBalancerFactory
1726 // and ensure the service keeps working when DB storage is disabled.
1727 static function () use ( $services ) {
1728 return $services->getDBLoadBalancerFactory();
1729 },
1730 WikiMap::getCurrentWikiDbDomain()->getId(),
1731 $services->getTracer()
1732 );
1733 },
1734
1735 'ObjectFactory' => static function ( MediaWikiServices $services ): ObjectFactory {
1736 return new ObjectFactory( $services );
1737 },
1738
1739 'OldRevisionImporter' => static function ( MediaWikiServices $services ): OldRevisionImporter {
1741 true,
1742 LoggerFactory::getInstance( 'OldRevisionImporter' ),
1743 $services->getConnectionProvider(),
1744 $services->getRevisionStoreFactory()->getRevisionStoreForImport(),
1745 $services->getSlotRoleRegistry(),
1746 $services->getWikiPageFactory(),
1747 $services->getPageUpdaterFactory(),
1748 $services->getUserFactory()
1749 );
1750 },
1751
1752 'PageEditStash' => static function ( MediaWikiServices $services ): PageEditStash {
1754 $services->getObjectCacheFactory()->getLocalClusterInstance(),
1755 $services->getConnectionProvider(),
1756 LoggerFactory::getInstance( 'StashEdit' ),
1757 $services->getStatsFactory(),
1758 $services->getUserEditTracker(),
1759 $services->getUserFactory(),
1760 $services->getWikiPageFactory(),
1761 $services->getJsonCodec(),
1762 $services->getLockManager(),
1763 $services->getHookContainer(),
1764 defined( 'MEDIAWIKI_JOB_RUNNER' ) || MW_ENTRY_POINT === 'cli'
1765 ? PageEditStash::INITIATOR_JOB_OR_CLI
1766 : PageEditStash::INITIATOR_USER
1767 );
1768 },
1769
1770 'PageProps' => static function ( MediaWikiServices $services ): PageProps {
1771 return new PageProps(
1772 $services->getLinkBatchFactory(),
1773 $services->getConnectionProvider()
1774 );
1775 },
1776
1777 'PageRestHelperFactory' => static function ( MediaWikiServices $services ): PageRestHelperFactory {
1779 new ServiceOptions( PageRestHelperFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1780 $services->getRevisionLookup(),
1781 $services->getRevisionRenderer(),
1782 $services->getTitleFormatter(),
1783 $services->getPageStore(),
1784 $services->getParsoidOutputStash(),
1785 $services->getParserOutputAccess(),
1786 $services->getParsoidSiteConfig(),
1787 $services->getHtmlTransformFactory(),
1788 $services->getContentHandlerFactory(),
1789 $services->getLanguageFactory(),
1790 $services->getRedirectStore(),
1791 $services->getLanguageConverterFactory(),
1792 $services->getTitleFactory(),
1793 $services->getConnectionProvider(),
1794 $services->getChangeTagsStore(),
1795 $services->getStatsFactory(),
1796 $services->getShadowPageLoader(),
1797 );
1798 },
1799
1800 'PageStore' => static function ( MediaWikiServices $services ): PageStore {
1801 return $services->getPageStoreFactory()->getPageStore();
1802 },
1803
1804 'PageStoreFactory' => static function ( MediaWikiServices $services ): PageStoreFactory {
1805 $options = new ServiceOptions(
1806 PageStoreFactory::CONSTRUCTOR_OPTIONS,
1807 $services->getMainConfig()
1808 );
1809
1810 return new PageStoreFactory(
1811 $options,
1812 $services->getDBLoadBalancerFactory(),
1813 $services->getNamespaceInfo(),
1814 $services->getTitleParser(),
1815 $services->getLinkCache(),
1816 $services->getStatsFactory()
1817 );
1818 },
1819
1820 'PageUpdaterFactory' => static function (
1821 MediaWikiServices $services
1823 $editResultCache = new EditResultCache(
1824 $services->getMainObjectStash(),
1825 $services->getConnectionProvider(),
1826 new ServiceOptions(
1827 EditResultCache::CONSTRUCTOR_OPTIONS,
1828 $services->getMainConfig()
1829 )
1830 );
1831
1832 return new PageUpdaterFactory(
1833 $services->getRevisionStore(),
1834 $services->getRevisionRenderer(),
1835 $services->getSlotRoleRegistry(),
1836 $services->getParserCache(),
1837 $services->getJobQueueGroup(),
1838 $services->getContentLanguage(),
1839 $services->getDBLoadBalancerFactory(),
1840 $services->getContentHandlerFactory(),
1841 $services->getDomainEventDispatcher(),
1842 $services->getHookContainer(),
1843 $editResultCache,
1844 LoggerFactory::getInstance( 'SavePage' ),
1845 new ServiceOptions(
1846 PageUpdaterFactory::CONSTRUCTOR_OPTIONS,
1847 $services->getMainConfig()
1848 ),
1849 $services->getUserGroupManager(),
1850 $services->getTitleFormatter(),
1851 $services->getContentTransformer(),
1852 $services->getPageEditStash(),
1853 $services->getMainWANObjectCache(),
1854 $services->getWikiPageFactory(),
1855 $services->getChangeTagsStore(),
1856 $services->getChangeTagsStore()->getSoftwareTags()
1857 );
1858 },
1859
1860 'Parser' => static function ( MediaWikiServices $services ): Parser {
1861 // This service exists as convenience function to get the global parser in global code.
1862 // Do not use this service for dependency injection or in service wiring (T343070).
1863 // Use the 'ParserFactory' service instead.
1864 return $services->getParserFactory()->getMainInstance();
1865 },
1866
1867 'ParserCache' => static function ( MediaWikiServices $services ): ParserCache {
1868 return $services->getParserCacheFactory()
1869 ->getParserCache( ParserCacheFactory::DEFAULT_NAME );
1870 },
1871
1872 'ParserCacheFactory' => static function ( MediaWikiServices $services ): ParserCacheFactory {
1873 $config = $services->getMainConfig();
1874 $cache = $services->getObjectCacheFactory()->getInstance( $config->get( MainConfigNames::ParserCacheType ) );
1875 $wanCache = $services->getMainWANObjectCache();
1876
1877 $options = new ServiceOptions( ParserCacheFactory::CONSTRUCTOR_OPTIONS, $config );
1878
1879 return new ParserCacheFactory(
1880 $cache,
1881 $wanCache,
1882 $services->getHookContainer(),
1883 $services->getJsonCodec(),
1884 $services->getStatsFactory(),
1885 LoggerFactory::getInstance( 'ParserCache' ),
1886 $options,
1887 $services->getTitleFactory(),
1888 $services->getWikiPageFactory(),
1889 $services->getGlobalIdGenerator()
1890 );
1891 },
1892
1893 'ParserCoreTagHooks' => static function ( MediaWikiServices $services ): ParserCoreTagHooks {
1894 $options = new ServiceOptions( ParserCoreTagHooks::CONSTRUCTOR_OPTIONS,
1895 $services->getMainConfig()
1896 );
1897 return new ParserCoreTagHooks(
1898 $options,
1899 $services->getLanguageFactory(),
1900 $services->getLanguageConverterFactory(),
1901 );
1902 },
1903
1904 'ParserFactory' => static function ( MediaWikiServices $services ): ParserFactory {
1905 $options = new ServiceOptions( Parser::CONSTRUCTOR_OPTIONS,
1906 $services->getMainConfig()
1907 );
1908
1909 return new ParserFactory(
1910 $options,
1911 $services->getParserCoreTagHooks(),
1912 $services->getMagicWordFactory(),
1913 $services->getContentLanguage(),
1914 $services->getUrlUtils(),
1915 $services->getSpecialPageFactory(),
1916 $services->getLinkRendererFactory(),
1917 $services->getNamespaceInfo(),
1918 LoggerFactory::getInstance( 'Parser' ),
1919 $services->getBadFileLookup(),
1920 $services->getRepoGroup(),
1921 $services->getLanguageFactory(),
1922 $services->getLanguageConverterFactory(),
1923 $services->getLanguageNameUtils(),
1924 $services->getHookContainer(),
1925 $services->getTidy(),
1926 $services->getMainWANObjectCache(),
1927 $services->getUserOptionsLookup(),
1928 $services->getUserFactory(),
1929 $services->getTitleFormatter(),
1930 $services->getHttpRequestFactory(),
1931 $services->getTrackingCategories(),
1932 $services->getSignatureValidatorFactory(),
1933 $services->getUserNameUtils()
1934 );
1935 },
1936
1937 'ParserOutputAccess' => static function ( MediaWikiServices $services ): ParserOutputAccess {
1938 $poa = new ParserOutputAccess(
1939 $services->getMainConfig(),
1940 $services->getDefaultOutputPipeline(),
1941 $services->getParserCacheFactory(),
1942 $services->getRevisionLookup(),
1943 $services->getRevisionRenderer(),
1944 $services->getStatsFactory(),
1945 $services->getChronologyProtector(),
1946 $services->getWikiPageFactory(),
1947 $services->getTitleFormatter(),
1948 $services->getTracer(),
1949 $services->getPoolCounterFactory()
1950 );
1951
1952 $poa->setLogger( LoggerFactory::getInstance( 'ParserOutputAccess' ) );
1953 return $poa;
1954 },
1955
1956 'ParsoidDataAccess' => static function ( MediaWikiServices $services ): DataAccess {
1957 $mainConfig = $services->getMainConfig();
1958 return new MWDataAccess(
1960 $services->getRepoGroup(),
1961 $services->getBadFileLookup(),
1962 $services->getHookContainer(),
1963 $services->getContentTransformer(),
1964 $services->getTrackingCategories(),
1965 $services->getReadOnlyMode(),
1966 $services->getParserFactory(), // *legacy* parser factory
1967 $services->getLinkBatchFactory(),
1968 $services->getLinkRenderer()
1969 );
1970 },
1971
1972 'ParsoidOutputStash' => static function ( MediaWikiServices $services ): ParsoidOutputStash {
1973 // TODO: Determine storage requirements and config options for stashing parsoid
1974 // output for VE edits (T309016).
1975 $config = $services->getMainConfig()->get( MainConfigNames::ParsoidCacheConfig );
1976 $backend = $config['StashType']
1977 ? $services->getObjectCacheFactory()->getInstance( $config['StashType'] )
1978 : $services->getMainObjectStash();
1979
1980 return new SimpleParsoidOutputStash(
1981 $services->getJsonCodec(),
1982 $backend,
1983 $config['StashDuration']
1984 );
1985 },
1986
1987 'ParsoidPageConfigFactory' => static function ( MediaWikiServices $services ): MWPageConfigFactory {
1988 return new MWPageConfigFactory(
1989 $services->getRevisionStore(),
1990 $services->getSlotRoleRegistry(),
1991 $services->getLanguageFactory()
1992 );
1993 },
1994
1995 'ParsoidParserFactory' => static function ( MediaWikiServices $services ): ParsoidParserFactory {
1997 $services->getParsoidSiteConfig(),
1998 $services->getParsoidDataAccess(),
1999 $services->getParsoidPageConfigFactory(),
2000 $services->getLanguageConverterFactory(),
2001 $services->getNamespaceInfo(),
2002 $services->getTrackingCategories(),
2003 $services->getParserFactory(),
2004 );
2005 },
2006
2007 'ParsoidSiteConfig' => static function ( MediaWikiServices $services ): MWSiteConfig {
2008 $mainConfig = $services->getMainConfig();
2009 $parsoidSettings = $mainConfig->get( MainConfigNames::ParsoidSettings );
2010 return new MWSiteConfig(
2012 $parsoidSettings,
2013 $services->getObjectFactory(),
2014 $services->getContentLanguage(),
2015 $services->getStatsdDataFactory(),
2016 $services->getStatsFactory(),
2017 $services->getMagicWordFactory(),
2018 $services->getNamespaceInfo(),
2019 $services->getSpecialPageFactory(),
2020 $services->getInterwikiLookup(),
2021 $services->getUserOptionsLookup(),
2022 $services->getLanguageFactory(),
2023 $services->getLanguageConverterFactory(),
2024 $services->getLanguageNameUtils(),
2025 $services->getUrlUtils(),
2026 $services->getContentHandlerFactory(),
2027 ExtensionRegistry::getInstance()->getAttribute( 'ParsoidModules' ),
2028 // These arguments are temporary and will be removed once
2029 // better solutions are found.
2030 $services->getParserFactory(), // T268776
2031 $mainConfig, // T268777
2032 ExtensionRegistry::getInstance()->isLoaded( 'TimedMediaHandler' )
2033 );
2034 },
2035
2036 'PasswordFactory' => static function ( MediaWikiServices $services ): PasswordFactory {
2037 $config = $services->getMainConfig();
2038 return new PasswordFactory(
2039 $config->get( MainConfigNames::PasswordConfig ),
2040 $config->get( MainConfigNames::PasswordDefault )
2041 );
2042 },
2043
2044 'PasswordReset' => static function ( MediaWikiServices $services ): PasswordReset {
2045 $options = new ServiceOptions( PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig() );
2046 return new PasswordReset(
2047 $options,
2048 LoggerFactory::getInstance( 'authentication' ),
2049 $services->getAuthManager(),
2050 $services->getHookContainer(),
2051 $services->getUserIdentityLookup(),
2052 $services->getUserFactory(),
2053 $services->getUserNameUtils(),
2054 $services->getUserOptionsLookup()
2055 );
2056 },
2057
2058 'PatrolManager' => static function ( MediaWikiServices $services ): PatrolManager {
2060 new ServiceOptions( PatrolManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2061 $services->getConnectionProvider(),
2062 $services->getUserFactory(),
2063 $services->getHookContainer(),
2064 $services->getRevertedTagUpdateManager()
2065 );
2066 },
2067
2068 'PerDbNameStatsdDataFactory' => static function ( MediaWikiServices $services ): StatsdDataFactoryInterface {
2069 $config = $services->getMainConfig();
2070 $wiki = $config->get( MainConfigNames::DBname );
2072 $services->getStatsdDataFactory(),
2073 $wiki
2074 );
2075 },
2076
2077 'PermissionManager' => static function ( MediaWikiServices $services ): PermissionManager {
2079 new ServiceOptions(
2080 PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2081 ),
2082 $services->getSpecialPageFactory(),
2083 $services->getNamespaceInfo(),
2084 $services->getGroupPermissionsLookup(),
2085 $services->getUserGroupManager(),
2086 $services->getBlockManager(),
2087 $services->getFormatterFactory()->getBlockErrorFormatter(
2088 new LazyLocalizationContext( RequestContext::getMain( ... ) )
2089 ),
2090 $services->getHookContainer(),
2091 $services->getUserIdentityLookup(),
2092 $services->getRedirectLookup(),
2093 $services->getRestrictionStore(),
2094 $services->getTitleFormatter(),
2095 $services->getTempUserConfig(),
2096 $services->getUserFactory(),
2097 $services->getActionFactory()
2098 );
2099 },
2100
2101 'Pingback' => static function ( MediaWikiServices $services ): Pingback {
2102 return new Pingback(
2103 $services->getMainConfig(),
2104 $services->getConnectionProvider(),
2105 $services->getObjectCacheFactory()->getLocalClusterInstance(),
2106 $services->getHttpRequestFactory(),
2107 LoggerFactory::getInstance( 'Pingback' )
2108 );
2109 },
2110
2111 'PoolCounterFactory' => static function ( MediaWikiServices $services ): PoolCounterFactory {
2112 $mainConfig = $services->getMainConfig();
2113 return new PoolCounterFactory(
2114 $mainConfig->get( MainConfigNames::PoolCounterConf ),
2115 $mainConfig->get( MainConfigNames::PoolCountClientConf ),
2116 LoggerFactory::getInstance( 'poolcounter' ),
2117 $services->getTracer()
2118 );
2119 },
2120
2121 'PreferencesFactory' => static function ( MediaWikiServices $services ): PreferencesFactory {
2122 $factory = new DefaultPreferencesFactory(
2123 new ServiceOptions(
2124 DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2125 $services->getContentLanguage(),
2126 $services->getAuthManager(),
2127 $services->getLinkRendererFactory()->create(),
2128 $services->getNamespaceInfo(),
2129 $services->getPermissionManager(),
2130 $services->getLanguageConverterFactory()->getLanguageConverter(),
2131 $services->getLanguageNameUtils(),
2132 $services->getHookContainer(),
2133 $services->getUserOptionsManager(),
2134 $services->getLanguageConverterFactory(),
2135 $services->getParserFactory(),
2136 $services->getSkinFactory(),
2137 $services->getUserGroupManager(),
2138 $services->getSignatureValidatorFactory()
2139 );
2140 $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
2141
2142 return $factory;
2143 },
2144
2145 'PreloadedContentBuilder' => static function ( MediaWikiServices $services ): PreloadedContentBuilder {
2147 $services->getContentHandlerFactory(),
2148 $services->getWikiPageFactory(),
2149 $services->getRedirectLookup(),
2150 $services->getSpecialPageFactory(),
2151 $services->getContentTransformer(),
2152 $services->getHookContainer(),
2153 $services->getShadowPageLoader(),
2154 );
2155 },
2156
2157 'ProxyLookup' => static function ( MediaWikiServices $services ): ProxyLookup {
2158 $mainConfig = $services->getMainConfig();
2159 return new ProxyLookup(
2160 $mainConfig->get( MainConfigNames::CdnServers ),
2161 $mainConfig->get( MainConfigNames::CdnServersNoPurge ),
2162 $services->getHookContainer(),
2163 $services->getLocalServerObjectCache()
2164 );
2165 },
2166
2167 'RateLimiter' => static function ( MediaWikiServices $services ): RateLimiter {
2168 $rateLimiter = new RateLimiter(
2169 new ServiceOptions( RateLimiter::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2170 $services->getWRStatsFactory(),
2171 $services->getCentralIdLookupFactory()->getNonLocalLookup(),
2172 $services->getUserFactory(),
2173 $services->getUserGroupManager(),
2174 $services->getHookContainer()
2175 );
2176
2177 $rateLimiter->setStats( $services->getStatsFactory() );
2178
2179 return $rateLimiter;
2180 },
2181
2182 'ReadOnlyMode' => static function ( MediaWikiServices $services ): ReadOnlyMode {
2183 return new ReadOnlyMode(
2185 $services->getMainConfig()->get( MainConfigNames::ReadOnly ),
2186 $services->getMainConfig()->get( MainConfigNames::ReadOnlyFile )
2187 ),
2188 $services->getDBLoadBalancerFactory()
2189 );
2190 },
2191
2192 'RecentChangeFactory' => static function ( MediaWikiServices $services ): RecentChangeFactory {
2193 return $services->getRecentChangeStore();
2194 },
2195
2196 'RecentChangeLookup' => static function ( MediaWikiServices $services ): RecentChangeLookup {
2197 return $services->getRecentChangeStore();
2198 },
2199
2200 'RecentChangeRCFeedNotifier' => static function ( MediaWikiServices $services ): RecentChangeRCFeedNotifier {
2202 $services->getHookContainer(),
2203 new ServiceOptions( RecentChangeRCFeedNotifier::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
2204 );
2205 },
2206
2207 'RecentChangeStore' => static function ( MediaWikiServices $services ): RecentChangeStore {
2208 $extRegistry = ExtensionRegistry::getInstance();
2209 return new RecentChangeStore(
2210 $services->getActorStoreFactory(),
2211 $services->getChangeTagsStore(),
2212 $services->getConnectionProvider(),
2213 $services->getCommentStore(),
2214 $services->getHookContainer(),
2215 $services->getJobQueueGroup(),
2216 $services->getPermissionManager(),
2217 $services->getRecentChangeRCFeedNotifier(),
2218 new ServiceOptions( RecentChangeStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2219 $services->getTitleFormatter(),
2220 $services->getWikiPageFactory(),
2221 $services->getUserFactory(),
2222 $extRegistry->getAttribute( 'RecentChangeSources' )
2223 );
2224 },
2225
2226 'RedirectLookup' => static function ( MediaWikiServices $services ): RedirectLookup {
2227 return $services->getRedirectStore();
2228 },
2229
2230 'RedirectStore' => static function ( MediaWikiServices $services ): RedirectStore {
2232 $services->getConnectionProvider(),
2233 $services->getPageStore(),
2234 $services->getTitleParser(),
2235 $services->getRepoGroup(),
2236 LoggerFactory::getInstance( 'RedirectStore' ),
2237 $services->getLinkWriteDuplicator()
2238 );
2239 },
2240
2241 'RenameUserFactory' => static function ( MediaWikiServices $services ): RenameUserFactory {
2243 new ServiceOptions( RenameUserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2244 $services->getCentralIdLookupFactory(),
2245 $services->getConnectionProvider(),
2246 $services->getJobQueueGroupFactory(),
2247 $services->getMovePageFactory(),
2248 $services->getUserFactory(),
2249 $services->getUserNameUtils(),
2250 $services->getPermissionManager(),
2251 $services->getTitleFactory(),
2252 );
2253 },
2254
2255 'RepoGroup' => static function ( MediaWikiServices $services ): RepoGroup {
2256 $config = $services->getMainConfig();
2257 return new RepoGroup(
2258 $config->get( MainConfigNames::LocalFileRepo ),
2259 $config->get( MainConfigNames::ForeignFileRepos ),
2260 $services->getMainWANObjectCache(),
2261 $services->getMimeAnalyzer()
2262 );
2263 },
2264
2265 'ResourceLoader' => static function ( MediaWikiServices $services ): ResourceLoader {
2266 $config = $services->getMainConfig();
2267
2268 $maxage = $config->get( MainConfigNames::ResourceLoaderMaxage );
2269 $rl = new ResourceLoader(
2270 $config,
2271 LoggerFactory::getInstance( 'resourceloader' ),
2272 new DependencyStore( $services->getMainObjectStash() ),
2273 [
2274 'loadScript' => $config->get( MainConfigNames::LoadScript ),
2275 'maxageVersioned' => $maxage['versioned'] ?? null,
2276 'maxageUnversioned' => $maxage['unversioned'] ?? null,
2277 ]
2278 );
2279
2280 $extRegistry = ExtensionRegistry::getInstance();
2281 // Attribute has precedence over config
2282 $modules = $extRegistry->getAttribute( 'ResourceModules' )
2283 + $config->get( MainConfigNames::ResourceModules );
2284 $moduleSkinStyles = $extRegistry->getAttribute( 'ResourceModuleSkinStyles' )
2285 + $config->get( MainConfigNames::ResourceModuleSkinStyles );
2286
2287 $rl->setModuleSkinStyles( $moduleSkinStyles );
2288 $rl->addSource( $config->get( MainConfigNames::ResourceLoaderSources ) );
2289
2290 // Core modules, then extension/skin modules
2291 $rl->register( include MW_INSTALL_PATH . '/resources/Resources.php' );
2292 $rl->register( $modules );
2293 $hookRunner = new \MediaWiki\ResourceLoader\HookRunner( $services->getHookContainer() );
2294 $hookRunner->onResourceLoaderRegisterModules( $rl );
2295
2296 $msgPosterAttrib = $extRegistry->getAttribute( 'MessagePosterModule' );
2297 $rl->register( 'mediawiki.messagePoster', [
2298 'localBasePath' => MW_INSTALL_PATH,
2299 'debugRaw' => false,
2300 'scripts' => [
2301 'resources/src/mediawiki.messagePoster/factory.js',
2302 'resources/src/mediawiki.messagePoster/MessagePoster.js',
2303 'resources/src/mediawiki.messagePoster/WikitextMessagePoster.js',
2304 ...$msgPosterAttrib['scripts'] ?? [],
2305 ],
2306 'dependencies' => [
2307 'oojs',
2308 'mediawiki.api',
2309 'mediawiki.ForeignApi',
2310 ...$msgPosterAttrib['dependencies'] ?? [],
2311 ],
2312 ] );
2313
2314 if ( $config->get( MainConfigNames::EnableJavaScriptTest ) === true ) {
2315 $rl->registerTestModules();
2316 }
2317
2318 return $rl;
2319 },
2320
2321 'RestrictedUserGroupCheckerFactory' =>
2322 static function ( MediaWikiServices $services ): RestrictedUserGroupCheckerFactory {
2324 $services->getRestrictedUserGroupConfigReader(),
2325 $services->getUserRequirementsConditionChecker()
2326 );
2327 },
2328
2329 'RestrictedUserGroupConfigReader' =>
2330 static function ( MediaWikiServices $services ): RestrictedUserGroupConfigReader {
2332 new ServiceOptions(
2333 RestrictedUserGroupConfigReader::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2334 ),
2335 $services->getUserRequirementsConditionValidator()
2336 );
2337 },
2338
2339 'RestrictionStore' => static function ( MediaWikiServices $services ): RestrictionStore {
2341 new ServiceOptions(
2342 RestrictionStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2343 ),
2344 $services->getMainWANObjectCache(),
2345 $services->getDBLoadBalancerFactory(),
2346 $services->getLinkCache(),
2347 $services->getLinksMigration(),
2348 $services->getCommentStore(),
2349 $services->getHookContainer(),
2350 $services->getPageStore()
2351 );
2352 },
2353
2354 'RevertedTagUpdateManager' => static function ( MediaWikiServices $services ): RevertedTagUpdateManager {
2355 $editResultCache = new EditResultCache(
2356 $services->getMainObjectStash(),
2357 $services->getConnectionProvider(),
2358 new ServiceOptions(
2359 EditResultCache::CONSTRUCTOR_OPTIONS,
2360 $services->getMainConfig()
2361 )
2362 );
2363
2364 return new RevertedTagUpdateManager(
2365 $editResultCache,
2366 $services->getJobQueueGroup()
2367 );
2368 },
2369
2370 'RevisionFactory' => static function ( MediaWikiServices $services ): RevisionFactory {
2371 return $services->getRevisionStore();
2372 },
2373
2374 'RevisionLookup' => static function ( MediaWikiServices $services ): RevisionLookup {
2375 return $services->getRevisionStore();
2376 },
2377
2378 'RevisionRenderer' => static function ( MediaWikiServices $services ): RevisionRenderer {
2379 $renderer = new RevisionRenderer(
2380 $services->getDBLoadBalancer(),
2381 $services->getSlotRoleRegistry(),
2382 $services->getContentRenderer()
2383 );
2384
2385 $renderer->setLogger( LoggerFactory::getInstance( 'SaveParse' ) );
2386 return $renderer;
2387 },
2388
2389 'RevisionStore' => static function ( MediaWikiServices $services ): RevisionStore {
2390 return $services->getRevisionStoreFactory()->getRevisionStore();
2391 },
2392
2393 'RevisionStoreFactory' => static function ( MediaWikiServices $services ): RevisionStoreFactory {
2395 $services->getDBLoadBalancerFactory(),
2396 $services->getBlobStoreFactory(),
2397 $services->getNameTableStoreFactory(),
2398 $services->getSlotRoleRegistry(),
2399 $services->getMainWANObjectCache(),
2400 $services->getLocalServerObjectCache(),
2401 $services->getCommentStore(),
2402 $services->getActorStoreFactory(),
2403 LoggerFactory::getInstance( 'RevisionStore' ),
2404 $services->getContentHandlerFactory(),
2405 $services->getPageStoreFactory(),
2406 $services->getTitleFactory(),
2407 $services->getHookContainer(),
2408 $services->getRecentChangeLookup()
2409 );
2410 },
2411
2412 'RollbackPageFactory' => static function ( MediaWikiServices $services ): RollbackPageFactory {
2413 return $services->get( '_PageCommandFactory' );
2414 },
2415
2416 'RowCommentFormatter' => static function ( MediaWikiServices $services ): RowCommentFormatter {
2418 $services->getCommentParserFactory(),
2419 $services->getCommentStore()
2420 );
2421 },
2422
2423 'SBOMGenerator' => static function ( MediaWikiServices $services ): SBOMGenerator {
2425 $services->getConnectionProvider(),
2426 $services->getExtensionRegistry(),
2427 $services->getGlobalIdGenerator(),
2428 );
2429 },
2430
2431 'SearchEngineConfig' => static function ( MediaWikiServices $services ): SearchEngineConfig {
2433 new ServiceOptions(
2434 SearchEngineConfig::CONSTRUCTOR_OPTIONS,
2435 $services->getMainConfig()
2436 ),
2437 $services->getContentLanguage(),
2438 $services->getHookContainer(),
2439 ExtensionRegistry::getInstance()->getAttribute( 'SearchMappings' ),
2440 $services->getUserOptionsLookup()
2441 );
2442 },
2443
2444 'SearchEngineFactory' => static function ( MediaWikiServices $services ): SearchEngineFactory {
2446 $services->getSearchEngineConfig(),
2447 $services->getHookContainer(),
2448 $services->getConnectionProvider()
2449 );
2450 },
2451
2452 'SearchResultThumbnailProvider' => static function ( MediaWikiServices $services ): SearchResultThumbnailProvider {
2454 $services->getRepoGroup(),
2455 $services->getHookContainer()
2456 );
2457 },
2458
2459 'SessionManager' => static function ( MediaWikiServices $services ): SessionManagerInterface {
2461 $services->getMainConfig(),
2462 LoggerFactory::getInstance( 'session' ),
2463 $services->getCentralIdLookup(),
2464 $services->getHookContainer(),
2465 $services->getObjectFactory(),
2466 $services->getProxyLookup(),
2467 $services->getUrlUtils(),
2468 $services->getUserNameUtils(),
2469 $services->getSessionStore()
2470 );
2471 },
2472
2473 'SessionStore' => static function ( MediaWikiServices $services ): SessionStore {
2474 $objectCacheFactory = $services->getObjectCacheFactory();
2475 $mainConfig = $services->getMainConfig();
2476 $logger = LoggerFactory::getInstance( 'session' );
2477
2478 $anonCacheType = $mainConfig->get( MainConfigNames::AnonSessionCacheType );
2479 $authCacheType = $mainConfig->get( MainConfigNames::SessionCacheType );
2480
2481 if ( $anonCacheType !== false ) {
2482 return new MultiBackendSessionStore(
2483 $objectCacheFactory->getInstance( $anonCacheType ),
2484 $objectCacheFactory->getInstance( $authCacheType ),
2485 $logger,
2486 $services->getStatsFactory()
2487 );
2488 }
2489
2490 return new SingleBackendSessionStore(
2491 $objectCacheFactory->getInstance( $authCacheType ),
2492 $logger,
2493 $services->getStatsFactory()
2494 );
2495 },
2496
2497 'ShadowPageLoader' => static function ( MediaWikiServices $services ): ShadowPageLoader {
2499 $services->getObjectFactory(),
2500 ShadowPageLoader::CORE_SPECS,
2501 ExtensionRegistry::getInstance()->getAttribute( 'ShadowPageProviders' )
2502 );
2503 },
2504
2505 'ShellboxClientFactory' => static function ( MediaWikiServices $services ): ShellboxClientFactory {
2506 $urls = $services->getMainConfig()->get( MainConfigNames::ShellboxUrls );
2507
2508 return new ShellboxClientFactory(
2509 $services->getHttpRequestFactory(),
2510 $urls,
2511 $services->getMainConfig()->get( MainConfigNames::ShellboxSecretKey )
2512 );
2513 },
2514
2515 'ShellCommandFactory' => static function ( MediaWikiServices $services ): CommandFactory {
2516 $config = $services->getMainConfig();
2517
2518 $limits = [
2519 'time' => $config->get( MainConfigNames::MaxShellTime ),
2520 'walltime' => $config->get( MainConfigNames::MaxShellWallClockTime ),
2521 'memory' => $config->get( MainConfigNames::MaxShellMemory ),
2522 'filesize' => $config->get( MainConfigNames::MaxShellFileSize ),
2523 ];
2524 $cgroup = $config->get( MainConfigNames::ShellCgroup );
2525 $restrictionMethod = $config->get( MainConfigNames::ShellRestrictionMethod );
2526
2527 $factory = new CommandFactory( $services->getShellboxClientFactory(),
2528 $limits, $cgroup, $restrictionMethod );
2529 $factory->setLogger( LoggerFactory::getInstance( 'exec' ) );
2530 $factory->logStderr();
2531
2532 return $factory;
2533 },
2534
2535 'SignatureValidatorFactory' => static function ( MediaWikiServices $services ): SignatureValidatorFactory {
2537 new ServiceOptions(
2538 SignatureValidator::CONSTRUCTOR_OPTIONS,
2539 $services->getMainConfig()
2540 ),
2541 // Use closures for these to avoid a circular dependency on Parser
2542 static function () use ( $services ) {
2543 return $services->getParserFactory();
2544 },
2545 static function () use ( $services ) {
2546 return $services->getLintErrorChecker();
2547 },
2548 $services->getSpecialPageFactory(),
2549 $services->getTitleFactory(),
2550 );
2551 },
2552
2553 'SiteLookup' => static function ( MediaWikiServices $services ): SiteLookup {
2554 // Use SiteStore as the SiteLookup as well. This was originally separated
2555 // to allow for a cacheable read-only interface, but this was never used.
2556 // SiteStore has caching (see below).
2557 return $services->getSiteStore();
2558 },
2559
2560 'SiteStore' => static function ( MediaWikiServices $services ): SiteStore {
2561 $rawSiteStore = new DBSiteStore( $services->getConnectionProvider() );
2562
2563 // If php-apcu is not installed, then CachingSiteStore still avoids
2564 // repeat DB queries in the same request through an in-process cache.
2565 $cache = $services->getLocalServerObjectCache();
2566
2567 return new CachingSiteStore( $rawSiteStore, $cache );
2568 },
2569
2570 'SkinFactory' => static function ( MediaWikiServices $services ): SkinFactory {
2571 $factory = new SkinFactory(
2572 $services->getObjectFactory(),
2573 (array)$services->getMainConfig()->get( MainConfigNames::SkipSkins )
2574 );
2575
2576 $names = $services->getMainConfig()->get( MainConfigNames::ValidSkinNames );
2577
2578 foreach ( $names as $name => $skin ) {
2579 if ( is_array( $skin ) ) {
2580 $spec = $skin;
2581 $displayName = $skin['displayname'] ?? $name;
2582 $skippable = $skin['skippable'] ?? false;
2583 } else {
2584 $displayName = $skin;
2585 $skippable = false;
2586 $spec = [
2587 'name' => $name,
2588 'class' => "Skin$skin"
2589 ];
2590 }
2591 $factory->register( $name, $displayName, $spec, $skippable );
2592 }
2593
2594 // Register a hidden "fallback" skin
2595 $factory->register( 'fallback', 'Fallback', [
2596 'class' => SkinFallback::class,
2597 'args' => [
2598 [
2599 'name' => 'fallback',
2600 'menus' => [],
2601 'styles' => [ 'mediawiki.skinning.interface', 'mediawiki.codex.messagebox.styles' ],
2602 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/fallback',
2603 ]
2604 ]
2605 ], true );
2606 // Register a hidden skin for api output
2607 $factory->register( 'apioutput', 'ApiOutput', [
2608 'class' => SkinApi::class,
2609 'args' => [
2610 [
2611 'name' => 'apioutput',
2612 'menus' => [],
2613 'styles' => [ 'mediawiki.skinning.interface' ],
2614 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/apioutput',
2615 ]
2616 ]
2617 ], true );
2618 // Register a hidden skin for Special:UserLogin and Special:CreateAccount
2619 $factory->register( 'authentication-popup', 'Authentication popup', [
2620 'class' => SkinAuthenticationPopup::class,
2621 'args' => [
2622 [
2623 'name' => 'authentication-popup',
2624 'menus' => [],
2625 'styles' => [
2626 'mediawiki.skinning.interface',
2627 'mediawiki.special.userlogin.authentication-popup',
2628 ],
2629 'bodyClasses' => [ 'mw-authentication-popup' ],
2630 'responsive' => true,
2631 'messages' => [
2632 'sitesubtitle',
2633 'sitetitle',
2634 ],
2635 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/authentication-popup',
2636 ]
2637 ]
2638 ], true );
2639 // Register a hidden skin for outputting skin json
2640 $factory->register( 'json', 'SkinJSON', [
2641 'class' => SkinApi::class,
2642 'args' => [
2643 [
2644 'name' => 'json',
2645 'menus' => [],
2646 'styles' => [],
2647 'format' => 'json',
2648 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/apioutput',
2649 ]
2650 ]
2651 ], true );
2652
2653 return $factory;
2654 },
2655
2656 'SlotRoleRegistry' => static function ( MediaWikiServices $services ): SlotRoleRegistry {
2657 $registry = new SlotRoleRegistry(
2658 $services->getSlotRoleStore()
2659 );
2660
2661 $config = $services->getMainConfig();
2662 $contentHandlerFactory = $services->getContentHandlerFactory();
2663 $hookContainer = $services->getHookContainer();
2664 $titleFactory = $services->getTitleFactory();
2665 $registry->defineRole(
2666 SlotRecord::MAIN,
2667 static function () use ( $config, $contentHandlerFactory, $hookContainer, $titleFactory ) {
2668 return new MainSlotRoleHandler(
2669 $config->get( MainConfigNames::NamespaceContentModels ),
2670 $contentHandlerFactory,
2671 $hookContainer,
2672 $titleFactory
2673 );
2674 }
2675 );
2676
2677 return $registry;
2678 },
2679
2680 'SlotRoleStore' => static function ( MediaWikiServices $services ): NameTableStore {
2681 return $services->getNameTableStoreFactory()->getSlotRoles();
2682 },
2683
2684 'SpamChecker' => static function ( MediaWikiServices $services ): SpamChecker {
2685 return new SpamChecker(
2686 (array)$services->getMainConfig()->get( MainConfigNames::SpamRegex ),
2687 (array)$services->getMainConfig()->get( MainConfigNames::SummarySpamRegex )
2688 );
2689 },
2690
2691 'SpecialPageFactory' => static function ( MediaWikiServices $services ): SpecialPageFactory {
2693 new ServiceOptions(
2694 SpecialPageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2695 $services->getContentLanguage(),
2696 $services->getObjectFactory(),
2697 $services->getTitleFactory(),
2698 $services->getHookContainer(),
2699 $services->getStatsFactory(),
2700 );
2701 },
2702
2703 'StatsdDataFactory' => static function ( MediaWikiServices $services ): IBufferingStatsdDataFactory {
2705 },
2706
2707 'StatsFactory' => static function ( MediaWikiServices $services ): StatsFactory {
2708 $config = $services->getMainConfig();
2709 $format = OutputFormats::getFormatFromString(
2710 $config->get( MainConfigNames::StatsFormat ) ?? 'null'
2711 );
2712 $cache = new StatsCache;
2713 $emitter = OutputFormats::getNewEmitter(
2714 $config->get( MainConfigNames::StatsPrefix ),
2715 $cache,
2716 OutputFormats::getNewFormatter( $format ),
2717 $config->get( MainConfigNames::StatsTarget )
2718 );
2719 return new StatsFactory( $cache, $emitter, LoggerFactory::getInstance( 'Stats' ) );
2720 },
2721
2722 'TalkPageNotificationManager' => static function (
2723 MediaWikiServices $services
2726 new ServiceOptions(
2727 TalkPageNotificationManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2728 ),
2729 $services->getConnectionProvider(),
2730 $services->getReadOnlyMode(),
2731 $services->getRevisionLookup(),
2732 $services->getHookContainer(),
2733 $services->getUserFactory()
2734 );
2735 },
2736
2737 'TempFSFileFactory' => static function ( MediaWikiServices $services ): TempFSFileFactory {
2738 return new TempFSFileFactory( $services->getMainConfig()->get( MainConfigNames::TmpDirectory ) );
2739 },
2740
2741 'TempUserConfig' => static function ( MediaWikiServices $services ): RealTempUserConfig {
2743 $services->getMainConfig()->get( MainConfigNames::AutoCreateTempUser )
2744 );
2745 },
2746
2747 'TempUserCreator' => static function ( MediaWikiServices $services ): TempUserCreator {
2749 $services->getTempUserConfig(),
2750 $services->getObjectFactory(),
2751 $services->getUserFactory(),
2752 $services->getAuthManager(),
2753 $services->getCentralIdLookup(),
2754 // This should match ThrottlePreAuthenticationProvider's daily limit
2755 // and also implements its own short-term throttling limit (See T405565).
2756 new Throttler(
2757 $services->getMainConfig()->get( MainConfigNames::TempAccountCreationThrottle ),
2758 [
2759 'type' => 'tempacctcreate',
2760 'cache' => $services->getObjectCacheFactory()->getLocalClusterInstance(),
2761 ]
2762 ),
2763 new Throttler(
2764 $services->getMainConfig()->get( MainConfigNames::TempAccountNameAcquisitionThrottle ),
2765 [
2766 'type' => 'tempacctnameacquisition',
2767 'cache' => $services->getObjectCacheFactory()->getLocalClusterInstance(),
2768 ]
2769 )
2770 );
2771 },
2772
2773 'TempUserDetailsLookup' => static function ( MediaWikiServices $services ): TempUserDetailsLookup {
2775 $services->getTempUserConfig(),
2776 $services->getUserRegistrationLookup()
2777 );
2778 },
2779
2780 'TextboxBuilder' => static function ( MediaWikiServices $services ): TextboxBuilder {
2782 $services->getPermissionManager(),
2783 $services->getRestrictionStore(),
2784 $services->getUserOptionsLookup(),
2785 );
2786 },
2787
2788 'Tidy' => static function ( MediaWikiServices $services ): TidyDriverBase {
2789 return new RemexDriver(
2790 new ServiceOptions(
2791 RemexDriver::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2792 )
2793 );
2794 },
2795
2796 'TitleFactory' => static function ( MediaWikiServices $services ): TitleFactory {
2797 return new TitleFactory();
2798 },
2799
2800 'TitleFormatter' => static function ( MediaWikiServices $services ): TitleFormatter {
2802 $services->getContentLanguage(),
2803 $services->getGenderCache(),
2804 $services->getNamespaceInfo()
2805 );
2806 },
2807
2808 'TitleMatcher' => static function ( MediaWikiServices $services ): TitleMatcher {
2809 return new TitleMatcher(
2810 $services->getContentLanguage(),
2811 $services->getLanguageConverterFactory(),
2812 $services->getHookContainer(),
2813 $services->getWikiPageFactory(),
2814 $services->getRepoGroup(),
2815 $services->getTitleFactory()
2816 );
2817 },
2818
2819 'TitleParser' => static function ( MediaWikiServices $services ): TitleParser {
2820 return new TitleParser(
2821 $services->getContentLanguage(),
2822 $services->getInterwikiLookup(),
2823 $services->getNamespaceInfo(),
2824 $services->getMainConfig()->get( MainConfigNames::LocalInterwikis )
2825 );
2826 },
2827
2828 'Tracer' => static function ( MediaWikiServices $services ): TracerInterface {
2829 $xReqIdPropagator = new MediaWikiPropagator( Telemetry::getInstance() );
2830 $otelConfig = $services->getMainConfig()->get( MainConfigNames::OpenTelemetryConfig );
2831 if ( $otelConfig === null || ( wfIsCLI() && !defined( 'MW_PHPUNIT_TEST' ) ) ) {
2832 if ( $services->getMainConfig()->get( MainConfigNames::GenerateReqIDFormat ) === 'uuid4' ) {
2833 Telemetry::getInstance()->overrideRequestId( $services->getGlobalIdGenerator()->newUUIDv4() );
2834 }
2835 return new NoopTracer( $xReqIdPropagator );
2836 }
2837
2838 $tracerState = TracerState::getInstance();
2839 $exporter = new OtlpHttpExporter(
2840 $services->getService( '_TracerHTTPClient' ),
2841 new HttpFactory(),
2842 LoggerFactory::getInstance( 'tracing' ),
2843 $otelConfig['endpoint'],
2844 $otelConfig['serviceName'],
2845 wfHostname()
2846 );
2847
2848 return new Tracer(
2849 new Clock(),
2850 new ProbabilisticSampler( $otelConfig['samplingProbability'] ),
2851 $exporter,
2852 $tracerState,
2853 new CompositePropagator( [ $xReqIdPropagator, new W3CTraceContextPropagator() ] )
2854 );
2855 },
2856
2857 'TrackingCategories' => static function ( MediaWikiServices $services ): TrackingCategories {
2859 new ServiceOptions(
2860 TrackingCategories::CONSTRUCTOR_OPTIONS,
2861 $services->getMainConfig()
2862 ),
2863 $services->getExtensionRegistry(),
2864 $services->getNamespaceInfo(),
2865 $services->getTitleParser(),
2866 LoggerFactory::getInstance( 'TrackingCategories' )
2867 );
2868 },
2869
2870 'UnblockUserFactory' => static function ( MediaWikiServices $services ): UnblockUserFactory {
2871 return $services->getService( '_UserBlockCommandFactory' );
2872 },
2873
2874 'UndeletePageFactory' => static function ( MediaWikiServices $services ): UndeletePageFactory {
2875 return $services->getService( '_PageCommandFactory' );
2876 },
2877
2878 'UploadRevisionImporter' => static function ( MediaWikiServices $services ): UploadRevisionImporter {
2880 $services->getMainConfig()->get( MainConfigNames::EnableUploads ),
2881 LoggerFactory::getInstance( 'UploadRevisionImporter' )
2882 );
2883 },
2884
2885 'UploadVerification' => static function ( MediaWikiServices $services ): UploadVerification {
2887 new ServiceOptions(
2888 UploadVerification::CONSTRUCTOR_OPTIONS,
2889 $services->getMainConfig()
2890 ),
2891 $services->getMimeAnalyzer(),
2892 new SVGCSSChecker
2893 );
2894 },
2895
2896 'UrlUtils' => static function ( MediaWikiServices $services ): UrlUtils {
2897 $config = $services->getMainConfig();
2898 return new UrlUtils( [
2899 UrlUtils::SERVER => $config->get( MainConfigNames::Server ),
2900 UrlUtils::CANONICAL_SERVER => $config->get( MainConfigNames::CanonicalServer ),
2901 UrlUtils::INTERNAL_SERVER => $config->get( MainConfigNames::InternalServer ),
2902 UrlUtils::FALLBACK_PROTOCOL => RequestContext::getMain()->getRequest()->getProtocol(),
2903 UrlUtils::HTTPS_PORT => $config->get( MainConfigNames::HttpsPort ),
2904 UrlUtils::VALID_PROTOCOLS => $config->get( MainConfigNames::UrlProtocols ),
2905 ] );
2906 },
2907
2908 'UserCache' => static function ( MediaWikiServices $services ): UserCache {
2909 return new UserCache(
2910 LoggerFactory::getInstance( 'UserCache' ),
2911 $services->getConnectionProvider(),
2912 $services->getLinkBatchFactory()
2913 );
2914 },
2915
2916 'UserEditTracker' => static function ( MediaWikiServices $services ): UserEditTracker {
2918 $services->getActorStoreFactory(),
2919 $services->getConnectionProvider(),
2920 $services->getJobQueueGroup(),
2921 $services->getMainWANObjectCache()
2922 );
2923 },
2924
2925 'UserFactory' => static function ( MediaWikiServices $services ): UserFactory {
2926 return new UserFactory(
2927 new ServiceOptions(
2928 UserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2929 ),
2930 $services->getDBLoadBalancerFactory(),
2931 $services->getUserNameUtils(),
2932 $services->getTempUserConfig()
2933 );
2934 },
2935
2936 'UserGroupAssignmentService' => static function ( MediaWikiServices $services ): UserGroupAssignmentService {
2938 $services->getUserGroupManagerFactory(),
2939 $services->getUserNameUtils(),
2940 $services->getUserFactory(),
2941 $services->getRestrictedUserGroupCheckerFactory(),
2942 new HookRunner( $services->getHookContainer() ),
2943 new ServiceOptions(
2944 UserGroupAssignmentService::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2945 ),
2946 $services->getTempUserConfig(),
2947 $services->getConnectionProvider(),
2948 $services->getPageStoreFactory(),
2949 );
2950 },
2951
2952 'UserGroupManager' => static function ( MediaWikiServices $services ): UserGroupManager {
2953 return $services->getUserGroupManagerFactory()->getUserGroupManager();
2954 },
2955
2956 'UserGroupManagerFactory' => static function ( MediaWikiServices $services ): UserGroupManagerFactory {
2958 new ServiceOptions(
2959 UserGroupManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2960 ),
2961 $services->getReadOnlyMode(),
2962 $services->getDBLoadBalancerFactory(),
2963 $services->getHookContainer(),
2964 $services->getJobQueueGroupFactory(),
2965 $services->getTempUserConfig(),
2966 $services->getUserFactory(),
2967 $services->getUserRequirementsConditionCheckerFactory(),
2968 $services->getRestrictedUserGroupConfigReader(),
2969 [ static function ( UserIdentity $user ) use ( $services ) {
2970 if ( $user->getWikiId() === UserIdentity::LOCAL ) {
2971 $services->getPermissionManager()->invalidateUsersRightsCache( $user );
2972 }
2973 $services->getUserFactory()->invalidateCache( $user );
2974 } ]
2975 );
2976 },
2977
2978 'UserIdentityLookup' => static function ( MediaWikiServices $services ): UserIdentityLookup {
2979 return $services->getActorStoreFactory()->getUserIdentityLookup();
2980 },
2981
2982 'UserIdentityUtils' => static function ( MediaWikiServices $services ): UserIdentityUtils {
2984 $services->getTempUserConfig()
2985 );
2986 },
2987
2988 'UserLinkRenderer' => static function ( MediaWikiServices $services ): UserLinkRenderer {
2990 $services->getHookContainer(),
2991 $services->getTempUserConfig(),
2992 $services->getSpecialPageFactory(),
2993 $services->getLinkRenderer(),
2994 $services->getTempUserDetailsLookup(),
2995 $services->getUserIdentityLookup(),
2996 $services->getUserNameUtils()
2997 );
2998 },
2999
3000 'UserNamePrefixSearch' => static function ( MediaWikiServices $services ): UserNamePrefixSearch {
3002 $services->getConnectionProvider(),
3003 $services->getUserNameUtils(),
3004 $services->getHideUserUtils()
3005 );
3006 },
3007
3008 'UserNameUtils' => static function ( MediaWikiServices $services ): UserNameUtils {
3009 $messageFormatterFactory = new MessageFormatterFactory( Message::FORMAT_PLAIN );
3010 return new UserNameUtils(
3011 new ServiceOptions(
3012 UserNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
3013 ),
3014 $services->getContentLanguage(),
3015 LoggerFactory::getInstance( 'UserNameUtils' ),
3016 $services->getTitleParser(),
3017 $messageFormatterFactory->getTextFormatter(
3018 $services->getContentLanguageCode()->toString()
3019 ),
3020 $services->getHookContainer(),
3021 $services->getTempUserConfig()
3022 );
3023 },
3024
3025 'UserOptionsLookup' => static function ( MediaWikiServices $services ): UserOptionsLookup {
3026 return $services->getUserOptionsManager();
3027 },
3028
3029 'UserOptionsManager' => static function ( MediaWikiServices $services ): UserOptionsManager {
3031 new ServiceOptions( UserOptionsManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3032 $services->get( '_DefaultOptionsLookup' ),
3033 $services->getLanguageConverterFactory(),
3034 $services->getConnectionProvider(),
3035 LoggerFactory::getInstance( 'UserOptionsManager' ),
3036 $services->getHookContainer(),
3037 $services->getUserFactory(),
3038 $services->getUserNameUtils(),
3039 $services->getObjectFactory(),
3040 ExtensionRegistry::getInstance()->getAttribute( 'UserOptionsStoreProviders' )
3041 );
3042 },
3043
3044 'UserRegistrationLookup' => static function ( MediaWikiServices $services ): UserRegistrationLookup {
3045 $lookup = new UserRegistrationLookup(
3046 new ServiceOptions( UserRegistrationLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3047 $services->getObjectFactory()
3048 );
3049 if ( !$lookup->isRegistered( LocalUserRegistrationProvider::TYPE ) ) {
3050 throw new ConfigException( 'UserRegistrationLookup: Local provider is required' );
3051 }
3052 return $lookup;
3053 },
3054
3055 'UserRequirementsConditionChecker' => static function (
3056 MediaWikiServices $services
3058 {
3059 return $services->getUserRequirementsConditionCheckerFactory()
3060 ->getUserRequirementsConditionChecker( $services->getUserGroupManager() );
3061 },
3062
3063 'UserRequirementsConditionCheckerFactory' => static function (
3064 MediaWikiServices $services
3066 {
3068 new ServiceOptions(
3069 UserRequirementsConditionCheckerFactory::CONSTRUCTOR_OPTIONS,
3070 $services->getMainConfig()
3071 ),
3072 $services->getGroupPermissionsLookup(),
3073 $services->getHookContainer(),
3074 $services->getUserEditTracker(),
3075 $services->getUserRegistrationLookup(),
3076 $services->getUserFactory(),
3077 RequestContext::getMain(),
3078 $services->getUserRequirementsConditionValidator(),
3079 );
3080 },
3081
3082 'UserRequirementsConditionValidator' => static function (): UserRequirementsConditionValidator {
3084 LoggerFactory::getInstance( 'UserGroupManager' ),
3085 );
3086 },
3087
3088 'WatchedItemQueryService' => static function ( MediaWikiServices $services ): WatchedItemQueryService {
3090 $services->getConnectionProvider(),
3091 $services->getWatchedItemStore(),
3092 $services->getMainConfig()->get( MainConfigNames::WatchlistExpiry ),
3093 $services->getMainConfig()->get( MainConfigNames::MaxExecutionTimeForExpensiveQueries )
3094 );
3095 },
3096
3097 'WatchedItemStore' => static function ( MediaWikiServices $services ): WatchedItemStore {
3098 $store = new WatchedItemStore(
3099 new ServiceOptions( WatchedItemStore::CONSTRUCTOR_OPTIONS,
3100 $services->getMainConfig() ),
3101 $services->getDBLoadBalancerFactory(),
3102 $services->getJobQueueGroup(),
3103 $services->getMainObjectStash(),
3104 new HashBagOStuff( [ 'maxKeys' => 100 ] ),
3105 $services->getReadOnlyMode(),
3106 $services->getNamespaceInfo(),
3107 $services->getRevisionLookup(),
3108 $services->getLinkBatchFactory(),
3109 $services->getWatchlistLabelStore()
3110 );
3111
3112 if ( $services->getMainConfig()->get( MainConfigNames::ReadOnlyWatchedItemStore ) ) {
3113 $store = new NoWriteWatchedItemStore( $store );
3114 }
3115
3116 return $store;
3117 },
3118
3119 'WatchlistLabelStore' => static function ( MediaWikiServices $services ): WatchlistLabelStore {
3121 $services->getConnectionProvider(),
3122 LoggerFactory::getInstance( 'WatchlistLabels' ),
3123 $services->getMainConfig()
3124 );
3125 },
3126
3127 'WatchlistManager' => static function ( MediaWikiServices $services ): WatchlistManager {
3129 [
3130 WatchlistManager::OPTION_ENOTIF => RecentChangeStore::isEnotifEnabled(
3131 new ServiceOptions( RecentChangeStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
3132 ),
3133 ],
3134 $services->getHookContainer(),
3135 $services->getReadOnlyMode(),
3136 $services->getRevisionLookup(),
3137 $services->getTalkPageNotificationManager(),
3138 $services->getWatchedItemStore(),
3139 $services->getWatchlistLabelStore(),
3140 $services->getUserFactory(),
3141 $services->getNamespaceInfo(),
3142 $services->getWikiPageFactory()
3143 );
3144 },
3145
3146 'WikiExporterFactory' => static function ( MediaWikiServices $services ): WikiExporterFactory {
3148 $services->getHookContainer(),
3149 $services->getRevisionStore(),
3150 $services->getTitleParser(),
3151 $services->getCommentStore()
3152 );
3153 },
3154
3155 'WikiImporterFactory' => static function ( MediaWikiServices $services ): WikiImporterFactory {
3157 $services->getMainConfig(),
3158 $services->getHookContainer(),
3159 $services->getContentLanguage(),
3160 $services->getNamespaceInfo(),
3161 $services->getTitleFactory(),
3162 $services->getWikiPageFactory(),
3163 $services->getWikiRevisionUploadImporter(),
3164 $services->getContentHandlerFactory(),
3165 $services->getSlotRoleRegistry()
3166 );
3167 },
3168
3169 'WikiPageFactory' => static function ( MediaWikiServices $services ): WikiPageFactory {
3171 $services->getTitleFactory(),
3172 new HookRunner( $services->getHookContainer() ),
3173 $services->getDBLoadBalancerFactory()
3174 );
3175 },
3176
3177 'WikiRevisionOldRevisionImporterNoUpdates' => static function (
3178 MediaWikiServices $services
3181 false,
3182 LoggerFactory::getInstance( 'OldRevisionImporter' ),
3183 $services->getConnectionProvider(),
3184 $services->getRevisionStoreFactory()->getRevisionStoreForImport(),
3185 $services->getSlotRoleRegistry(),
3186 $services->getWikiPageFactory(),
3187 $services->getPageUpdaterFactory(),
3188 $services->getUserFactory()
3189 );
3190 },
3191
3192 'WRStatsFactory' => static function ( MediaWikiServices $services ): WRStatsFactory {
3194 new BagOStuffStatsStore( $services->getMicroStash() )
3195 );
3196 },
3197
3198 '_ConditionalDefaultsLookup' => static function (
3199 MediaWikiServices $services
3202 new ServiceOptions(
3203 ConditionalDefaultsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
3204 ),
3205 $services->getUserRegistrationLookup(),
3206 $services->getUserIdentityUtils(),
3207 LoggerFactory::getInstance( 'preferences' ),
3208 static function () use ( $services ) {
3209 return $services->getUserGroupManager();
3210 }
3211 );
3212 },
3213
3214 '_DefaultOptionsLookup' => static function ( MediaWikiServices $services ): DefaultOptionsLookup {
3216 new ServiceOptions( DefaultOptionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3217 $services->getContentLanguageCode(),
3218 $services->getHookContainer(),
3219 $services->getNamespaceInfo(),
3220 $services->get( '_ConditionalDefaultsLookup' ),
3221 $services->getUserIdentityLookup(),
3222 $services->getUserNameUtils()
3223 );
3224 },
3225
3226 '_DomainEventDispatcher' => static function ( MediaWikiServices $services ): EventDispatchEngine {
3227 $dispatcher = new EventDispatchEngine(
3228 $services->getObjectFactory()
3229 );
3230
3231 // Core event wiring.
3232 // TODO: move this to a more prominent location? A separate file?
3233
3234 // Establish the propagation of events to various components
3235 $dispatcher->registerSubscriber( ChangeTrackingEventIngress::OBJECT_SPEC );
3236 $dispatcher->registerSubscriber( SearchEventIngress::OBJECT_SPEC );
3237 $dispatcher->registerSubscriber( LanguageEventIngress::OBJECT_SPEC );
3238
3239 $extensionRegistry = $services->getExtensionRegistry();
3240 $dispatcher->registerSubscriber( $extensionRegistry );
3241
3242 return $dispatcher;
3243 },
3244
3245 '_EditConstraintFactory' => static function ( MediaWikiServices $services ): EditConstraintFactory {
3246 // This service is internal and currently only exists because a significant number
3247 // of dependencies will be needed by different constraints. It is not part of
3248 // the public interface and has no corresponding method in MediaWikiServices
3250 // Multiple
3251 new ServiceOptions(
3252 EditConstraintFactory::CONSTRUCTOR_OPTIONS,
3253 $services->getMainConfig()
3254 ),
3255
3256 // EditFilterMergedContentHookConstraint
3257 $services->getHookContainer(),
3258
3259 // ReadOnlyConstraint
3260 $services->getReadOnlyMode(),
3261
3262 // SpamRegexConstraint
3263 $services->getSpamChecker(),
3264 // The wpAntispam check in EditPage::internalAttemptSave uses the 'SimpleAntiSpam' channel, but
3265 // SpamRegexConstraint uses 'SpamRegex'.
3266 // TODO can they be combined into the same channel?
3267 LoggerFactory::getProvider()->getLogger( 'SpamRegex' ),
3268
3269 // LinkPurgeRateLimitConstraint
3270 $services->getRateLimiter(),
3271
3272 // RedirectConstraint
3273 $services->getRedirectLookup(),
3274
3275 // AccidentalRecreationConstraint
3276 $services->getConnectionProvider(),
3277 $services->getLogFormatterFactory(),
3278
3279 // EditFilterMergedContentHookConstraint
3280 $services->getUserFactory(),
3281 );
3282 },
3283
3284 '_NotificationMiddlewareChain' => static function ( MediaWikiServices $services ): MiddlewareChain {
3286 $services->getObjectFactory(),
3287 ExtensionRegistry::getInstance()->getAttribute( 'NotificationMiddleware' )
3288 );
3289 },
3290
3291 '_PageCommandFactory' => static function ( MediaWikiServices $services ): PageCommandFactory {
3293 $services->getMainConfig(),
3294 $services->getDBLoadBalancerFactory(),
3295 $services->getNamespaceInfo(),
3296 $services->getWatchedItemStore(),
3297 $services->getRepoGroup(),
3298 $services->getReadOnlyMode(),
3299 $services->getContentHandlerFactory(),
3300 $services->getRevisionStoreFactory(),
3301 $services->getSpamChecker(),
3302 $services->getTitleFormatter(),
3303 $services->getHookContainer(),
3304 $services->getDomainEventDispatcher(),
3305 $services->getWikiPageFactory(),
3306 $services->getUserFactory(),
3307 $services->getActorMigration(),
3308 $services->getActorNormalization(),
3309 $services->getTitleFactory(),
3310 $services->getUserEditTracker(),
3311 $services->getCollationFactory(),
3312 $services->getJobQueueGroup(),
3313 $services->getCommentStore(),
3314 $services->getMainObjectStash(),
3315 WikiMap::getCurrentWikiDbDomain()->getId(),
3316 WebRequest::getRequestId(),
3317 $services->getBacklinkCacheFactory(),
3318 LoggerFactory::getInstance( 'UndeletePage' ),
3319 $services->getPageUpdaterFactory(),
3320 $services->getMessageFormatterFactory()->getTextFormatter(
3321 $services->getContentLanguageCode()->toString()
3322 ),
3323 $services->getArchivedRevisionLookup(),
3324 $services->getRestrictionStore(),
3325 $services->getLinkTargetLookup(),
3326 $services->getRedirectStore(),
3327 $services->getLogFormatterFactory(),
3328 $services->getLinkWriteDuplicator()
3329 );
3330 },
3331
3332 '_PageEditFactory' => static function ( MediaWikiServices $services ): PageEditFactory {
3334 new ServiceOptions( PageEditFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3335 $services->getContentHandlerFactory(),
3336 $services->getService( '_EditConstraintFactory' ),
3337 $services->getConnectionProvider(),
3338 $services->getContentLanguage(),
3339 $services->getContentTransformer(),
3340 LoggerFactory::getInstance( 'EditConflict' ),
3341 $services->getService( '_PageEditingHelper' ),
3342 $services->getRateLimiter(),
3343 $services->getRevisionStore(),
3344 $services->getShadowPageLoader(),
3345 $services->getTitleFormatter(),
3346 $services->getUserOptionsLookup(),
3347 $services->getWatchlistManager(),
3348 $services->getWatchedItemStore(),
3349 $services->getWikiPageFactory(),
3350 );
3351 },
3352
3353 '_PageEditingHelper' => static function ( MediaWikiServices $services ): PageEditingHelper {
3355 new ServiceOptions( PageEditingHelper::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3356 $services->getContentHandlerFactory(),
3357 $services->getParserFactory(),
3358 $services->getRevisionStore(),
3359 );
3360 },
3361
3362 '_ParserObserver' => static function ( MediaWikiServices $services ): ParserObserver {
3363 return new ParserObserver( LoggerFactory::getInstance( 'DuplicateParse' ) );
3364 },
3365
3366 '_Parsoid' => static function ( MediaWikiServices $services ): Parsoid {
3367 return new Parsoid(
3368 $services->getParsoidSiteConfig(),
3369 $services->getParsoidDataAccess()
3370 );
3371 },
3372
3373 '_SettingsBuilder' => static function ( MediaWikiServices $services ): SettingsBuilder {
3374 return SettingsBuilder::getInstance();
3375 },
3376
3377 '_SqlBlobStore' => static function ( MediaWikiServices $services ): SqlBlobStore {
3378 return $services->getBlobStoreFactory()->newSqlBlobStore();
3379 },
3380
3381 '_TracerHTTPClient' => static function (): ClientInterface {
3382 return new Client( [ 'http_errors' => false ] );
3383 },
3384
3385 '_UserBlockCommandFactory' => static function ( MediaWikiServices $services ): UserBlockCommandFactory {
3387 new ServiceOptions( UserBlockCommandFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3388 $services->getHookContainer(),
3389 $services->getBlockPermissionCheckerFactory(),
3390 $services->getBlockTargetFactory(),
3391 $services->getDatabaseBlockStore(),
3392 $services->getBlockRestrictionStore(),
3393 $services->getUserFactory(),
3394 $services->getUserEditTracker(),
3395 LoggerFactory::getInstance( 'BlockManager' ),
3396 $services->getTitleFactory(),
3397 $services->getBlockActionInfo()
3398 );
3399 }
3400
3401];
3402
3403// @codeCoverageIgnoreEnd
wfIsCLI()
Check if we are running from the commandline.
const CACHE_ACCEL
Definition Defines.php:76
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...
wfHostname()
Get host name of the current machine, for use in error reporting.
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(), $services->getContentHandlerFactory());}, '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->getChangeTagsStore(), $services->getObjectFactory(), $services->getObjectCacheFactory(), $services->getHookContainer(), $services->getReadOnlyMode(), $services->getUserNameUtils(), $services->getBlockManager(), $services->getWatchlistManager(), $services->getDBLoadBalancer(), $services->getContentLanguage(), $services->getLanguageConverterFactory(), $services->getBotPasswordStore(), $services->getUserFactory(), $services->getUserIdentityLookup(), $services->getUserIdentityUtils(), $services->getUserOptionsManager(), $services->getNotificationService(), $services->getSessionManager());$authManager->setLogger(LoggerFactory::getInstance( 'authentication'));$authManager->setAuthEventsLogger(LoggerFactory::getInstance( 'authevents'));return $authManager;}, 'AutoblockExemptionList'=> static function(MediaWikiServices $services):AutoblockExemptionList { $messageFormatterFactory=new MessageFormatterFactory(Message::FORMAT_PLAIN);return new AutoblockExemptionList(new ServiceOptions(AutoblockExemptionList::CONSTRUCTOR_OPTIONS, $services->getMainConfig(),), LoggerFactory::getInstance( 'AutoblockExemptionList'), $messageFormatterFactory->getTextFormatter($services->getContentLanguageCode() ->toString()));}, 'BacklinkCacheFactory'=> static function(MediaWikiServices $services):BacklinkCacheFactory { return new BacklinkCacheFactory(new ServiceOptions(BacklinkCache::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getLinksMigration(), $services->getMainWANObjectCache(), $services->getHookContainer(), $services->getConnectionProvider(), $services->getRestrictionStore(), LoggerFactory::getInstance( 'BacklinkCache'));}, '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(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->getBlockTargetFactory(), $services->getProxyLookup());}, 'BlockPermissionCheckerFactory'=> static function(MediaWikiServices $services):BlockPermissionCheckerFactory { return new BlockPermissionCheckerFactory(new ServiceOptions(BlockPermissionCheckerFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getBlockTargetFactory());}, 'BlockRestrictionStore'=> static function(MediaWikiServices $services):BlockRestrictionStore { return $services->getBlockRestrictionStoreFactory() ->getBlockRestrictionStore(WikiAwareEntity::LOCAL);}, 'BlockRestrictionStoreFactory'=> static function(MediaWikiServices $services):BlockRestrictionStoreFactory { return new BlockRestrictionStoreFactory($services->getDBLoadBalancerFactory());}, 'BlockTargetFactory'=> static function(MediaWikiServices $services):BlockTargetFactory { return $services->getCrossWikiBlockTargetFactory() ->getFactory();}, '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($services->getCrossWikiBlockTargetFactory());}, '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());}, 'ChangesListQueryFactory'=> static function(MediaWikiServices $services):ChangesListQueryFactory { return new ChangesListQueryFactory(new ServiceOptions(ChangesListQueryFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getRecentChangeLookup(), $services->getWatchedItemStore(), $services->getTempUserConfig(), $services->getUserFactory(), $services->getLinkTargetLookup(), $services->getChangeTagsStore(), $services->getStatsFactory(), $services->getSlotRoleStore(), LoggerFactory::getInstance( 'ChangesListQuery'), $services->getConnectionProvider(),);}, 'ChangeTagDefStore'=> static function(MediaWikiServices $services):NameTableStore { return $services->getNameTableStoreFactory() ->getChangeTagDef();}, 'ChangeTagsFormatter'=> static function(MediaWikiServices $services):ChangeTagsFormatter { return new ChangeTagsFormatter(new ServiceOptions(ChangeTagsFormatter::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getChangeTagsStore(), $services->getMainWANObjectCache(), $services->getLanguageFactory(),);}, 'ChangeTagsStore'=> static function(MediaWikiServices $services):ChangeTagsStore { return $services->getChangeTagsStoreFactory() ->getChangeTagsStore();}, 'ChangeTagsStoreFactory'=> static function(MediaWikiServices $services):ChangeTagsStoreFactory { return new ChangeTagsStoreFactory($services->getConnectionProvider(), $services->getNameTableStoreFactory(), $services->getMainWANObjectCache(), $services->getHookContainer(), LoggerFactory::getInstance( 'ChangeTags'), $services->getUserFactory(), new ServiceOptions(ChangeTagsStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'ChangeToolsFactory'=> static function(MediaWikiServices $services):ChangeToolsFactory { return new ChangeToolsFactory(new HookRunner( $services->getHookContainer()), $services->getLinkRenderer(),);}, 'ChronologyProtector'=> static function(MediaWikiServices $services):ChronologyProtector { $mainConfig=$services->getMainConfig();$microStashIsDatabase=$services->getObjectCacheFactory() ->isDatabaseId($mainConfig->get(MainConfigNames::MicroStashType));$cpStash=$microStashIsDatabase ? new EmptyBagOStuff() :$services->getMicroStash();$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;}, 'CodeHighlighter'=> static function(MediaWikiServices $services):CodeHighlighter { return new CodeHighlighter($services->getObjectFactory(), ExtensionRegistry::getInstance() ->getAttribute( 'CodeHighlightProviders'),);}, '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(), $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));}, 'ConfirmEmailBuilderFactory'=> static function(MediaWikiServices $services):ConfirmEmailBuilderFactory { return new ConfirmEmailBuilderFactory($services->getLocalServerObjectCache(), $services->getUrlUtils());}, 'ConfirmEmailSender'=> static function(MediaWikiServices $services):ConfirmEmailSender { return new ConfirmEmailSender(new ServiceOptions(ConfirmEmailSender::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), new HookRunner( $services->getHookContainer()), $services->getUserFactory(), $services->getEmailer(), $services->getConfirmEmailBuilderFactory(), LoggerFactory::getInstance( 'confirmemail'));}, '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'));}, 'ContentJsonCodec'=> static function(MediaWikiServices $services):ContentJsonCodec { return new ContentJsonCodec($services->getContentHandlerFactory(),);}, 'ContentLanguage'=> static function(MediaWikiServices $services):Language { return $services->getLanguageFactory() ->getLanguage($services->getMainConfig() ->get(MainConfigNames::LanguageCode));}, 'ContentLanguageCode'=> static function(MediaWikiServices $services):LanguageCode { return $services->getLanguageFactory() ->getLanguageCode($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);}, 'CrossWikiBlockTargetFactory'=> static function(MediaWikiServices $services):CrossWikiBlockTargetFactory { return new CrossWikiBlockTargetFactory(new ServiceOptions(CrossWikiBlockTargetFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getActorStoreFactory(), $services->getUserNameUtils());}, '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->getCrossWikiBlockTargetFactory(), $services->getAutoblockExemptionList(), $services->getSessionManager());}, 'DatabaseFactory'=> static function(MediaWikiServices $services):DatabaseFactory { return new DatabaseFactory(['debugSql'=> $services->getMainConfig() ->get(MainConfigNames::DebugDumpSql), 'tracer'=> $services->getTracer(),]);}, '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 { $lbConf=$services->getDBLoadBalancerFactoryConfig() ->getConfig();$mainConfig=$services->getMainConfig();if( $services->getObjectCacheFactory() ->isDatabaseId($mainConfig->get(MainConfigNames::MainCacheType))) { $wanCache=WANObjectCache::newEmpty();} else { $wanCache=$services->getMainWANObjectCache();} $srvCache=$services->getLocalServerObjectCache();if( $srvCache instanceof EmptyBagOStuff) { $srvCache=new HashBagOStuff([ 'maxKeys'=> 100]);} $lbFactoryConfigBuilder=new MWLBFactory(new ConfiguredReadOnlyMode($mainConfig->get(MainConfigNames::ReadOnly), $mainConfig->get(MainConfigNames::ReadOnlyFile)), $services->getChronologyProtector(), $srvCache, $wanCache, $services->getCriticalSectionProvider(), $services->getStatsFactory(), $services->getTracer(), RequestContext::getMain() ->getRequest() ->getIP());$lbConf=$lbFactoryConfigBuilder->applyServices( $lbConf);$class=$lbFactoryConfigBuilder->getLBFactoryClass( $lbConf);$instance=new $class( $lbConf);$lbFactoryConfigBuilder->setDomainAliases( $instance);return $instance;}, 'DBLoadBalancerFactoryConfig'=> static function(MediaWikiServices $services):MWLBConfig { return new MWLBConfig(new ServiceOptions(MWLBConfig::APPLY_DEFAULT_CONFIG_OPTIONS, $services->getMainConfig()), ExtensionRegistry::getInstance() ->getAttribute( 'DatabaseVirtualDomains'), $services->getMainConfig() ->get(MainConfigNames::LBFactoryConf));}, 'DefaultOutputPipeline'=> static function(MediaWikiServices $services):OutputTransformPipeline { return $services->getDefaultOutputPipelineFactory() ->buildDefaultOutputPipeline();}, 'DefaultOutputPipelineFactory'=> static function(MediaWikiServices $services):DefaultOutputPipelineFactory { return new DefaultOutputPipelineFactory(new ServiceOptions(DefaultOutputPipelineFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getMainConfig(), LoggerFactory::getInstance( 'Parser'), $services->getObjectFactory());}, 'DeletePageFactory'=> static function(MediaWikiServices $services):DeletePageFactory { return $services->getService( '_PageCommandFactory');}, 'DomainEventDispatcher'=> static function(MediaWikiServices $services):DomainEventDispatcher { return $services->getService( '_DomainEventDispatcher');}, 'DomainEventSource'=> static function(MediaWikiServices $services):DomainEventSource { return $services->getService( '_DomainEventDispatcher');}, 'EmailConfirmationBannerHandler'=> static function(MediaWikiServices $services):EmailConfirmationBannerHandler { return new EmailConfirmationBannerHandler(new ServiceOptions(EmailConfirmationBannerHandler::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, '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->getContentLanguageCode() ->toString()));}, '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'));}, 'FeatureShutdown'=> static function(MediaWikiServices $services):FeatureShutdown { return new FeatureShutdown(new ServiceOptions(FeatureShutdown::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, '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->getTracer());}, 'FormatterFactory'=> static function(MediaWikiServices $services):FormatterFactory { return new FormatterFactory($services->getMessageParser(), $services->getTitleFormatter(), $services->getHookContainer(), $services->getUserIdentityUtils(), $services->getLanguageFactory(), LoggerFactory::getInstance( 'status'));}, 'GenderCache'=> static function(MediaWikiServices $services):GenderCache { $nsInfo=$services->getNamespaceInfo();if( $services->isServiceDisabled( 'DBLoadBalancer')) { $userOptionsLookup=new StaticUserOptionsLookup([], $services->getMainConfig() ->get(MainConfigNames::DefaultUserOptions));} else { $userOptionsLookup=$services->getUserOptionsLookup();} return new GenderCache( $nsInfo, $userOptionsLookup);}, '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();}, 'HookContainer'=> static function(MediaWikiServices $services):HookContainer { $configHooks=$services->getBootstrapConfig() ->get(MainConfigNames::Hooks);$extRegistry=ExtensionRegistry::getInstance();$extHooks=$extRegistry->getAttribute( 'Hooks');$extDeprecatedHooks=$extRegistry->getAttribute( 'DeprecatedHooks');return new HookContainer(new StaticHookRegistry( $configHooks, $extHooks, $extDeprecatedHooks), $services->getObjectFactory());}, '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->getLanguageConverterPipeline(), $services->getLanguageFactory());}, 'HttpRequestFactory'=> static function(MediaWikiServices $services):HttpRequestFactory { return new HttpRequestFactory(new ServiceOptions(HttpRequestFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), LoggerFactory::getInstance( 'http'), $services->getTracer());}, '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(), $services->getLanguageNameUtils());}, '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(), $services->getUrlUtils(), $services->getShadowPageLoader(),);}, '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->getStatsFactory(), $services->getObjectCacheFactory() ->getLocalClusterInstance(), $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->getStatsFactory(), LoggerFactory::getInstance( 'runJobs'));}, 'JsonCodec'=> static function(MediaWikiServices $services):JsonCodec { return new JsonCodec( $services);}, 'JwtCodec'=> static function(MediaWikiServices $services):JwtCodec { return new RsaJwtCodec(new ServiceOptions(RsaJwtCodec::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, '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();});}, 'LanguageConverterPipeline'=> static function(MediaWikiServices $services):OutputTransformPipeline { return $services->getDefaultOutputPipelineFactory() ->buildLanguageConverterPipeline();}, '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(), $services->getLeximorphFactory());}, 'LanguageFallback'=> static function(MediaWikiServices $services):LanguageFallback { return new LanguageFallback($services->getMainConfig() ->get(MainConfigNames::LanguageCode), $services->getLocalisationCache(), $services->getLanguageNameUtils());}, 'LanguageNameSearch'=> static function(MediaWikiServices $services):LanguageNameSearch { return new LanguageNameSearch($services->getLanguageNameUtils());}, 'LanguageNameUtils'=> static function(MediaWikiServices $services):LanguageNameUtils { return new LanguageNameUtils(new ServiceOptions(LanguageNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer());}, 'LeximorphFactory'=> static function(MediaWikiServices $services):LeximorphFactory { return new LeximorphFactory(new MediaWiki\Config\ServiceOptions(MediaWiki\Language\LeximorphFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), LoggerFactory::getInstance( 'leximorph'));}, 'LinkBatchFactory'=> static function(MediaWikiServices $services):LinkBatchFactory { return new LinkBatchFactory($services->getLinkCache(), $services->getTitleFormatter(), $services->getContentLanguage(), $services->getGenderCache(), $services->getConnectionProvider(), $services->getLinksMigration(), $services->getTempUserDetailsLookup(), 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(), $services->getTempUserConfig(), $services->getTempUserDetailsLookup(), $services->getUserIdentityLookup(), $services->getUserNameUtils(), $services->getUrlUtils(), new ServiceOptions(LinkRendererFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, '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());}, 'LinkWriteDuplicator'=> static function(MediaWikiServices $services):WriteDuplicator { return new WriteDuplicator($services->getConnectionProvider(), ExternalLinksTable::VIRTUAL_DOMAIN, array_key_exists(ExternalLinksTable::VIRTUAL_DOMAIN, $services->getMainConfig() ->get(MainConfigNames::VirtualDomainsMapping)));}, 'LintErrorChecker'=> static function(MediaWikiServices $services):LintErrorChecker { return new LintErrorChecker($services->get( '_Parsoid'), $services->getParsoidPageConfigFactory(), $services->getTitleFactory(), ExtensionRegistry::getInstance(), $services->getMainConfig(),);}, '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);}, 'LockManager'=> static function(MediaWikiServices $services):LockManager { if(defined( 'MW_PHPUNIT_TEST')) { return new NullLockManager([]);} $lockManager=$services->getMainConfig() ->get(MainConfigNames::DefaultLockManager);if(! $lockManager) { return new DatabaseLockManager(['domain'=> WikiMap::getCurrentWikiDbDomain() ->getId(), 'dbProvider'=> $services->getConnectionProvider(), 'logger'=> LoggerFactory::getInstance( 'lockManager')]);} return $services->getLockManagerGroupFactory() ->getLockManagerGroup(WikiMap::getCurrentWikiDbDomain() ->getId()) ->get( $lockManager);}, '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->getObjectCacheFactory() ->getLocalClusterInstance();$logger=$store->getLogger();$logger->debug( 'MainWANObjectCache using store {class}', ['class'=> get_class( $store)]);$wanParams=$mainConfig->get(MainConfigNames::WANObjectCache)+['cache'=> $store, 'logger'=> $logger, 'tracer'=> $services->getTracer(),];if(MW_ENTRY_POINT !=='cli') { $wanParams['stats']=$services->getStatsFactory();$wanParams['asyncHandler']=DeferredUpdates::addCallableUpdate(...);} $lbConf=$services->getDBLoadBalancerFactoryConfig() ->getConfig();if(isset( $lbConf['servers']) &&count( $lbConf['servers'])===1 &&!defined( 'MW_PHPUNIT_TEST')) { $wanParams['pendingCallback']=static function() use( $services) { return $services->getDBLoadBalancer() ->hasOrMadeRecentPrimaryChanges();};} return new WANObjectCache( $wanParams);}, 'MediaHandlerFactory'=> static function(MediaWikiServices $services):MediaHandlerFactory { return new MediaHandlerFactory($services->getLanguageFactory(), 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();$mainCache=$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( $mainCache)]);$options=new ServiceOptions(MessageCache::CONSTRUCTOR_OPTIONS, $mainConfig);return new MessageCache($services->getMainWANObjectCache(), $mainCache, $srvCache, $services->getContentLanguage(), $services->getLanguageConverterFactory(), $logger, $options, $services->getLocalisationCache(), $services->getLanguageNameUtils(), $services->getLanguageFallback(), $services->getHookContainer(), $services->getMessageParser());}, 'MessageFormatterFactory'=> static function(MediaWikiServices $services):IMessageFormatterFactory { return new MessageFormatterFactory();}, 'MessageParser'=> static function(MediaWikiServices $services):MessageParser { return new MessageParser($services->getParserFactory(), $services->getDefaultOutputPipeline(), $services->getLanguageFactory(), LoggerFactory::getInstance( 'MessageParser'));}, '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');}, 'MultiFormatUserIdentityLookup'=> static function(MediaWikiServices $services):MultiFormatUserIdentityLookup { return new MultiFormatUserIdentityLookup($services->getActorStoreFactory(), $services->getUserFactory(), new ServiceOptions(MultiFormatUserIdentityLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, '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'));}, 'NotificationEmailSender'=> static function(MediaWikiServices $services):NotificationEmailSender { return new NotificationEmailSender(new ServiceOptions(NotificationEmailSender::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getEmailer(), $services->getLocalServerObjectCache(), $services->getUrlUtils());}, 'NotificationService'=> static function(MediaWikiServices $services):NotificationService { $handlers=ExtensionRegistry::getInstance() ->getAttribute( 'NotificationHandlers');$handlers[]=NotificationService::RECENT_CHANGE_HANDLER_SPEC;return new NotificationService(LoggerFactory::getInstance( 'Notification'), $services->getObjectFactory(), $services->getService( '_NotificationMiddlewareChain'), $handlers);}, '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(), $services->getTracer());}, '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($services->getObjectCacheFactory() ->getLocalClusterInstance(), $services->getConnectionProvider(), LoggerFactory::getInstance( 'StashEdit'), $services->getStatsFactory(), $services->getUserEditTracker(), $services->getUserFactory(), $services->getWikiPageFactory(), $services->getJsonCodec(), $services->getLockManager(), $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->getRevisionRenderer(), $services->getTitleFormatter(), $services->getPageStore(), $services->getParsoidOutputStash(), $services->getParserOutputAccess(), $services->getParsoidSiteConfig(), $services->getHtmlTransformFactory(), $services->getContentHandlerFactory(), $services->getLanguageFactory(), $services->getRedirectStore(), $services->getLanguageConverterFactory(), $services->getTitleFactory(), $services->getConnectionProvider(), $services->getChangeTagsStore(), $services->getStatsFactory(), $services->getShadowPageLoader(),);}, '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->getContentLanguage(), $services->getDBLoadBalancerFactory(), $services->getContentHandlerFactory(), $services->getDomainEventDispatcher(), $services->getHookContainer(), $editResultCache, LoggerFactory::getInstance( 'SavePage'), new ServiceOptions(PageUpdaterFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getUserGroupManager(), $services->getTitleFormatter(), $services->getContentTransformer(), $services->getPageEditStash(), $services->getMainWANObjectCache(), $services->getWikiPageFactory(), $services->getChangeTagsStore(), $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());}, 'ParserCoreTagHooks'=> static function(MediaWikiServices $services):ParserCoreTagHooks { $options=new ServiceOptions(ParserCoreTagHooks::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new ParserCoreTagHooks($options, $services->getLanguageFactory(), $services->getLanguageConverterFactory(),);}, 'ParserFactory'=> static function(MediaWikiServices $services):ParserFactory { $options=new ServiceOptions(Parser::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new ParserFactory($options, $services->getParserCoreTagHooks(), $services->getMagicWordFactory(), $services->getContentLanguage(), $services->getUrlUtils(), $services->getSpecialPageFactory(), $services->getLinkRendererFactory(), $services->getNamespaceInfo(), LoggerFactory::getInstance( 'Parser'), $services->getBadFileLookup(), $services->getRepoGroup(), $services->getLanguageFactory(), $services->getLanguageConverterFactory(), $services->getLanguageNameUtils(), $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 { $poa=new ParserOutputAccess($services->getMainConfig(), $services->getDefaultOutputPipeline(), $services->getParserCacheFactory(), $services->getRevisionLookup(), $services->getRevisionRenderer(), $services->getStatsFactory(), $services->getChronologyProtector(), $services->getWikiPageFactory(), $services->getTitleFormatter(), $services->getTracer(), $services->getPoolCounterFactory());$poa->setLogger(LoggerFactory::getInstance( 'ParserOutputAccess'));return $poa;}, '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->getTrackingCategories(), $services->getReadOnlyMode(), $services->getParserFactory(), $services->getLinkBatchFactory(), $services->getLinkRenderer());}, '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->getJsonCodec(), $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->getNamespaceInfo(), $services->getTrackingCategories(), $services->getParserFactory(),);}, 'ParsoidSiteConfig'=> static function(MediaWikiServices $services):MWSiteConfig { $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->getStatsFactory(), $services->getMagicWordFactory(), $services->getNamespaceInfo(), $services->getSpecialPageFactory(), $services->getInterwikiLookup(), $services->getUserOptionsLookup(), $services->getLanguageFactory(), $services->getLanguageConverterFactory(), $services->getLanguageNameUtils(), $services->getUrlUtils(), $services->getContentHandlerFactory(), 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->getUserIdentityLookup(), $services->getUserFactory(), $services->getUserNameUtils(), $services->getUserOptionsLookup());}, 'PatrolManager'=> static function(MediaWikiServices $services):PatrolManager { return new PatrolManager(new ServiceOptions(PatrolManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getConnectionProvider(), $services->getUserFactory(), $services->getHookContainer(), $services->getRevertedTagUpdateManager());}, '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(RequestContext::getMain(...))), $services->getHookContainer(), $services->getUserIdentityLookup(), $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(), $services->getObjectCacheFactory() ->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'), $services->getTracer());}, '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(), $services->getShadowPageLoader(),);}, 'ProxyLookup'=> static function(MediaWikiServices $services):ProxyLookup { $mainConfig=$services->getMainConfig();return new ProxyLookup($mainConfig->get(MainConfigNames::CdnServers), $mainConfig->get(MainConfigNames::CdnServersNoPurge), $services->getHookContainer(), $services->getLocalServerObjectCache());}, '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->getStatsFactory());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());}, 'RecentChangeFactory'=> static function(MediaWikiServices $services):RecentChangeFactory { return $services->getRecentChangeStore();}, 'RecentChangeLookup'=> static function(MediaWikiServices $services):RecentChangeLookup { return $services->getRecentChangeStore();}, 'RecentChangeRCFeedNotifier'=> static function(MediaWikiServices $services):RecentChangeRCFeedNotifier { return new RecentChangeRCFeedNotifier($services->getHookContainer(), new ServiceOptions(RecentChangeRCFeedNotifier::CONSTRUCTOR_OPTIONS, $services->getMainConfig()));}, 'RecentChangeStore'=> static function(MediaWikiServices $services):RecentChangeStore { $extRegistry=ExtensionRegistry::getInstance();return new RecentChangeStore($services->getActorStoreFactory(), $services->getChangeTagsStore(), $services->getConnectionProvider(), $services->getCommentStore(), $services->getHookContainer(), $services->getJobQueueGroup(), $services->getPermissionManager(), $services->getRecentChangeRCFeedNotifier(), new ServiceOptions(RecentChangeStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getTitleFormatter(), $services->getWikiPageFactory(), $services->getUserFactory(), $extRegistry->getAttribute( 'RecentChangeSources'));}, 'RedirectLookup'=> static function(MediaWikiServices $services):RedirectLookup { return $services->getRedirectStore();}, 'RedirectStore'=> static function(MediaWikiServices $services):RedirectStore { return new RedirectStore($services->getConnectionProvider(), $services->getPageStore(), $services->getTitleParser(), $services->getRepoGroup(), LoggerFactory::getInstance( 'RedirectStore'), $services->getLinkWriteDuplicator());}, 'RenameUserFactory'=> static function(MediaWikiServices $services):RenameUserFactory { return new RenameUserFactory(new ServiceOptions(RenameUserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getCentralIdLookupFactory(), $services->getConnectionProvider(), $services->getJobQueueGroupFactory(), $services->getMovePageFactory(), $services->getUserFactory(), $services->getUserNameUtils(), $services->getPermissionManager(), $services->getTitleFactory(),);}, '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'), new DependencyStore( $services->getMainObjectStash()), ['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'=>['resources/src/mediawiki.messagePoster/factory.js', 'resources/src/mediawiki.messagePoster/MessagePoster.js', 'resources/src/mediawiki.messagePoster/WikitextMessagePoster.js',... $msgPosterAttrib['scripts'] ??[],], 'dependencies'=>['oojs', 'mediawiki.api', 'mediawiki.ForeignApi',... $msgPosterAttrib['dependencies'] ??[],],]);if( $config->get(MainConfigNames::EnableJavaScriptTest)===true) { $rl->registerTestModules();} return $rl;}, 'RestrictedUserGroupCheckerFactory'=> static function(MediaWikiServices $services):RestrictedUserGroupCheckerFactory { return new RestrictedUserGroupCheckerFactory($services->getRestrictedUserGroupConfigReader(), $services->getUserRequirementsConditionChecker());}, 'RestrictedUserGroupConfigReader'=> static function(MediaWikiServices $services):RestrictedUserGroupConfigReader { return new RestrictedUserGroupConfigReader(new ServiceOptions(RestrictedUserGroupConfigReader::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getUserRequirementsConditionValidator());}, 'RestrictionStore'=> static function(MediaWikiServices $services):RestrictionStore { return new RestrictionStore(new ServiceOptions(RestrictionStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getMainWANObjectCache(), $services->getDBLoadBalancerFactory(), $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(), $services->getRecentChangeLookup());}, 'RollbackPageFactory'=> static function(MediaWikiServices $services):RollbackPageFactory { return $services->get( '_PageCommandFactory');}, 'RowCommentFormatter'=> static function(MediaWikiServices $services):RowCommentFormatter { return new RowCommentFormatter($services->getCommentParserFactory(), $services->getCommentStore());}, 'SBOMGenerator'=> static function(MediaWikiServices $services):SBOMGenerator { return new SBOMGenerator($services->getConnectionProvider(), $services->getExtensionRegistry(), $services->getGlobalIdGenerator(),);}, '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());}, 'SessionManager'=> static function(MediaWikiServices $services):SessionManagerInterface { return new SessionManager($services->getMainConfig(), LoggerFactory::getInstance( 'session'), $services->getCentralIdLookup(), $services->getHookContainer(), $services->getObjectFactory(), $services->getProxyLookup(), $services->getUrlUtils(), $services->getUserNameUtils(), $services->getSessionStore());}, 'SessionStore'=> static function(MediaWikiServices $services):SessionStore { $objectCacheFactory=$services->getObjectCacheFactory();$mainConfig=$services->getMainConfig();$logger=LoggerFactory::getInstance( 'session');$anonCacheType=$mainConfig->get(MainConfigNames::AnonSessionCacheType);$authCacheType=$mainConfig->get(MainConfigNames::SessionCacheType);if( $anonCacheType !==false) { return new MultiBackendSessionStore($objectCacheFactory->getInstance( $anonCacheType), $objectCacheFactory->getInstance( $authCacheType), $logger, $services->getStatsFactory());} return new SingleBackendSessionStore($objectCacheFactory->getInstance( $authCacheType), $logger, $services->getStatsFactory());}, 'ShadowPageLoader'=> static function(MediaWikiServices $services):ShadowPageLoader { return new ShadowPageLoader($services->getObjectFactory(), ShadowPageLoader::CORE_SPECS, ExtensionRegistry::getInstance() ->getAttribute( 'ShadowPageProviders'));}, '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->getLintErrorChecker();}, $services->getSpecialPageFactory(), $services->getTitleFactory(),);}, 'SiteLookup'=> static function(MediaWikiServices $services):SiteLookup { return $services->getSiteStore();}, 'SiteStore'=> static function(MediaWikiServices $services):SiteStore { $rawSiteStore=new DBSiteStore( $services->getConnectionProvider());$cache=$services->getLocalServerObjectCache();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'] ?? false;} else { $displayName=$skin;$skippable=false;$spec=['name'=> $name, 'class'=> "Skin$skin"];} $factory->register( $name, $displayName, $spec, $skippable);} $factory->register( 'fallback', 'Fallback', ['class'=> SkinFallback::class, 'args'=>[['name'=> 'fallback', 'menus'=>[], 'styles'=>[ 'mediawiki.skinning.interface', 'mediawiki.codex.messagebox.styles'], 'templateDirectory'=> dirname(__DIR__) . '/resources/templates/skins/fallback',]]], true);$factory->register( 'apioutput', 'ApiOutput', ['class'=> SkinApi::class, 'args'=>[['name'=> 'apioutput', 'menus'=>[], 'styles'=>[ 'mediawiki.skinning.interface'], 'templateDirectory'=> dirname(__DIR__) . '/resources/templates/skins/apioutput',]]], true);$factory->register( 'authentication-popup', 'Authentication popup', ['class'=> SkinAuthenticationPopup::class, 'args'=>[['name'=> 'authentication-popup', 'menus'=>[], 'styles'=>['mediawiki.skinning.interface', 'mediawiki.special.userlogin.authentication-popup',], 'bodyClasses'=>[ 'mw-authentication-popup'], 'responsive'=> true, 'messages'=>['sitesubtitle', 'sitetitle',], 'templateDirectory'=> dirname(__DIR__) . '/resources/templates/skins/authentication-popup',]]], true);$factory->register( 'json', 'SkinJSON', ['class'=> SkinApi::class, 'args'=>[['name'=> 'json', 'menus'=>[], 'styles'=>[], 'format'=> 'json', 'templateDirectory'=> dirname(__DIR__) . '/resources/templates/skins/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(), $services->getStatsFactory(),);}, 'StatsdDataFactory'=> static function(MediaWikiServices $services):IBufferingStatsdDataFactory { return new NullStatsdDataFactory();}, 'StatsFactory'=> static function(MediaWikiServices $services):StatsFactory { $config=$services->getMainConfig();$format=OutputFormats::getFormatFromString($config->get(MainConfigNames::StatsFormat) ?? 'null');$cache=new StatsCache;$emitter=OutputFormats::getNewEmitter($config->get(MainConfigNames::StatsPrefix), $cache, OutputFormats::getNewFormatter( $format), $config->get(MainConfigNames::StatsTarget));return new StatsFactory( $cache, $emitter, LoggerFactory::getInstance( 'Stats'));}, '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'=> $services->getObjectCacheFactory() ->getLocalClusterInstance(),]), new Throttler($services->getMainConfig() ->get(MainConfigNames::TempAccountNameAcquisitionThrottle), ['type'=> 'tempacctnameacquisition', 'cache'=> $services->getObjectCacheFactory() ->getLocalClusterInstance(),]));}, 'TempUserDetailsLookup'=> static function(MediaWikiServices $services):TempUserDetailsLookup { return new TempUserDetailsLookup($services->getTempUserConfig(), $services->getUserRegistrationLookup());}, 'TextboxBuilder'=> static function(MediaWikiServices $services):TextboxBuilder { return new TextboxBuilder($services->getPermissionManager(), $services->getRestrictionStore(), $services->getUserOptionsLookup(),);}, '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 new TitleFormatter($services->getContentLanguage(), $services->getGenderCache(), $services->getNamespaceInfo());}, 'TitleMatcher'=> static function(MediaWikiServices $services):TitleMatcher { return new TitleMatcher($services->getContentLanguage(), $services->getLanguageConverterFactory(), $services->getHookContainer(), $services->getWikiPageFactory(), $services->getRepoGroup(), $services->getTitleFactory());}, 'TitleParser'=> static function(MediaWikiServices $services):TitleParser { return new TitleParser($services->getContentLanguage(), $services->getInterwikiLookup(), $services->getNamespaceInfo(), $services->getMainConfig() ->get(MainConfigNames::LocalInterwikis));}, 'Tracer'=> static function(MediaWikiServices $services):TracerInterface { $xReqIdPropagator=new MediaWikiPropagator(Telemetry::getInstance());$otelConfig=$services->getMainConfig() ->get(MainConfigNames::OpenTelemetryConfig);if( $otelConfig===null||(wfIsCLI() &&!defined( 'MW_PHPUNIT_TEST'))) { if( $services->getMainConfig() ->get(MainConfigNames::GenerateReqIDFormat)==='uuid4') { Telemetry::getInstance() ->overrideRequestId( $services->getGlobalIdGenerator() ->newUUIDv4());} return new NoopTracer( $xReqIdPropagator);} $tracerState=TracerState::getInstance();$exporter=new OtlpHttpExporter($services->getService( '_TracerHTTPClient'), new HttpFactory(), LoggerFactory::getInstance( 'tracing'), $otelConfig['endpoint'], $otelConfig['serviceName'], wfHostname());return new Tracer(new Clock(), new ProbabilisticSampler( $otelConfig['samplingProbability']), $exporter, $tracerState, new CompositePropagator([ $xReqIdPropagator, new W3CTraceContextPropagator()]));}, 'TrackingCategories'=> static function(MediaWikiServices $services):TrackingCategories { return new TrackingCategories(new ServiceOptions(TrackingCategories::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getExtensionRegistry(), $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'));}, 'UploadVerification'=> static function(MediaWikiServices $services):UploadVerification { return new UploadVerification(new ServiceOptions(UploadVerification::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getMimeAnalyzer(), new SVGCSSChecker);}, '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->getActorStoreFactory(), $services->getConnectionProvider(), $services->getJobQueueGroup(), $services->getMainWANObjectCache());}, 'UserFactory'=> static function(MediaWikiServices $services):UserFactory { return new UserFactory(new ServiceOptions(UserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getUserNameUtils(), $services->getTempUserConfig());}, 'UserGroupAssignmentService'=> static function(MediaWikiServices $services):UserGroupAssignmentService { return new UserGroupAssignmentService($services->getUserGroupManagerFactory(), $services->getUserNameUtils(), $services->getUserFactory(), $services->getRestrictedUserGroupCheckerFactory(), new HookRunner( $services->getHookContainer()), new ServiceOptions(UserGroupAssignmentService::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getTempUserConfig(), $services->getConnectionProvider(), $services->getPageStoreFactory(),);}, '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->getJobQueueGroupFactory(), $services->getTempUserConfig(), $services->getUserFactory(), $services->getUserRequirementsConditionCheckerFactory(), $services->getRestrictedUserGroupConfigReader(), [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());}, 'UserLinkRenderer'=> static function(MediaWikiServices $services):UserLinkRenderer { return new UserLinkRenderer($services->getHookContainer(), $services->getTempUserConfig(), $services->getSpecialPageFactory(), $services->getLinkRenderer(), $services->getTempUserDetailsLookup(), $services->getUserIdentityLookup(), $services->getUserNameUtils());}, '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->getContentLanguageCode() ->toString()), $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(), $services->getObjectFactory(), ExtensionRegistry::getInstance() ->getAttribute( 'UserOptionsStoreProviders'));}, '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;}, 'UserRequirementsConditionChecker'=> static function(MediaWikiServices $services):UserRequirementsConditionChecker { return $services->getUserRequirementsConditionCheckerFactory() ->getUserRequirementsConditionChecker( $services->getUserGroupManager());}, 'UserRequirementsConditionCheckerFactory'=> static function(MediaWikiServices $services):UserRequirementsConditionCheckerFactory { return new UserRequirementsConditionCheckerFactory(new ServiceOptions(UserRequirementsConditionCheckerFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getGroupPermissionsLookup(), $services->getHookContainer(), $services->getUserEditTracker(), $services->getUserRegistrationLookup(), $services->getUserFactory(), RequestContext::getMain(), $services->getUserRequirementsConditionValidator(),);}, 'UserRequirementsConditionValidator'=> static function():UserRequirementsConditionValidator { return new UserRequirementsConditionValidator(LoggerFactory::getInstance( 'UserGroupManager'),);}, 'WatchedItemQueryService'=> static function(MediaWikiServices $services):WatchedItemQueryService { return new WatchedItemQueryService($services->getConnectionProvider(), $services->getWatchedItemStore(), $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->getWatchlistLabelStore());if( $services->getMainConfig() ->get(MainConfigNames::ReadOnlyWatchedItemStore)) { $store=new NoWriteWatchedItemStore( $store);} return $store;}, 'WatchlistLabelStore'=> static function(MediaWikiServices $services):WatchlistLabelStore { return new WatchlistLabelStore($services->getConnectionProvider(), LoggerFactory::getInstance( 'WatchlistLabels'), $services->getMainConfig());}, 'WatchlistManager'=> static function(MediaWikiServices $services):WatchlistManager { return new WatchlistManager([WatchlistManager::OPTION_ENOTIF=> RecentChangeStore::isEnotifEnabled(new ServiceOptions(RecentChangeStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig())),], $services->getHookContainer(), $services->getReadOnlyMode(), $services->getRevisionLookup(), $services->getTalkPageNotificationManager(), $services->getWatchedItemStore(), $services->getWatchlistLabelStore(), $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(), LoggerFactory::getInstance( 'preferences'), static function() use( $services) { return $services->getUserGroupManager();});}, '_DefaultOptionsLookup'=> static function(MediaWikiServices $services):DefaultOptionsLookup { return new DefaultOptionsLookup(new ServiceOptions(DefaultOptionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentLanguageCode(), $services->getHookContainer(), $services->getNamespaceInfo(), $services->get( '_ConditionalDefaultsLookup'), $services->getUserIdentityLookup(), $services->getUserNameUtils());}, '_DomainEventDispatcher'=> static function(MediaWikiServices $services):EventDispatchEngine { $dispatcher=new EventDispatchEngine($services->getObjectFactory());$dispatcher->registerSubscriber(ChangeTrackingEventIngress::OBJECT_SPEC);$dispatcher->registerSubscriber(SearchEventIngress::OBJECT_SPEC);$dispatcher->registerSubscriber(LanguageEventIngress::OBJECT_SPEC);$extensionRegistry=$services->getExtensionRegistry();$dispatcher->registerSubscriber( $extensionRegistry);return $dispatcher;}, '_EditConstraintFactory'=> static function(MediaWikiServices $services):EditConstraintFactory { return new EditConstraintFactory(new ServiceOptions(EditConstraintFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer(), $services->getReadOnlyMode(), $services->getSpamChecker(), LoggerFactory::getProvider() ->getLogger( 'SpamRegex'), $services->getRateLimiter(), $services->getRedirectLookup(), $services->getConnectionProvider(), $services->getLogFormatterFactory(), $services->getUserFactory(),);}, '_NotificationMiddlewareChain'=> static function(MediaWikiServices $services):MiddlewareChain { return new MiddlewareChain($services->getObjectFactory(), ExtensionRegistry::getInstance() ->getAttribute( 'NotificationMiddleware'));}, '_PageCommandFactory'=> static function(MediaWikiServices $services):PageCommandFactory { return new PageCommandFactory($services->getMainConfig(), $services->getDBLoadBalancerFactory(), $services->getNamespaceInfo(), $services->getWatchedItemStore(), $services->getRepoGroup(), $services->getReadOnlyMode(), $services->getContentHandlerFactory(), $services->getRevisionStoreFactory(), $services->getSpamChecker(), $services->getTitleFormatter(), $services->getHookContainer(), $services->getDomainEventDispatcher(), $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->getContentLanguageCode() ->toString()), $services->getArchivedRevisionLookup(), $services->getRestrictionStore(), $services->getLinkTargetLookup(), $services->getRedirectStore(), $services->getLogFormatterFactory(), $services->getLinkWriteDuplicator());}, '_PageEditFactory'=> static function(MediaWikiServices $services):PageEditFactory { return new PageEditFactory(new ServiceOptions(PageEditFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentHandlerFactory(), $services->getService( '_EditConstraintFactory'), $services->getConnectionProvider(), $services->getContentLanguage(), $services->getContentTransformer(), LoggerFactory::getInstance( 'EditConflict'), $services->getService( '_PageEditingHelper'), $services->getRateLimiter(), $services->getRevisionStore(), $services->getShadowPageLoader(), $services->getTitleFormatter(), $services->getUserOptionsLookup(), $services->getWatchlistManager(), $services->getWatchedItemStore(), $services->getWikiPageFactory(),);}, '_PageEditingHelper'=> static function(MediaWikiServices $services):PageEditingHelper { return new PageEditingHelper(new ServiceOptions(PageEditingHelper::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getContentHandlerFactory(), $services->getParserFactory(), $services->getRevisionStore(),);}, '_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();}, '_TracerHTTPClient'=> static function():ClientInterface { return new Client([ 'http_errors'=> false]);}, '_UserBlockCommandFactory'=> static function(MediaWikiServices $services):UserBlockCommandFactory { return new UserBlockCommandFactory(new ServiceOptions(UserBlockCommandFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getHookContainer(), $services->getBlockPermissionCheckerFactory(), $services->getBlockTargetFactory(), $services->getDatabaseBlockStore(), $services->getBlockRestrictionStore(), $services->getUserFactory(), $services->getUserEditTracker(), LoggerFactory::getInstance( 'BlockManager'), $services->getTitleFactory(), $services->getBlockActionInfo());}]
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:71
const MW_ENTRY_POINT
Definition api.php:21
AuthManager is the authentication system in MediaWiki and serves entry point for authentication.
setLogger(LoggerInterface $logger)
A helper class for throttling authentication attempts.
Definition Throttler.php:26
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.
Factory for BlockTarget objects.
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.
This class performs some operations related to tracking categories, such as adding a tracking categor...
Formats change tags for display in HTML and use filter dropdown menus.
A factory for ChangeTagsStore instances.
Read-write access to the 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.
Service for syntax highlighting.
ContentJsonCodec handles serialization of Content objects to/from JSON using methods of the appropria...
Group all the pieces relevant to the context of a request into one instance.
MediaWiki-specific class for generating configuration of load balancers.
MediaWiki-specific class for generating database load balancers.
Defer callable updates to run later in the PHP process.
Implementation of DomainEventDispatcher and DomainEventSource based on HookContainer and DeferredUpda...
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 helper methods used by EditPage and a future editing backend (T157658).
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.
Helps EditPage build textboxes.
Factory service for WikiExporter instances.
This is the main interface for fetching or inserting objects with ExternalStore.
Helper to check if certain features should be temporarily disabled.
Class to handle file backend registration.
Prioritized list of file repositories.
Definition RepoGroup.php:30
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:15
Factory service for WikiImporter instances.
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:34
InterwikiLookup backed by the interwiki database table or $wgInterwikiCache.
Factory for JobQueueGroup objects.
Handle enqueueing of background jobs.
Job queue runner utility methods.
Definition JobRunner.php:36
JwtCodec using lcobucci/jwt with an RSA key ($wgJwtPublicKey / $wgJwtPrivateKey).
Factory for formatters of common complex objects.
Methods for dealing with language codes.
An interface for creating language converters.
The ingress adapter for the language component.
Internationalisation code See https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation for more...
Cross-Language Language name search.
A service that provides utilities to do with language names and codes.
Base class for language-specific code.
Definition Language.php:65
Wrapper for injecting a LocalizationContext with lazy initialization.
Create and cache Manager and Provider instances.
Caching for the contents of localisation files.
Cache messages that are defined by MediaWiki-namespace pages or by hooks.
get( $key, $useDB=true, $language=null, $info=null)
Get a message from either the content language or the user language.
Service for transformation of interface message text.
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.
Service class that renders HTML for user-related links.
Create PSR-3 logger objects.
Wrapper for IEmailer for sending confirm email sender.
Decides whether to show the email confirmation banner to a given user.
Factory for EmailUser objects.
Send email between two wiki users.
Definition EmailUser.php:37
Send arbitrary emails.
Definition Emailer.php:26
Sends notification emails to the old address when a user changes or removes their email.
A class containing constants representing the names of configuration variables.
Service locator for MediaWiki core services.
Support for detecting/validating DjVu image files and getting some basic file metadata (resolution et...
Definition DjVuImage.php:28
Class to construct MediaHandler objects.
The MediaWiki-specific implementation of IMessageFormatterFactory.
The Message class deals with fetching and processing of interface message into a variety of formats.
Definition Message.php:144
Notify users about things occurring.
Factory for cache objects as configured in the ObjectCaches setting.
This class contains the default output transformation pipeline factory for wikitext.
Factory for LinkBatch objects to batch query page metadata.
Page existence and metadata cache.
Definition LinkCache.php:54
Implementation of various page action services.
Gives access to properties of a page.
Definition PageProps.php:20
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.
Cache for ParserOutput objects corresponding to the latest page revisions.
Various tag hooks, registered in every Parser.
PHP Parser - Processes wiki markup (which uses a more user-friendly syntax, such as "[[link]]" for ma...
Definition Parser.php:139
Implement Parsoid's abstract class for data access.
Helper class used by MediaWiki to create Parsoid PageConfig objects.
Site-level configuration for Parsoid.
Check arbitrary wikitext for lint errors.
ParserFactory which uses a ParsoidParser.
Factory class for creating and checking Password objects.
Users can authorize applications to use their account via OAuth.
This separate service is needed because the ::getGrantsLink method requires a LinkRenderer and if we ...
A service class for checking permissions To obtain an instance, use MediaWikiServices::getInstance()-...
Provides rate limiting for a set of actions based on several counter buckets.
setStats(StatsFactory $statsFactory)
This is the default implementation of PreferencesFactory.
The ingress subscriber for the change tracking component.
Use via MediaWikiServices::getChangesListQueryFactory.
Load JSON files, and uses a Processor to extract information.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form,...
Track per-module dependency file paths that are expensive to mass compute.
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.
Configuration handling class for SearchEngine.
Factory class for SearchEngine.
The ingress adapter for the search component.
Service implementation of near match title search.
An implementation of a session store with two backends for storing anonymous and authenticated sessio...
This serves as the entry point to the MediaWiki session handling system.
An implementation of a session store with a single backend for storing anonymous and authenticated se...
Builder class for constructing a Config object from a set of sources during bootstrap.
A service which loads shadow content, which is content that is displayed on a nonexistent page with a...
Factory facilitating dependency injection for Command.
This is a service which provides a configured client to access a remote Shellbox installation.
Wrap SiteList with an in-process cache and (optionally) a local-server cache.
Holds a list of sites stored in the database.
SkinTemplate class for API output.
Definition SkinApi.php:19
SkinAuthenticationPopup is a "micro-skin" that omits most of the usual interface elements,...
Factory class to create Skin objects.
Skin implementation for the "Fallback" skin.
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.
A ContextPropagatorInterface implementation that injects headers from MediaWiki's request context,...
Base class for HTML cleanup utilities.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
Creates Title objects.
A title formatter service for MediaWiki.
A title parser service for MediaWiki.
Ensure SVG files cannot load external resources via URLs in CSS.
Service to verify file uploads are safe.
This is not intended to be a long-term part of MediaWiki; it will be deprecated and removed once acto...
ActorStore factory for any wiki domain.
Service to read or write data in the actor table.
BotPassword interaction with databases.
Find central user IDs associated with local user IDs, e.g.
A service to look up user identities based on the user input.
A service class to control default user options.
A UserOptionsLookup that's just an array.
Provides access to user options.
A service class to control user options.
Password reset helper for functionality shared by the web UI and the API.
A service that helps to create RestrictedUserGroupChecker instances, either for the local or remote w...
A helper class to read the restricted user groups configuration for a given wiki.
The real TempUserConfig including internal methods used by TempUserCreator.
Service for temporary user creation.
Caching lookup service for metadata related to temporary accounts, such as expiration.
Track info about user edit counts and timings.
Create User objects.
This class represents a service that provides high-level operations on user groups.
Factory service for UserGroupManager instances.
Manage user group memberships.
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
Class performing complex database queries related to WatchedItems.
Storage layer class for WatchedItems.
Service class for storage of watchlist labels.
Tools for dealing with other locally-hosted wikis.
Definition WikiMap.php:19
Factory class for spawning EventRelayer objects using configuration.
A simplified Database Lock Manager.
Abstract class for any ephemeral data store.
Definition BagOStuff.php:73
get( $key, $flags=0)
Get an item.
No-op implementation that stores nothing.
Store data in a memory for the current request/process only.
Multi-datacenter aware caching interface.
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.
Metrics Format and Output Helpers.
Proxy to prefix metric keys sent to a StatsdDataFactoryInterface.
Singleton cache for Metric instances.
This is the primary interface for validating metrics definitions, caching defined metrics,...
A click providing the current time in nanoseconds, backed by hrtime.
Definition Clock.php:12
CompositePropagator accepts an array of other propagators.
A no-op tracer that creates no-op spans and persists no data.
An ExporterInterface that exports collected data over HTTP, serialized in OTLP JSON format.
A SamplerInterface implementation that samples a given percentage of root spans, while respecting sam...
Holds shared telemetry state, such as finished span data buffered for export.
A ContextPropagatorInterface implementation for W3C Trace Context.
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.
Interface for configuration instances.
Definition Config.php:18
Marker interface for entities aware of the wiki they belong to.
Service for sending domain events to registered listeners.
Service object for registering listeners for domain events.
Stash for Parsoid output and associated data as needed to perform selective serialization (aka "selse...
Service interface for looking up Interwiki records.
A helper to read and write JWTs without having to depend on a specific library, and using central con...
Definition JwtCodec.php:12
Interface for sending arbitrary emails.
Definition IEmailer.php:20
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.
MediaWiki\Session entry point interface.
This is a session store abstraction layer, which can be used to read and write sessions to configured...
Represents a config schema.
Interface to retrieve Site objects, for implementation by service classes.
Interface for storing and retrieving Site objects.
Definition SiteStore.php:18
Service for loading and storing data blobs.
Definition BlobStore.php:19
Service for dealing with the actor table.
Service for looking up UserIdentity.
Interface for objects representing user identity.
A simple factory providing a message formatter for a given language code.
Provide primary and replica IDatabase connections.
MediaWiki adaptation of StatsdDataFactory that provides buffering functionality.
Base interface for an OpenTelemetry tracer responsible for creating spans.
array $params
The job parameters.
Helper trait for implementations \DAO.
if(!isset( $specs[$class])) $spec