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;
117use MediaWiki\Languages\LanguageConverterFactory;
118use MediaWiki\Languages\LanguageEventIngress;
119use MediaWiki\Languages\LanguageFactory;
120use MediaWiki\Languages\LanguageFallback;
121use MediaWiki\Languages\LanguageNameUtils;
289use Psr\Http\Client\ClientInterface;
294use Wikimedia\Mime\MimeAnalyzer;
299use Wikimedia\ObjectFactory\ObjectFactory;
300use Wikimedia\Parsoid\Config\DataAccess;
301use Wikimedia\Parsoid\Parsoid;
307use Wikimedia\RequestTimeout\CriticalSectionProvider;
308use Wikimedia\RequestTimeout\RequestTimeout;
326
327// PHP unit does not understand code coverage for this file
328// as the @covers annotation cannot cover a specific file
329// This is tested in MediaWikiServicesTest::testGetService
330// @codeCoverageIgnoreStart
331
333return [
334 'ActionFactory' => static function ( MediaWikiServices $services ): ActionFactory {
336 $services->getMainConfig()->get( MainConfigNames::Actions ),
337 LoggerFactory::getInstance( 'ActionFactory' ),
338 $services->getObjectFactory(),
339 $services->getHookContainer(),
340 $services->getContentHandlerFactory()
341 );
342 },
343
344 'ActorMigration' => static function ( MediaWikiServices $services ): ActorMigration {
346 $services->getActorStoreFactory()
347 );
348 },
349
350 'ActorNormalization' => static function ( MediaWikiServices $services ): ActorNormalization {
351 return $services->getActorStoreFactory()->getActorNormalization();
352 },
353
354 'ActorStore' => static function ( MediaWikiServices $services ): ActorStore {
355 return $services->getActorStoreFactory()->getActorStore();
356 },
357
358 'ActorStoreFactory' => static function ( MediaWikiServices $services ): ActorStoreFactory {
360 new ServiceOptions( ActorStoreFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
361 $services->getDBLoadBalancerFactory(),
362 $services->getUserNameUtils(),
363 $services->getTempUserConfig(),
364 LoggerFactory::getInstance( 'ActorStore' ),
365 $services->getHideUserUtils()
366 );
367 },
368
369 'ArchivedRevisionLookup' => static function ( MediaWikiServices $services ): ArchivedRevisionLookup {
371 $services->getConnectionProvider(),
372 $services->getRevisionStore()
373 );
374 },
375
376 'AuthManager' => static function ( MediaWikiServices $services ): AuthManager {
377 $authManager = new AuthManager(
378 RequestContext::getMain()->getRequest(),
379 $services->getMainConfig(),
380 $services->getChangeTagsStore(),
381 $services->getObjectFactory(),
382 $services->getObjectCacheFactory(),
383 $services->getHookContainer(),
384 $services->getReadOnlyMode(),
385 $services->getUserNameUtils(),
386 $services->getBlockManager(),
387 $services->getWatchlistManager(),
388 $services->getDBLoadBalancer(),
389 $services->getContentLanguage(),
390 $services->getLanguageConverterFactory(),
391 $services->getBotPasswordStore(),
392 $services->getUserFactory(),
393 $services->getUserIdentityLookup(),
394 $services->getUserIdentityUtils(),
395 $services->getUserOptionsManager(),
396 $services->getNotificationService(),
397 $services->getSessionManager()
398 );
399 $authManager->setLogger( LoggerFactory::getInstance( 'authentication' ) );
400 $authManager->setAuthEventsLogger( LoggerFactory::getInstance( 'authevents' ) );
401 return $authManager;
402 },
403
404 'AutoblockExemptionList' => static function ( MediaWikiServices $services ): AutoblockExemptionList {
405 $messageFormatterFactory = new MessageFormatterFactory( Message::FORMAT_PLAIN );
406 return new AutoblockExemptionList(
407 new ServiceOptions(
408 AutoblockExemptionList::CONSTRUCTOR_OPTIONS,
409 $services->getMainConfig(),
410 ),
411 LoggerFactory::getInstance( 'AutoblockExemptionList' ),
412 $messageFormatterFactory->getTextFormatter(
413 $services->getContentLanguageCode()->toString()
414 )
415 );
416 },
417
418 'BacklinkCacheFactory' => static function ( MediaWikiServices $services ): BacklinkCacheFactory {
420 new ServiceOptions(
421 BacklinkCache::CONSTRUCTOR_OPTIONS,
422 $services->getMainConfig()
423 ),
424 $services->getLinksMigration(),
425 $services->getMainWANObjectCache(),
426 $services->getHookContainer(),
427 $services->getConnectionProvider(),
428 $services->getRestrictionStore(),
429 LoggerFactory::getInstance( 'BacklinkCache' )
430 );
431 },
432
433 'BadFileLookup' => static function ( MediaWikiServices $services ): BadFileLookup {
435 static function () {
436 return wfMessage( 'bad_image_list' )->inContentLanguage()->plain();
437 },
438 $services->getLocalServerObjectCache(),
439 $services->getRepoGroup(),
440 $services->getTitleParser(),
441 $services->getHookContainer()
442 );
443 },
444
445 'BlobStore' => static function ( MediaWikiServices $services ): BlobStore {
446 return $services->getService( '_SqlBlobStore' );
447 },
448
449 'BlobStoreFactory' => static function ( MediaWikiServices $services ): BlobStoreFactory {
451 $services->getDBLoadBalancerFactory(),
452 $services->getExternalStoreAccess(),
453 $services->getMainWANObjectCache(),
454 new ServiceOptions( BlobStoreFactory::CONSTRUCTOR_OPTIONS,
455 $services->getMainConfig() )
456 );
457 },
458
459 'BlockActionInfo' => static function ( MediaWikiServices $services ): BlockActionInfo {
460 return new BlockActionInfo( $services->getHookContainer() );
461 },
462
463 'BlockErrorFormatter' => static function ( MediaWikiServices $services ): BlockErrorFormatter {
464 return $services->getFormatterFactory()->getBlockErrorFormatter(
465 new LazyLocalizationContext( RequestContext::getMain( ... ) )
466 );
467 },
468
469 'BlockManager' => static function ( MediaWikiServices $services ): BlockManager {
471 new ServiceOptions(
472 BlockManager::CONSTRUCTOR_OPTIONS,
473 $services->getMainConfig()
474 ),
475 $services->getUserFactory(),
476 $services->getUserIdentityUtils(),
477 LoggerFactory::getInstance( 'BlockManager' ),
478 $services->getHookContainer(),
479 $services->getDatabaseBlockStore(),
480 $services->getBlockTargetFactory(),
481 $services->getProxyLookup()
482 );
483 },
484
485 'BlockPermissionCheckerFactory' => static function (
486 MediaWikiServices $services
489 new ServiceOptions(
490 BlockPermissionCheckerFactory::CONSTRUCTOR_OPTIONS,
491 $services->getMainConfig()
492 ),
493 $services->getBlockTargetFactory()
494 );
495 },
496
497 'BlockRestrictionStore' => static function ( MediaWikiServices $services ): BlockRestrictionStore {
498 return $services->getBlockRestrictionStoreFactory()->getBlockRestrictionStore( WikiAwareEntity::LOCAL );
499 },
500
501 'BlockRestrictionStoreFactory' => static function ( MediaWikiServices $services ): BlockRestrictionStoreFactory {
503 $services->getDBLoadBalancerFactory()
504 );
505 },
506
507 'BlockTargetFactory' => static function ( MediaWikiServices $services ): BlockTargetFactory {
508 return $services->getCrossWikiBlockTargetFactory()->getFactory();
509 },
510
511 'BlockUserFactory' => static function ( MediaWikiServices $services ): BlockUserFactory {
512 return $services->getService( '_UserBlockCommandFactory' );
513 },
514
515 'BlockUtils' => static function ( MediaWikiServices $services ): BlockUtils {
516 return $services->getBlockUtilsFactory()->getBlockUtils();
517 },
518
519 'BlockUtilsFactory' => static function ( MediaWikiServices $services ): BlockUtilsFactory {
521 $services->getCrossWikiBlockTargetFactory()
522 );
523 },
524
525 'BotPasswordStore' => static function ( MediaWikiServices $services ): BotPasswordStore {
527 new ServiceOptions(
528 BotPasswordStore::CONSTRUCTOR_OPTIONS,
529 $services->getMainConfig()
530 ),
531 $services->getCentralIdLookup(),
532 $services->getDBLoadBalancerFactory()
533 );
534 },
535
536 'CentralIdLookup' => static function ( MediaWikiServices $services ): CentralIdLookup {
537 return $services->getCentralIdLookupFactory()->getLookup();
538 },
539
540 'CentralIdLookupFactory' => static function ( MediaWikiServices $services ): CentralIdLookupFactory {
542 new ServiceOptions( CentralIdLookupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
543 $services->getObjectFactory(),
544 $services->getUserIdentityLookup(),
545 $services->getUserFactory()
546 );
547 },
548
549 'ChangesListQueryFactory' => static function ( MediaWikiServices $services ): ChangesListQueryFactory {
551 new ServiceOptions( ChangesListQueryFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
552 $services->getRecentChangeLookup(),
553 $services->getWatchedItemStore(),
554 $services->getTempUserConfig(),
555 $services->getUserFactory(),
556 $services->getLinkTargetLookup(),
557 $services->getChangeTagsStore(),
558 $services->getStatsFactory(),
559 $services->getSlotRoleStore(),
560 LoggerFactory::getInstance( 'ChangesListQuery' ),
561 $services->getConnectionProvider(),
562 );
563 },
564
565 'ChangeTagDefStore' => static function ( MediaWikiServices $services ): NameTableStore {
566 return $services->getNameTableStoreFactory()->getChangeTagDef();
567 },
568
569 'ChangeTagsStore' => static function ( MediaWikiServices $services ): ChangeTagsStore {
570 return $services->getChangeTagsStoreFactory()->getChangeTagsStore();
571 },
572
573 'ChangeTagsStoreFactory' => static function ( MediaWikiServices $services ): ChangeTagsStoreFactory {
575 $services->getConnectionProvider(),
576 $services->getNameTableStoreFactory(),
577 $services->getMainWANObjectCache(),
578 $services->getHookContainer(),
579 LoggerFactory::getInstance( 'ChangeTags' ),
580 $services->getUserFactory(),
581 new ServiceOptions(
582 ChangeTagsStore::CONSTRUCTOR_OPTIONS,
583 $services->getMainConfig()
584 )
585 );
586 },
587
588 'ChronologyProtector' => static function ( MediaWikiServices $services ): ChronologyProtector {
589 $mainConfig = $services->getMainConfig();
590 $microStashIsDatabase = $services->getObjectCacheFactory()->isDatabaseId(
591 $mainConfig->get( MainConfigNames::MicroStashType )
592 );
593 $cpStash = $microStashIsDatabase
594 ? new EmptyBagOStuff()
595 : $services->getMicroStash();
596
597 $chronologyProtector = new ChronologyProtector(
598 $cpStash,
599 $mainConfig->get( MainConfigNames::ChronologyProtectorSecret ),
600 MW_ENTRY_POINT === 'cli',
601 LoggerFactory::getInstance( 'rdbms' )
602 );
603
604 // Use the global WebRequest singleton. The main reason for using this
605 // is to call WebRequest::getIP() which is non-trivial to reproduce statically
606 // because it needs $wgUsePrivateIPs, as well as ProxyLookup and HookRunner services.
607 // TODO: Create a static version of WebRequest::getIP that accepts these three
608 // as dependencies, and then call that here. The other uses of $req below can
609 // trivially use $_COOKIES, $_GET and $_SERVER instead.
610 $req = RequestContext::getMain()->getRequest();
611
612 // Set user IP/agent information for agent session consistency purposes
613 $reqStart = (int)( $_SERVER['REQUEST_TIME_FLOAT'] ?? time() );
614 $cpPosInfo = ChronologyProtector::getCPInfoFromCookieValue(
615 // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
616 $req->getCookie( 'cpPosIndex', '' ),
617 // Mitigate broken client-side cookie expiration handling (T190082)
618 $reqStart - ChronologyProtector::POSITION_COOKIE_TTL
619 );
620 $chronologyProtector->setRequestInfo( [
621 'IPAddress' => $req->getIP(),
622 'UserAgent' => $req->getHeader( 'User-Agent' ),
623 'ChronologyPositionIndex' => $req->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
624 'ChronologyClientId' => $cpPosInfo['clientId'] ?? null,
625 ] );
626 return $chronologyProtector;
627 },
628
629 'CollationFactory' => static function ( MediaWikiServices $services ): CollationFactory {
631 new ServiceOptions(
632 CollationFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
633 $services->getObjectFactory(),
634 $services->getHookContainer()
635 );
636 },
637
638 'CommentFormatter' => static function ( MediaWikiServices $services ): CommentFormatter {
640 $services->getCommentParserFactory()
641 );
642 },
643
644 'CommentParserFactory' => static function ( MediaWikiServices $services ): CommentParserFactory {
646 $services->getLinkRendererFactory()->create( [ 'renderForComment' => true ] ),
647 $services->getLinkBatchFactory(),
648 $services->getLinkCache(),
649 $services->getRepoGroup(),
650 $services->getContentLanguage(),
651 $services->getTitleParser(),
652 $services->getNamespaceInfo(),
653 $services->getHookContainer()
654 );
655 },
656
657 'CommentStore' => static function ( MediaWikiServices $services ): CommentStore {
658 return new CommentStore( $services->getContentLanguage() );
659 },
660
661 'ConfigFactory' => static function ( MediaWikiServices $services ): ConfigFactory {
662 // Use the bootstrap config to initialize the ConfigFactory.
663 $registry = $services->getBootstrapConfig()->get( MainConfigNames::ConfigRegistry );
664 $factory = new ConfigFactory();
665
666 foreach ( $registry as $name => $callback ) {
667 $factory->register( $name, $callback );
668 }
669 return $factory;
670 },
671
672 'ConfigRepository' => static function ( MediaWikiServices $services ): ConfigRepository {
673 return new ConfigRepository( $services->getConfigFactory() );
674 },
675
676 'ConfigSchema' => static function ( MediaWikiServices $services ): ConfigSchema {
678 $settings = $services->get( '_SettingsBuilder' );
679 return $settings->getConfigSchema();
680 },
681
682 'ConfiguredReadOnlyMode' => static function ( MediaWikiServices $services ): ConfiguredReadOnlyMode {
683 $config = $services->getMainConfig();
684 return new ConfiguredReadOnlyMode(
685 $config->get( MainConfigNames::ReadOnly ),
686 $config->get( MainConfigNames::ReadOnlyFile )
687 );
688 },
689
690 'ConfirmEmailBuilderFactory' => static function ( MediaWikiServices $services ): ConfirmEmailBuilderFactory {
692 new ServiceOptions(
693 ConfirmEmailBuilderFactory::CONSTRUCTOR_OPTIONS,
694 $services->getMainConfig()
695 ),
696 $services->getLocalServerObjectCache(),
697 $services->getUrlUtils()
698 );
699 },
700
701 'ConfirmEmailSender' => static function ( MediaWikiServices $services ): ConfirmEmailSender {
703 new ServiceOptions(
704 ConfirmEmailSender::CONSTRUCTOR_OPTIONS,
705 $services->getMainConfig()
706 ),
707 new HookRunner( $services->getHookContainer() ),
708 $services->getUserFactory(),
709 $services->getEmailer(),
710 $services->getConfirmEmailBuilderFactory()
711 );
712 },
713
714 'ConnectionProvider' => static function ( MediaWikiServices $services ): IConnectionProvider {
715 return $services->getDBLoadBalancerFactory();
716 },
717
718 'ContentHandlerFactory' => static function ( MediaWikiServices $services ): IContentHandlerFactory {
719 $contentHandlerConfig = $services->getMainConfig()->get( MainConfigNames::ContentHandlers );
720
721 return new ContentHandlerFactory(
722 $contentHandlerConfig,
723 $services->getObjectFactory(),
724 $services->getHookContainer(),
725 LoggerFactory::getInstance( 'ContentHandler' )
726 );
727 },
728
729 'ContentJsonCodec' => static function ( MediaWikiServices $services ): ContentJsonCodec {
731 $services->getContentHandlerFactory(),
732 );
733 },
734
735 'ContentLanguage' => static function ( MediaWikiServices $services ): Language {
736 return $services->getLanguageFactory()->getLanguage(
737 $services->getMainConfig()->get( MainConfigNames::LanguageCode ) );
738 },
739
740 'ContentLanguageCode' => static function ( MediaWikiServices $services ): LanguageCode {
741 return $services->getLanguageFactory()->getLanguageCode(
742 $services->getMainConfig()->get( MainConfigNames::LanguageCode ) );
743 },
744
745 'ContentModelChangeFactory' => static function ( MediaWikiServices $services ): ContentModelChangeFactory {
746 return $services->getService( '_PageCommandFactory' );
747 },
748
749 'ContentModelStore' => static function ( MediaWikiServices $services ): NameTableStore {
750 return $services->getNameTableStoreFactory()->getContentModels();
751 },
752
753 'ContentRenderer' => static function ( MediaWikiServices $services ): ContentRenderer {
755 $services->getContentHandlerFactory(),
756 $services->getGlobalIdGenerator()
757 );
758 },
759
760 'ContentTransformer' => static function ( MediaWikiServices $services ): ContentTransformer {
761 return new ContentTransformer( $services->getContentHandlerFactory() );
762 },
763
764 'CriticalSectionProvider' => static function ( MediaWikiServices $services ): CriticalSectionProvider {
765 $config = $services->getMainConfig();
766 $limit = MW_ENTRY_POINT === 'cli' ? INF : $config->get( MainConfigNames::CriticalSectionTimeLimit );
767 return RequestTimeout::singleton()->createCriticalSectionProvider( $limit );
768 },
769
770 'CrossWikiBlockTargetFactory' => static function ( MediaWikiServices $services ): CrossWikiBlockTargetFactory {
772 new ServiceOptions( CrossWikiBlockTargetFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
773 $services->getActorStoreFactory(),
774 $services->getUserNameUtils()
775 );
776 },
777
778 'DatabaseBlockStore' => static function ( MediaWikiServices $services ): DatabaseBlockStore {
779 return $services->getDatabaseBlockStoreFactory()->getDatabaseBlockStore( DatabaseBlock::LOCAL );
780 },
781
782 'DatabaseBlockStoreFactory' => static function ( MediaWikiServices $services ): DatabaseBlockStoreFactory {
784 new ServiceOptions(
785 DatabaseBlockStoreFactory::CONSTRUCTOR_OPTIONS,
786 $services->getMainConfig()
787 ),
788 LoggerFactory::getInstance( 'DatabaseBlockStore' ),
789 $services->getActorStoreFactory(),
790 $services->getBlockRestrictionStoreFactory(),
791 $services->getCommentStore(),
792 $services->getHookContainer(),
793 $services->getDBLoadBalancerFactory(),
794 $services->getReadOnlyMode(),
795 $services->getUserFactory(),
796 $services->getTempUserConfig(),
797 $services->getCrossWikiBlockTargetFactory(),
798 $services->getAutoblockExemptionList(),
799 $services->getSessionManager()
800 );
801 },
802
803 'DatabaseFactory' => static function ( MediaWikiServices $services ): DatabaseFactory {
805 [
806 'debugSql' => $services->getMainConfig()->get( MainConfigNames::DebugDumpSql ),
807 'tracer' => $services->getTracer(),
808 ]
809 );
810 },
811
812 'DateFormatterFactory' => static function ( MediaWikiServices $services ): DateFormatterFactory {
814 },
815
816 'DBLoadBalancer' => static function ( MediaWikiServices $services ): Wikimedia\Rdbms\ILoadBalancer {
817 // just return the default LB from the DBLoadBalancerFactory service
818 return $services->getDBLoadBalancerFactory()->getMainLB();
819 },
820
821 'DBLoadBalancerFactory' => static function ( MediaWikiServices $services ): Wikimedia\Rdbms\LBFactory {
822 $mainConfig = $services->getMainConfig();
823 $lbFactoryConfigBuilder = $services->getDBLoadBalancerFactoryConfigBuilder();
824
825 $lbConf = $lbFactoryConfigBuilder->applyDefaultConfig(
826 $mainConfig->get( MainConfigNames::LBFactoryConf )
827 );
828
829 $class = $lbFactoryConfigBuilder->getLBFactoryClass( $lbConf );
830 $instance = new $class( $lbConf );
831
832 $lbFactoryConfigBuilder->setDomainAliases( $instance );
833
834 return $instance;
835 },
836
837 'DBLoadBalancerFactoryConfigBuilder' => static function ( MediaWikiServices $services ): MWLBFactory {
838 $mainConfig = $services->getMainConfig();
839 if ( $services->getObjectCacheFactory()->isDatabaseId(
840 $mainConfig->get( MainConfigNames::MainCacheType )
841 ) ) {
842 $wanCache = WANObjectCache::newEmpty();
843 } else {
844 $wanCache = $services->getMainWANObjectCache();
845 }
846 $srvCache = $services->getLocalServerObjectCache();
847 if ( $srvCache instanceof EmptyBagOStuff ) {
848 // Use process cache if no APCU or other local-server cache (e.g. on CLI)
849 $srvCache = new HashBagOStuff( [ 'maxKeys' => 100 ] );
850 }
851
852 return new MWLBFactory(
853 new ServiceOptions( MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $services->getMainConfig() ),
855 $mainConfig->get( MainConfigNames::ReadOnly ),
856 $mainConfig->get( MainConfigNames::ReadOnlyFile )
857 ),
858 $services->getChronologyProtector(),
859 $srvCache,
860 $wanCache,
861 $services->getCriticalSectionProvider(),
862 $services->getStatsFactory(),
863 ExtensionRegistry::getInstance()->getAttribute( 'DatabaseVirtualDomains' ),
864 $services->getTracer(),
865 RequestContext::getMain()->getRequest()->getIP()
866 );
867 },
868
869 'DefaultOutputPipeline' => static function ( MediaWikiServices $services ): OutputTransformPipeline {
871 new ServiceOptions(
872 DefaultOutputPipelineFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
873 ),
874 $services->getMainConfig(),
875 LoggerFactory::getInstance( 'Parser' ),
876 $services->getObjectFactory()
877 ) )->buildPipeline();
878 },
879
880 'DeletePageFactory' => static function ( MediaWikiServices $services ): DeletePageFactory {
881 return $services->getService( '_PageCommandFactory' );
882 },
883
884 'DomainEventDispatcher' => static function ( MediaWikiServices $services ): DomainEventDispatcher {
885 return $services->getService( '_DomainEventDispatcher' );
886 },
887
888 'DomainEventSource' => static function ( MediaWikiServices $services ): DomainEventSource {
889 return $services->getService( '_DomainEventDispatcher' );
890 },
891
892 'Emailer' => static function ( MediaWikiServices $services ): IEmailer {
893 return new Emailer();
894 },
895
896 'EmailUserFactory' => static function ( MediaWikiServices $services ): EmailUserFactory {
898 new ServiceOptions( EmailUser::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
899 $services->getHookContainer(),
900 $services->getUserOptionsLookup(),
901 $services->getCentralIdLookup(),
902 $services->getUserFactory(),
903 $services->getEmailer(),
904 $services->getMessageFormatterFactory(),
905 $services->getMessageFormatterFactory()->getTextFormatter(
906 $services->getContentLanguageCode()->toString()
907 )
908 );
909 },
910
911 'EventRelayerGroup' => static function ( MediaWikiServices $services ): EventRelayerGroup {
912 return new EventRelayerGroup( $services->getMainConfig()->get( MainConfigNames::EventRelayerConfig ) );
913 },
914
915 'ExtensionRegistry' => static function ( MediaWikiServices $services ): ExtensionRegistry {
916 return ExtensionRegistry::getInstance();
917 },
918
919 'ExternalStoreAccess' => static function ( MediaWikiServices $services ): ExternalStoreAccess {
920 return new ExternalStoreAccess(
921 $services->getExternalStoreFactory(),
922 LoggerFactory::getInstance( 'ExternalStore' )
923 );
924 },
925
926 'ExternalStoreFactory' => static function ( MediaWikiServices $services ): ExternalStoreFactory {
927 $config = $services->getMainConfig();
928 $writeStores = $config->get( MainConfigNames::DefaultExternalStore );
929
930 return new ExternalStoreFactory(
931 $config->get( MainConfigNames::ExternalStores ),
932 ( $writeStores !== false ) ? (array)$writeStores : [],
933 $services->getDBLoadBalancer()->getLocalDomainID(),
934 LoggerFactory::getInstance( 'ExternalStore' )
935 );
936 },
937
938 'FeatureShutdown' => static function ( MediaWikiServices $services ): FeatureShutdown {
940 new ServiceOptions(
941 FeatureShutdown::CONSTRUCTOR_OPTIONS,
942 $services->getMainConfig()
943 )
944 );
945 },
946
947 'FileBackendGroup' => static function ( MediaWikiServices $services ): FileBackendGroup {
948 $mainConfig = $services->getMainConfig();
949
950 $ld = WikiMap::getCurrentWikiDbDomain();
951 $fallbackWikiId = WikiMap::getWikiIdFromDbDomain( $ld );
952 // If the local wiki ID and local domain ID do not match, probably due to a non-default
953 // schema, issue a warning. A non-default schema indicates that it might be used to
954 // disambiguate different wikis.
955 $legacyDomainId = strlen( $ld->getTablePrefix() )
956 ? "{$ld->getDatabase()}-{$ld->getTablePrefix()}"
957 : $ld->getDatabase();
958 if ( $ld->getSchema() !== null && $legacyDomainId !== $fallbackWikiId ) {
959 wfWarn(
960 "Legacy default 'domainId' is '$legacyDomainId' but wiki ID is '$fallbackWikiId'."
961 );
962 }
963
964 $cache = $services->getLocalServerObjectCache();
965 if ( $cache instanceof EmptyBagOStuff ) {
966 $cache = new HashBagOStuff();
967 }
968
969 return new FileBackendGroup(
970 new ServiceOptions( FileBackendGroup::CONSTRUCTOR_OPTIONS, $mainConfig,
971 [ 'fallbackWikiId' => $fallbackWikiId ] ),
972 $services->getReadOnlyMode(),
973 $cache,
974 $services->getMainWANObjectCache(),
975 $services->getMimeAnalyzer(),
976 $services->getLockManagerGroupFactory(),
977 $services->getTempFSFileFactory(),
978 $services->getObjectFactory()
979 );
980 },
981
982 'FormatterFactory' => static function ( MediaWikiServices $services ): FormatterFactory {
984 $services->getMessageParser(),
985 $services->getTitleFormatter(),
986 $services->getHookContainer(),
987 $services->getUserIdentityUtils(),
988 $services->getLanguageFactory(),
989 LoggerFactory::getInstance( 'status' )
990 );
991 },
992
993 'GenderCache' => static function ( MediaWikiServices $services ): GenderCache {
994 $nsInfo = $services->getNamespaceInfo();
995 // If there is no database, use defaults
996 if ( $services->isServiceDisabled( 'DBLoadBalancer' ) ) {
997 $userOptionsLookup = new StaticUserOptionsLookup(
998 [],
999 $services->getMainConfig()->get( MainConfigNames::DefaultUserOptions )
1000 );
1001 } else {
1002 $userOptionsLookup = $services->getUserOptionsLookup();
1003 }
1004 return new GenderCache( $nsInfo, $userOptionsLookup );
1005 },
1006
1007 'GlobalIdGenerator' => static function ( MediaWikiServices $services ): GlobalIdGenerator {
1008 $mainConfig = $services->getMainConfig();
1009
1010 return new GlobalIdGenerator(
1011 $mainConfig->get( MainConfigNames::TmpDirectory ),
1012 static function ( $command ) {
1013 return wfShellExec( $command );
1014 }
1015 );
1016 },
1017
1018 'GrantsInfo' => static function ( MediaWikiServices $services ): GrantsInfo {
1019 return new GrantsInfo(
1020 new ServiceOptions(
1021 GrantsInfo::CONSTRUCTOR_OPTIONS,
1022 $services->getMainConfig()
1023 )
1024 );
1025 },
1026
1027 'GrantsLocalization' => static function ( MediaWikiServices $services ): GrantsLocalization {
1029 $services->getGrantsInfo(),
1030 $services->getLinkRenderer(),
1031 $services->getLanguageFactory(),
1032 $services->getContentLanguage()
1033 );
1034 },
1035
1036 'GroupPermissionsLookup' => static function ( MediaWikiServices $services ): GroupPermissionsLookup {
1038 new ServiceOptions( GroupPermissionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
1039 );
1040 },
1041
1042 'HideUserUtils' => static function ( MediaWikiServices $services ): HideUserUtils {
1043 return new HideUserUtils();
1044 },
1045
1046 'HookContainer' => static function ( MediaWikiServices $services ): HookContainer {
1047 // NOTE: This is called while $services is being initialized, in order to call the
1048 // MediaWikiServices hook.
1049
1050 $configHooks = $services->getBootstrapConfig()->get( MainConfigNames::Hooks );
1051
1052 $extRegistry = ExtensionRegistry::getInstance();
1053 $extHooks = $extRegistry->getAttribute( 'Hooks' );
1054 $extDeprecatedHooks = $extRegistry->getAttribute( 'DeprecatedHooks' );
1055
1056 return new HookContainer(
1057 new StaticHookRegistry( $configHooks, $extHooks, $extDeprecatedHooks ),
1058 $services->getObjectFactory()
1059 );
1060 },
1061
1062 'HtmlCacheUpdater' => static function ( MediaWikiServices $services ): HTMLCacheUpdater {
1063 $config = $services->getMainConfig();
1064
1065 return new HTMLCacheUpdater(
1066 $services->getHookContainer(),
1067 $services->getTitleFactory(),
1068 $config->get( MainConfigNames::CdnReboundPurgeDelay ),
1069 $config->get( MainConfigNames::UseFileCache ),
1070 $config->get( MainConfigNames::CdnMaxAge )
1071 );
1072 },
1073
1074 'HtmlTransformFactory' => static function ( MediaWikiServices $services ): HtmlTransformFactory {
1076 $services->getService( '_Parsoid' ),
1077 $services->getMainConfig()->get( MainConfigNames::ParsoidSettings ),
1078 $services->getParsoidPageConfigFactory(),
1079 $services->getContentHandlerFactory(),
1080 $services->getParsoidSiteConfig(),
1081 $services->getTitleFactory(),
1082 $services->getLanguageConverterFactory(),
1083 $services->getLanguageFactory()
1084 );
1085 },
1086
1087 'HttpRequestFactory' => static function ( MediaWikiServices $services ): HttpRequestFactory {
1089 new ServiceOptions(
1090 HttpRequestFactory::CONSTRUCTOR_OPTIONS,
1091 $services->getMainConfig()
1092 ),
1093 LoggerFactory::getInstance( 'http' ),
1094 $services->getTracer()
1095 );
1096 },
1097
1098 'InterwikiLookup' => static function ( MediaWikiServices $services ): InterwikiLookup {
1100 new ServiceOptions(
1101 ClassicInterwikiLookup::CONSTRUCTOR_OPTIONS,
1102 $services->getMainConfig(),
1103 [ 'wikiId' => WikiMap::getCurrentWikiId() ]
1104 ),
1105 $services->getContentLanguage(),
1106 $services->getMainWANObjectCache(),
1107 $services->getHookContainer(),
1108 $services->getConnectionProvider(),
1109 $services->getLanguageNameUtils()
1110 );
1111 },
1112
1113 'IntroMessageBuilder' => static function ( MediaWikiServices $services ): IntroMessageBuilder {
1115 $services->getMainConfig(),
1116 $services->getLinkRenderer(),
1117 $services->getPermissionManager(),
1118 $services->getUserNameUtils(),
1119 $services->getTempUserCreator(),
1120 $services->getUserFactory(),
1121 $services->getRestrictionStore(),
1122 $services->getDatabaseBlockStore(),
1123 $services->getReadOnlyMode(),
1124 $services->getSpecialPageFactory(),
1125 $services->getRepoGroup(),
1126 $services->getNamespaceInfo(),
1127 $services->getSkinFactory(),
1128 $services->getConnectionProvider(),
1129 $services->getUrlUtils()
1130 );
1131 },
1132
1133 'JobFactory' => static function ( MediaWikiServices $services ): JobFactory {
1134 return new JobFactory(
1135 $services->getObjectFactory(),
1136 $services->getMainConfig()->get( MainConfigNames::JobClasses )
1137 );
1138 },
1139
1140 'JobQueueGroup' => static function ( MediaWikiServices $services ): JobQueueGroup {
1141 return $services->getJobQueueGroupFactory()->makeJobQueueGroup();
1142 },
1143
1144 'JobQueueGroupFactory' => static function ( MediaWikiServices $services ): JobQueueGroupFactory {
1146 new ServiceOptions( JobQueueGroupFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1147 $services->getReadOnlyMode(),
1148 $services->getStatsFactory(),
1149 $services->getMainWANObjectCache(),
1150 $services->getGlobalIdGenerator()
1151 );
1152 },
1153
1154 'JobRunner' => static function ( MediaWikiServices $services ): JobRunner {
1155 return new JobRunner(
1156 new ServiceOptions( JobRunner::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1157 $services->getDBLoadBalancerFactory(),
1158 $services->getJobQueueGroup(),
1159 $services->getReadOnlyMode(),
1160 $services->getLinkCache(),
1161 $services->getStatsFactory(),
1162 LoggerFactory::getInstance( 'runJobs' )
1163 );
1164 },
1165
1166 'JsonCodec' => static function ( MediaWikiServices $services ): JsonCodec {
1167 return new JsonCodec( $services );
1168 },
1169
1170 'JwtCodec' => static function ( MediaWikiServices $services ): JwtCodec {
1171 return new RsaJwtCodec(
1172 new ServiceOptions( RsaJwtCodec::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
1173 );
1174 },
1175
1176 'LanguageConverterFactory' => static function ( MediaWikiServices $services ): LanguageConverterFactory {
1177 return new LanguageConverterFactory(
1178 new ServiceOptions( LanguageConverterFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1179 $services->getObjectFactory(),
1180 static function () use ( $services ) {
1181 return $services->getContentLanguage();
1182 }
1183 );
1184 },
1185
1186 'LanguageFactory' => static function ( MediaWikiServices $services ): LanguageFactory {
1187 return new LanguageFactory(
1188 new ServiceOptions( LanguageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1189 $services->getNamespaceInfo(),
1190 $services->getLocalisationCache(),
1191 $services->getLanguageNameUtils(),
1192 $services->getLanguageFallback(),
1193 $services->getLanguageConverterFactory(),
1194 $services->getHookContainer(),
1195 $services->getMainConfig()
1196 );
1197 },
1198
1199 'LanguageFallback' => static function ( MediaWikiServices $services ): LanguageFallback {
1200 return new LanguageFallback(
1201 $services->getMainConfig()->get( MainConfigNames::LanguageCode ),
1202 $services->getLocalisationCache(),
1203 $services->getLanguageNameUtils()
1204 );
1205 },
1206
1207 'LanguageNameSearch' => static function ( MediaWikiServices $services ): LanguageNameSearch {
1209 $services->getLanguageNameUtils()
1210 );
1211 },
1212
1213 'LanguageNameUtils' => static function ( MediaWikiServices $services ): LanguageNameUtils {
1214 return new LanguageNameUtils(
1215 new ServiceOptions(
1216 LanguageNameUtils::CONSTRUCTOR_OPTIONS,
1217 $services->getMainConfig()
1218 ),
1219 $services->getHookContainer()
1220 );
1221 },
1222
1223 'LeximorphFactory' => static function ( MediaWikiServices $services ): LeximorphFactory {
1226 MediaWiki\Language\LeximorphFactory::CONSTRUCTOR_OPTIONS,
1227 $services->getMainConfig()
1228 ),
1229 LoggerFactory::getInstance( 'leximorph' )
1230 );
1231 },
1232
1233 'LinkBatchFactory' => static function ( MediaWikiServices $services ): LinkBatchFactory {
1235 $services->getLinkCache(),
1236 $services->getTitleFormatter(),
1237 $services->getContentLanguage(),
1238 $services->getGenderCache(),
1239 $services->getConnectionProvider(),
1240 $services->getLinksMigration(),
1241 $services->getTempUserDetailsLookup(),
1242 LoggerFactory::getInstance( 'LinkBatch' )
1243 );
1244 },
1245
1246 'LinkCache' => static function ( MediaWikiServices $services ): LinkCache {
1247 // Database layer may be disabled, so processing without database connection
1248 $dbLoadBalancer = $services->isServiceDisabled( 'DBLoadBalancer' )
1249 ? null
1250 : $services->getDBLoadBalancer();
1251 $linkCache = new LinkCache(
1252 $services->getTitleFormatter(),
1253 $services->getMainWANObjectCache(),
1254 $services->getNamespaceInfo(),
1255 $dbLoadBalancer
1256 );
1257 $linkCache->setLogger( LoggerFactory::getInstance( 'LinkCache' ) );
1258 return $linkCache;
1259 },
1260
1261 'LinkRenderer' => static function ( MediaWikiServices $services ): LinkRenderer {
1262 return $services->getLinkRendererFactory()->create();
1263 },
1264
1265 'LinkRendererFactory' => static function ( MediaWikiServices $services ): LinkRendererFactory {
1267 $services->getTitleFormatter(),
1268 $services->getLinkCache(),
1269 $services->getSpecialPageFactory(),
1270 $services->getHookContainer(),
1271 $services->getTempUserConfig(),
1272 $services->getTempUserDetailsLookup(),
1273 $services->getUserIdentityLookup(),
1274 $services->getUserNameUtils()
1275 );
1276 },
1277
1278 'LinksMigration' => static function ( MediaWikiServices $services ): LinksMigration {
1280 $services->getMainConfig(),
1281 $services->getLinkTargetLookup()
1282 );
1283 },
1284
1285 'LinkTargetLookup' => static function ( MediaWikiServices $services ): LinkTargetLookup {
1287 $services->getConnectionProvider(),
1288 $services->getLocalServerObjectCache(),
1289 $services->getMainWANObjectCache()
1290 );
1291 },
1292
1293 'LintErrorChecker' => static function ( MediaWikiServices $services ): LintErrorChecker {
1295 $services->get( '_Parsoid' ),
1296 $services->getParsoidPageConfigFactory(),
1297 $services->getTitleFactory(),
1298 ExtensionRegistry::getInstance(),
1299 $services->getMainConfig(),
1300 );
1301 },
1302
1303 'LocalisationCache' => static function ( MediaWikiServices $services ): LocalisationCache {
1304 $conf = $services->getMainConfig()->get( MainConfigNames::LocalisationCacheConf );
1305
1306 $logger = LoggerFactory::getInstance( 'localisation' );
1307
1308 $store = LocalisationCache::getStoreFromConf(
1309 $conf, $services->getMainConfig()->get( MainConfigNames::CacheDirectory ) );
1310 $logger->debug( 'LocalisationCache using store ' . get_class( $store ) );
1311
1312 return new $conf['class'](
1313 new ServiceOptions(
1314 LocalisationCache::CONSTRUCTOR_OPTIONS,
1315 // Two of the options are stored in $wgLocalisationCacheConf
1316 $conf,
1317 // In case someone set that config variable and didn't reset all keys, set defaults.
1318 [
1319 'forceRecache' => false,
1320 'manualRecache' => false,
1321 ],
1322 // Some other options come from config itself
1323 $services->getMainConfig()
1324 ),
1325 $store,
1326 $logger,
1327 [ static function () use ( $services ) {
1328 // NOTE: Make sure we use the same cache object that is assigned in the
1329 // constructor of the MessageBlobStore class used by ResourceLoader.
1330 // T231866: Avoid circular dependency via ResourceLoader.
1331 MessageBlobStore::clearGlobalCacheEntry( $services->getMainWANObjectCache() );
1332 } ],
1333 $services->getLanguageNameUtils(),
1334 $services->getHookContainer()
1335 );
1336 },
1337
1338 'LocalServerObjectCache' => static function ( MediaWikiServices $services ): BagOStuff {
1339 return $services->getObjectCacheFactory()->getInstance( CACHE_ACCEL );
1340 },
1341
1342 'LockManagerGroupFactory' => static function ( MediaWikiServices $services ): LockManagerGroupFactory {
1344 WikiMap::getCurrentWikiDbDomain()->getId(),
1345 $services->getMainConfig()->get( MainConfigNames::LockManagers )
1346 );
1347 },
1348
1349 'LogFormatterFactory' => static function ( MediaWikiServices $services ): LogFormatterFactory {
1351 new ServiceOptions( LogFormatterFactory::SERVICE_OPTIONS, $services->getMainConfig() ),
1352 $services->getObjectFactory(),
1353 $services->getHookContainer(),
1354 $services->getLinkRenderer(),
1355 $services->getContentLanguage(),
1356 $services->getCommentFormatter(),
1357 $services->getUserEditTracker()
1358 );
1359 },
1360
1361 'MagicWordFactory' => static function ( MediaWikiServices $services ): MagicWordFactory {
1363 $services->getContentLanguage(),
1364 $services->getHookContainer()
1365 );
1366 },
1367
1368 'MainConfig' => static function ( MediaWikiServices $services ): Config {
1369 // Use the 'main' config from the ConfigFactory service.
1370 return $services->getConfigFactory()->makeConfig( 'main' );
1371 },
1372
1373 'MainObjectStash' => static function ( MediaWikiServices $services ): BagOStuff {
1374 $mainConfig = $services->getMainConfig();
1375
1376 $id = $mainConfig->get( MainConfigNames::MainStash );
1377 $store = $services->getObjectCacheFactory()->getInstance( $id );
1378 $store->getLogger()->debug( 'MainObjectStash using store {class}', [
1379 'class' => get_class( $store )
1380 ] );
1381
1382 return $store;
1383 },
1384
1385 'MainWANObjectCache' => static function ( MediaWikiServices $services ): WANObjectCache {
1386 $mainConfig = $services->getMainConfig();
1387
1388 $store = $services->getObjectCacheFactory()->getLocalClusterInstance();
1389 $logger = $store->getLogger();
1390 $logger->debug( 'MainWANObjectCache using store {class}', [
1391 'class' => get_class( $store )
1392 ] );
1393
1394 $wanParams = $mainConfig->get( MainConfigNames::WANObjectCache ) + [
1395 'cache' => $store,
1396 'logger' => $logger,
1397 'tracer' => $services->getTracer(),
1398 ];
1399 if ( MW_ENTRY_POINT !== 'cli' ) {
1400 // Send the statsd data post-send on HTTP requests; avoid in CLI mode (T181385)
1401 $wanParams['stats'] = $services->getStatsFactory();
1402 // Let pre-emptive refreshes happen post-send on HTTP requests
1403 $wanParams['asyncHandler'] = DeferredUpdates::addCallableUpdate( ... );
1404 }
1405 return new WANObjectCache( $wanParams );
1406 },
1407
1408 'MediaHandlerFactory' => static function ( MediaWikiServices $services ): MediaHandlerFactory {
1409 return new MediaHandlerFactory(
1410 LoggerFactory::getInstance( 'MediaHandlerFactory' ),
1411 $services->getMainConfig()->get( MainConfigNames::MediaHandlers )
1412 );
1413 },
1414
1415 'MergeHistoryFactory' => static function ( MediaWikiServices $services ): MergeHistoryFactory {
1416 return $services->getService( '_PageCommandFactory' );
1417 },
1418
1419 'MessageCache' => static function ( MediaWikiServices $services ): MessageCache {
1420 $mainConfig = $services->getMainConfig();
1421 $mainCache = $services->getObjectCacheFactory()
1422 ->getInstance( $mainConfig->get( MainConfigNames::MessageCacheType ) );
1423 $srvCache = $mainConfig->get( MainConfigNames::UseLocalMessageCache )
1424 ? $services->getLocalServerObjectCache()
1425 : new EmptyBagOStuff();
1426
1427 $logger = LoggerFactory::getInstance( 'MessageCache' );
1428 $logger->debug( 'MessageCache using store {class}', [
1429 'class' => get_class( $mainCache )
1430 ] );
1431
1432 $options = new ServiceOptions( MessageCache::CONSTRUCTOR_OPTIONS, $mainConfig );
1433
1434 return new MessageCache(
1435 $services->getMainWANObjectCache(),
1436 $mainCache,
1437 $srvCache,
1438 $services->getContentLanguage(),
1439 $services->getLanguageConverterFactory(),
1440 $logger,
1441 $options,
1442 $services->getLocalisationCache(),
1443 $services->getLanguageNameUtils(),
1444 $services->getLanguageFallback(),
1445 $services->getHookContainer(),
1446 $services->getMessageParser()
1447 );
1448 },
1449
1450 'MessageFormatterFactory' => static function ( MediaWikiServices $services ): IMessageFormatterFactory {
1452 },
1453
1454 'MessageParser' => static function ( MediaWikiServices $services ): MessageParser {
1456 $services->getParserFactory(),
1457 $services->getDefaultOutputPipeline(),
1458 $services->getLanguageFactory(),
1459 LoggerFactory::getInstance( 'MessageParser' )
1460 );
1461 },
1462
1463 'MicroStash' => static function ( MediaWikiServices $services ): BagOStuff {
1464 $mainConfig = $services->getMainConfig();
1465
1466 $id = $mainConfig->get( MainConfigNames::MicroStashType );
1467 $store = $services->getObjectCacheFactory()->getInstance( $id );
1468
1469 $store->getLogger()->debug( 'MicroStash using store {class}', [
1470 'class' => get_class( $store )
1471 ] );
1472
1473 return $store;
1474 },
1475
1476 'MimeAnalyzer' => static function ( MediaWikiServices $services ): MimeAnalyzer {
1477 $logger = LoggerFactory::getInstance( 'Mime' );
1478 $mainConfig = $services->getMainConfig();
1479 $hookRunner = new HookRunner( $services->getHookContainer() );
1480 $params = [
1481 'typeFile' => $mainConfig->get( MainConfigNames::MimeTypeFile ),
1482 'infoFile' => $mainConfig->get( MainConfigNames::MimeInfoFile ),
1483 'xmlTypes' => $mainConfig->get( MainConfigNames::XMLMimeTypes ),
1484 'guessCallback' => static function (
1485 $mimeAnalyzer, &$head, &$tail, $file, &$mime
1486 ) use ( $logger, $hookRunner ) {
1487 // Also test DjVu
1488 $deja = new DjVuImage( $file );
1489 if ( $deja->isValid() ) {
1490 $logger->info( "Detected $file as image/vnd.djvu\n" );
1491 $mime = 'image/vnd.djvu';
1492
1493 return;
1494 }
1495 // Some strings by reference for performance - assuming well-behaved hooks
1496 $hookRunner->onMimeMagicGuessFromContent(
1497 $mimeAnalyzer, $head, $tail, $file, $mime );
1498 },
1499 'extCallback' => static function ( $mimeAnalyzer, $ext, &$mime ) use ( $hookRunner ) {
1500 // Media handling extensions can improve the MIME detected
1501 $hookRunner->onMimeMagicImproveFromExtension( $mimeAnalyzer, $ext, $mime );
1502 },
1503 'initCallback' => static function ( $mimeAnalyzer ) use ( $hookRunner ) {
1504 // Allow media handling extensions adding MIME-types and MIME-info
1505 $hookRunner->onMimeMagicInit( $mimeAnalyzer );
1506 },
1507 'logger' => $logger
1508 ];
1509
1510 if ( $params['infoFile'] === 'includes/mime.info' ) {
1511 $params['infoFile'] = MimeAnalyzer::USE_INTERNAL;
1512 }
1513
1514 if ( $params['typeFile'] === 'includes/mime.types' ) {
1515 $params['typeFile'] = MimeAnalyzer::USE_INTERNAL;
1516 }
1517
1518 $detectorCmd = $mainConfig->get( MainConfigNames::MimeDetectorCommand );
1519 if ( $detectorCmd ) {
1520 $factory = $services->getShellCommandFactory();
1521 $params['detectCallback'] = static function ( $file ) use ( $detectorCmd, $factory ) {
1522 $result = $factory->create()
1523 // $wgMimeDetectorCommand can contain commands with parameters
1524 ->unsafeParams( $detectorCmd )
1525 ->params( $file )
1526 ->execute();
1527 return $result->getStdout();
1528 };
1529 }
1530
1531 return new MimeAnalyzer( $params );
1532 },
1533
1534 'MovePageFactory' => static function ( MediaWikiServices $services ): MovePageFactory {
1535 return $services->getService( '_PageCommandFactory' );
1536 },
1537
1538 'MultiFormatUserIdentityLookup' => static function ( MediaWikiServices $services ): MultiFormatUserIdentityLookup {
1540 $services->getActorStoreFactory(),
1541 $services->getUserFactory(),
1542 new ServiceOptions( MultiFormatUserIdentityLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
1543 );
1544 },
1545
1546 'NamespaceInfo' => static function ( MediaWikiServices $services ): NamespaceInfo {
1548 new ServiceOptions( NamespaceInfo::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1549 $services->getHookContainer(),
1550 ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' ),
1551 ExtensionRegistry::getInstance()->getAttribute( 'ImmovableNamespaces' )
1552 );
1553 },
1554
1555 'NameTableStoreFactory' => static function ( MediaWikiServices $services ): NameTableStoreFactory {
1557 $services->getDBLoadBalancerFactory(),
1558 $services->getMainWANObjectCache(),
1559 LoggerFactory::getInstance( 'NameTableSqlStore' )
1560 );
1561 },
1562
1563 'NotificationService' => static function ( MediaWikiServices $services ): NotificationService {
1564 $handlers = ExtensionRegistry::getInstance()->getAttribute( 'NotificationHandlers' );
1565 // Inject default MediaWiki handlers
1566 $handlers[] = NotificationService::RECENT_CHANGE_HANDLER_SPEC;
1567
1568 return new NotificationService(
1569 LoggerFactory::getInstance( 'Notification' ),
1570 $services->getObjectFactory(),
1571 $services->getService( '_NotificationMiddlewareChain' ),
1572 $handlers
1573 );
1574 },
1575
1576 'ObjectCacheFactory' => static function ( MediaWikiServices $services ): ObjectCacheFactory {
1578 new ServiceOptions(
1579 ObjectCacheFactory::CONSTRUCTOR_OPTIONS,
1580 $services->getMainConfig()
1581 ),
1582 $services->getStatsFactory(),
1583 LoggerFactory::getProvider(),
1584 // Prevent a recursive service instantiation on DBLoadBalancerFactory
1585 // and ensure the service keeps working when DB storage is disabled.
1586 static function () use ( $services ) {
1587 return $services->getDBLoadBalancerFactory();
1588 },
1589 WikiMap::getCurrentWikiDbDomain()->getId(),
1590 $services->getTracer()
1591 );
1592 },
1593
1594 'ObjectFactory' => static function ( MediaWikiServices $services ): ObjectFactory {
1595 return new ObjectFactory( $services );
1596 },
1597
1598 'OldRevisionImporter' => static function ( MediaWikiServices $services ): OldRevisionImporter {
1599 return new ImportableOldRevisionImporter(
1600 true,
1601 LoggerFactory::getInstance( 'OldRevisionImporter' ),
1602 $services->getConnectionProvider(),
1603 $services->getRevisionStoreFactory()->getRevisionStoreForImport(),
1604 $services->getSlotRoleRegistry(),
1605 $services->getWikiPageFactory(),
1606 $services->getPageUpdaterFactory(),
1607 $services->getUserFactory()
1608 );
1609 },
1610
1611 'PageEditStash' => static function ( MediaWikiServices $services ): PageEditStash {
1613 $services->getObjectCacheFactory()->getLocalClusterInstance(),
1614 $services->getConnectionProvider(),
1615 LoggerFactory::getInstance( 'StashEdit' ),
1616 $services->getStatsFactory(),
1617 $services->getUserEditTracker(),
1618 $services->getUserFactory(),
1619 $services->getWikiPageFactory(),
1620 $services->getJsonCodec(),
1621 $services->getHookContainer(),
1622 defined( 'MEDIAWIKI_JOB_RUNNER' ) || MW_ENTRY_POINT === 'cli'
1623 ? PageEditStash::INITIATOR_JOB_OR_CLI
1624 : PageEditStash::INITIATOR_USER
1625 );
1626 },
1627
1628 'PageProps' => static function ( MediaWikiServices $services ): PageProps {
1629 return new PageProps(
1630 $services->getLinkBatchFactory(),
1631 $services->getConnectionProvider()
1632 );
1633 },
1634
1635 'PageRestHelperFactory' => static function ( MediaWikiServices $services ): PageRestHelperFactory {
1637 new ServiceOptions( PageRestHelperFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1638 $services->getRevisionLookup(),
1639 $services->getRevisionRenderer(),
1640 $services->getTitleFormatter(),
1641 $services->getPageStore(),
1642 $services->getParsoidOutputStash(),
1643 $services->getParserOutputAccess(),
1644 $services->getParsoidSiteConfig(),
1645 $services->getHtmlTransformFactory(),
1646 $services->getContentHandlerFactory(),
1647 $services->getLanguageFactory(),
1648 $services->getRedirectStore(),
1649 $services->getLanguageConverterFactory(),
1650 $services->getTitleFactory(),
1651 $services->getConnectionProvider(),
1652 $services->getChangeTagsStore(),
1653 $services->getStatsFactory()
1654 );
1655 },
1656
1657 'PageStore' => static function ( MediaWikiServices $services ): PageStore {
1658 return $services->getPageStoreFactory()->getPageStore();
1659 },
1660
1661 'PageStoreFactory' => static function ( MediaWikiServices $services ): PageStoreFactory {
1662 $options = new ServiceOptions(
1663 PageStoreFactory::CONSTRUCTOR_OPTIONS,
1664 $services->getMainConfig()
1665 );
1666
1667 return new PageStoreFactory(
1668 $options,
1669 $services->getDBLoadBalancerFactory(),
1670 $services->getNamespaceInfo(),
1671 $services->getTitleParser(),
1672 $services->getLinkCache(),
1673 $services->getStatsFactory()
1674 );
1675 },
1676
1677 'PageUpdaterFactory' => static function (
1678 MediaWikiServices $services
1680 $editResultCache = new EditResultCache(
1681 $services->getMainObjectStash(),
1682 $services->getConnectionProvider(),
1683 new ServiceOptions(
1684 EditResultCache::CONSTRUCTOR_OPTIONS,
1685 $services->getMainConfig()
1686 )
1687 );
1688
1689 return new PageUpdaterFactory(
1690 $services->getRevisionStore(),
1691 $services->getRevisionRenderer(),
1692 $services->getSlotRoleRegistry(),
1693 $services->getParserCache(),
1694 $services->getJobQueueGroup(),
1695 $services->getContentLanguage(),
1696 $services->getDBLoadBalancerFactory(),
1697 $services->getContentHandlerFactory(),
1698 $services->getDomainEventDispatcher(),
1699 $services->getHookContainer(),
1700 $editResultCache,
1701 LoggerFactory::getInstance( 'SavePage' ),
1702 new ServiceOptions(
1703 PageUpdaterFactory::CONSTRUCTOR_OPTIONS,
1704 $services->getMainConfig()
1705 ),
1706 $services->getUserGroupManager(),
1707 $services->getTitleFormatter(),
1708 $services->getContentTransformer(),
1709 $services->getPageEditStash(),
1710 $services->getMainWANObjectCache(),
1711 $services->getWikiPageFactory(),
1712 $services->getChangeTagsStore(),
1713 $services->getChangeTagsStore()->getSoftwareTags()
1714 );
1715 },
1716
1717 'Parser' => static function ( MediaWikiServices $services ): Parser {
1718 // This service exists as convenience function to get the global parser in global code.
1719 // Do not use this service for dependency injection or in service wiring (T343070).
1720 // Use the 'ParserFactory' service instead.
1721 return $services->getParserFactory()->getMainInstance();
1722 },
1723
1724 'ParserCache' => static function ( MediaWikiServices $services ): ParserCache {
1725 return $services->getParserCacheFactory()
1726 ->getParserCache( ParserCacheFactory::DEFAULT_NAME );
1727 },
1728
1729 'ParserCacheFactory' => static function ( MediaWikiServices $services ): ParserCacheFactory {
1730 $config = $services->getMainConfig();
1731 $cache = $services->getObjectCacheFactory()->getInstance( $config->get( MainConfigNames::ParserCacheType ) );
1732 $wanCache = $services->getMainWANObjectCache();
1733
1734 $options = new ServiceOptions( ParserCacheFactory::CONSTRUCTOR_OPTIONS, $config );
1735
1736 return new ParserCacheFactory(
1737 $cache,
1738 $wanCache,
1739 $services->getHookContainer(),
1740 $services->getJsonCodec(),
1741 $services->getStatsFactory(),
1742 LoggerFactory::getInstance( 'ParserCache' ),
1743 $options,
1744 $services->getTitleFactory(),
1745 $services->getWikiPageFactory(),
1746 $services->getGlobalIdGenerator()
1747 );
1748 },
1749
1750 'ParserFactory' => static function ( MediaWikiServices $services ): ParserFactory {
1751 $options = new ServiceOptions( Parser::CONSTRUCTOR_OPTIONS,
1752 $services->getMainConfig()
1753 );
1754
1755 return new ParserFactory(
1756 $options,
1757 $services->getMagicWordFactory(),
1758 $services->getContentLanguage(),
1759 $services->getUrlUtils(),
1760 $services->getSpecialPageFactory(),
1761 $services->getLinkRendererFactory(),
1762 $services->getNamespaceInfo(),
1763 LoggerFactory::getInstance( 'Parser' ),
1764 $services->getBadFileLookup(),
1765 $services->getLanguageConverterFactory(),
1766 $services->getLanguageNameUtils(),
1767 $services->getHookContainer(),
1768 $services->getTidy(),
1769 $services->getMainWANObjectCache(),
1770 $services->getUserOptionsLookup(),
1771 $services->getUserFactory(),
1772 $services->getTitleFormatter(),
1773 $services->getHttpRequestFactory(),
1774 $services->getTrackingCategories(),
1775 $services->getSignatureValidatorFactory(),
1776 $services->getUserNameUtils()
1777 );
1778 },
1779
1780 'ParserOutputAccess' => static function ( MediaWikiServices $services ): ParserOutputAccess {
1781 $poa = new ParserOutputAccess(
1782 $services->getParserCacheFactory(),
1783 $services->getRevisionLookup(),
1784 $services->getRevisionRenderer(),
1785 $services->getStatsFactory(),
1786 $services->getChronologyProtector(),
1787 $services->getWikiPageFactory(),
1788 $services->getTitleFormatter(),
1789 $services->getTracer(),
1790 $services->getPoolCounterFactory()
1791 );
1792
1793 $poa->setLogger( LoggerFactory::getInstance( 'ParserOutputAccess' ) );
1794 return $poa;
1795 },
1796
1797 'ParsoidDataAccess' => static function ( MediaWikiServices $services ): DataAccess {
1798 $mainConfig = $services->getMainConfig();
1799 return new MWDataAccess(
1801 $services->getRepoGroup(),
1802 $services->getBadFileLookup(),
1803 $services->getHookContainer(),
1804 $services->getContentTransformer(),
1805 $services->getTrackingCategories(),
1806 $services->getReadOnlyMode(),
1807 $services->getParserFactory(), // *legacy* parser factory
1808 $services->getLinkBatchFactory(),
1809 $services->getLinkRenderer()
1810 );
1811 },
1812
1813 'ParsoidOutputStash' => static function ( MediaWikiServices $services ): ParsoidOutputStash {
1814 // TODO: Determine storage requirements and config options for stashing parsoid
1815 // output for VE edits (T309016).
1816 $config = $services->getMainConfig()->get( MainConfigNames::ParsoidCacheConfig );
1817 $backend = $config['StashType']
1818 ? $services->getObjectCacheFactory()->getInstance( $config['StashType'] )
1819 : $services->getMainObjectStash();
1820
1821 return new SimpleParsoidOutputStash(
1822 $services->getJsonCodec(),
1823 $backend,
1824 $config['StashDuration']
1825 );
1826 },
1827
1828 'ParsoidPageConfigFactory' => static function ( MediaWikiServices $services ): MWPageConfigFactory {
1829 return new MWPageConfigFactory(
1830 $services->getRevisionStore(),
1831 $services->getSlotRoleRegistry(),
1832 $services->getLanguageFactory()
1833 );
1834 },
1835
1836 'ParsoidParserFactory' => static function ( MediaWikiServices $services ): ParsoidParserFactory {
1838 $services->getParsoidSiteConfig(),
1839 $services->getParsoidDataAccess(),
1840 $services->getParsoidPageConfigFactory(),
1841 $services->getLanguageConverterFactory(),
1842 $services->getParserFactory()
1843 );
1844 },
1845
1846 'ParsoidSiteConfig' => static function ( MediaWikiServices $services ): MWSiteConfig {
1847 $mainConfig = $services->getMainConfig();
1848 $parsoidSettings = $mainConfig->get( MainConfigNames::ParsoidSettings );
1849 return new MWSiteConfig(
1851 $parsoidSettings,
1852 $services->getObjectFactory(),
1853 $services->getContentLanguage(),
1854 $services->getStatsdDataFactory(),
1855 $services->getStatsFactory(),
1856 $services->getMagicWordFactory(),
1857 $services->getNamespaceInfo(),
1858 $services->getSpecialPageFactory(),
1859 $services->getInterwikiLookup(),
1860 $services->getUserOptionsLookup(),
1861 $services->getLanguageFactory(),
1862 $services->getLanguageConverterFactory(),
1863 $services->getLanguageNameUtils(),
1864 $services->getUrlUtils(),
1865 $services->getContentHandlerFactory(),
1866 ExtensionRegistry::getInstance()->getAttribute( 'ParsoidModules' ),
1867 // These arguments are temporary and will be removed once
1868 // better solutions are found.
1869 $services->getParserFactory(), // T268776
1870 $mainConfig, // T268777
1871 ExtensionRegistry::getInstance()->isLoaded( 'TimedMediaHandler' )
1872 );
1873 },
1874
1875 'PasswordFactory' => static function ( MediaWikiServices $services ): PasswordFactory {
1876 $config = $services->getMainConfig();
1877 return new PasswordFactory(
1878 $config->get( MainConfigNames::PasswordConfig ),
1879 $config->get( MainConfigNames::PasswordDefault )
1880 );
1881 },
1882
1883 'PasswordReset' => static function ( MediaWikiServices $services ): PasswordReset {
1884 $options = new ServiceOptions( PasswordReset::CONSTRUCTOR_OPTIONS, $services->getMainConfig() );
1885 return new PasswordReset(
1886 $options,
1887 LoggerFactory::getInstance( 'authentication' ),
1888 $services->getAuthManager(),
1889 $services->getHookContainer(),
1890 $services->getUserIdentityLookup(),
1891 $services->getUserFactory(),
1892 $services->getUserNameUtils(),
1893 $services->getUserOptionsLookup()
1894 );
1895 },
1896
1897 'PatrolManager' => static function ( MediaWikiServices $services ): PatrolManager {
1899 new ServiceOptions( PatrolManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1900 $services->getConnectionProvider(),
1901 $services->getUserFactory(),
1902 $services->getHookContainer(),
1903 $services->getRevertedTagUpdateManager()
1904 );
1905 },
1906
1907 'PerDbNameStatsdDataFactory' => static function ( MediaWikiServices $services ): StatsdDataFactoryInterface {
1908 $config = $services->getMainConfig();
1909 $wiki = $config->get( MainConfigNames::DBname );
1911 $services->getStatsdDataFactory(),
1912 $wiki
1913 );
1914 },
1915
1916 'PermissionManager' => static function ( MediaWikiServices $services ): PermissionManager {
1918 new ServiceOptions(
1919 PermissionManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
1920 ),
1921 $services->getSpecialPageFactory(),
1922 $services->getNamespaceInfo(),
1923 $services->getGroupPermissionsLookup(),
1924 $services->getUserGroupManager(),
1925 $services->getBlockManager(),
1926 $services->getFormatterFactory()->getBlockErrorFormatter(
1927 new LazyLocalizationContext( RequestContext::getMain( ... ) )
1928 ),
1929 $services->getHookContainer(),
1930 $services->getUserIdentityLookup(),
1931 $services->getRedirectLookup(),
1932 $services->getRestrictionStore(),
1933 $services->getTitleFormatter(),
1934 $services->getTempUserConfig(),
1935 $services->getUserFactory(),
1936 $services->getActionFactory()
1937 );
1938 },
1939
1940 'Pingback' => static function ( MediaWikiServices $services ): Pingback {
1941 return new Pingback(
1942 $services->getMainConfig(),
1943 $services->getConnectionProvider(),
1944 $services->getObjectCacheFactory()->getLocalClusterInstance(),
1945 $services->getHttpRequestFactory(),
1946 LoggerFactory::getInstance( 'Pingback' )
1947 );
1948 },
1949
1950 'PoolCounterFactory' => static function ( MediaWikiServices $services ): PoolCounterFactory {
1951 $mainConfig = $services->getMainConfig();
1952 return new PoolCounterFactory(
1953 $mainConfig->get( MainConfigNames::PoolCounterConf ),
1954 $mainConfig->get( MainConfigNames::PoolCountClientConf ),
1955 LoggerFactory::getInstance( 'poolcounter' ),
1956 $services->getTracer()
1957 );
1958 },
1959
1960 'PreferencesFactory' => static function ( MediaWikiServices $services ): PreferencesFactory {
1961 $factory = new DefaultPreferencesFactory(
1962 new ServiceOptions(
1963 DefaultPreferencesFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
1964 $services->getContentLanguage(),
1965 $services->getAuthManager(),
1966 $services->getLinkRendererFactory()->create(),
1967 $services->getNamespaceInfo(),
1968 $services->getPermissionManager(),
1969 $services->getLanguageConverterFactory()->getLanguageConverter(),
1970 $services->getLanguageNameUtils(),
1971 $services->getHookContainer(),
1972 $services->getUserOptionsManager(),
1973 $services->getLanguageConverterFactory(),
1974 $services->getParserFactory(),
1975 $services->getSkinFactory(),
1976 $services->getUserGroupManager(),
1977 $services->getSignatureValidatorFactory()
1978 );
1979 $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
1980
1981 return $factory;
1982 },
1983
1984 'PreloadedContentBuilder' => static function ( MediaWikiServices $services ): PreloadedContentBuilder {
1986 $services->getContentHandlerFactory(),
1987 $services->getWikiPageFactory(),
1988 $services->getRedirectLookup(),
1989 $services->getSpecialPageFactory(),
1990 $services->getContentTransformer(),
1991 $services->getHookContainer(),
1992 );
1993 },
1994
1995 'ProxyLookup' => static function ( MediaWikiServices $services ): ProxyLookup {
1996 $mainConfig = $services->getMainConfig();
1997 return new ProxyLookup(
1998 $mainConfig->get( MainConfigNames::CdnServers ),
1999 $mainConfig->get( MainConfigNames::CdnServersNoPurge ),
2000 $services->getHookContainer(),
2001 $services->getLocalServerObjectCache()
2002 );
2003 },
2004
2005 'RateLimiter' => static function ( MediaWikiServices $services ): RateLimiter {
2006 $rateLimiter = new RateLimiter(
2007 new ServiceOptions( RateLimiter::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2008 $services->getWRStatsFactory(),
2009 $services->getCentralIdLookupFactory()->getNonLocalLookup(),
2010 $services->getUserFactory(),
2011 $services->getUserGroupManager(),
2012 $services->getHookContainer()
2013 );
2014
2015 $rateLimiter->setStats( $services->getStatsFactory() );
2016
2017 return $rateLimiter;
2018 },
2019
2020 'ReadOnlyMode' => static function ( MediaWikiServices $services ): ReadOnlyMode {
2021 return new ReadOnlyMode(
2023 $services->getMainConfig()->get( MainConfigNames::ReadOnly ),
2024 $services->getMainConfig()->get( MainConfigNames::ReadOnlyFile )
2025 ),
2026 $services->getDBLoadBalancerFactory()
2027 );
2028 },
2029
2030 'RecentChangeFactory' => static function ( MediaWikiServices $services ): RecentChangeFactory {
2031 return $services->getRecentChangeStore();
2032 },
2033
2034 'RecentChangeLookup' => static function ( MediaWikiServices $services ): RecentChangeLookup {
2035 return $services->getRecentChangeStore();
2036 },
2037
2038 'RecentChangeRCFeedNotifier' => static function ( MediaWikiServices $services ): RecentChangeRCFeedNotifier {
2040 $services->getHookContainer(),
2041 new ServiceOptions( RecentChangeRCFeedNotifier::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
2042 );
2043 },
2044
2045 'RecentChangeStore' => static function ( MediaWikiServices $services ): RecentChangeStore {
2046 $extRegistry = ExtensionRegistry::getInstance();
2047 return new RecentChangeStore(
2048 $services->getActorStoreFactory(),
2049 $services->getChangeTagsStore(),
2050 $services->getConnectionProvider(),
2051 $services->getCommentStore(),
2052 $services->getHookContainer(),
2053 $services->getJobQueueGroup(),
2054 $services->getPermissionManager(),
2055 $services->getRecentChangeRCFeedNotifier(),
2056 new ServiceOptions( RecentChangeStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2057 $services->getTitleFormatter(),
2058 $services->getWikiPageFactory(),
2059 $services->getUserFactory(),
2060 $extRegistry->getAttribute( 'RecentChangeSources' )
2061 );
2062 },
2063
2064 'RedirectLookup' => static function ( MediaWikiServices $services ): RedirectLookup {
2065 return $services->getRedirectStore();
2066 },
2067
2068 'RedirectStore' => static function ( MediaWikiServices $services ): RedirectStore {
2070 $services->getConnectionProvider(),
2071 $services->getPageStore(),
2072 $services->getTitleParser(),
2073 $services->getRepoGroup(),
2074 LoggerFactory::getInstance( 'RedirectStore' )
2075 );
2076 },
2077
2078 'RenameUserFactory' => static function ( MediaWikiServices $services ): RenameUserFactory {
2080 new ServiceOptions( RenameUserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2081 $services->getCentralIdLookupFactory(),
2082 $services->getJobQueueGroupFactory(),
2083 $services->getMovePageFactory(),
2084 $services->getUserFactory(),
2085 $services->getUserNameUtils(),
2086 $services->getPermissionManager(),
2087 $services->getTitleFactory(),
2088 );
2089 },
2090
2091 'RepoGroup' => static function ( MediaWikiServices $services ): RepoGroup {
2092 $config = $services->getMainConfig();
2093 return new RepoGroup(
2094 $config->get( MainConfigNames::LocalFileRepo ),
2095 $config->get( MainConfigNames::ForeignFileRepos ),
2096 $services->getMainWANObjectCache(),
2097 $services->getMimeAnalyzer()
2098 );
2099 },
2100
2101 'ResourceLoader' => static function ( MediaWikiServices $services ): ResourceLoader {
2102 $config = $services->getMainConfig();
2103
2104 $maxage = $config->get( MainConfigNames::ResourceLoaderMaxage );
2105 $rl = new ResourceLoader(
2106 $config,
2107 LoggerFactory::getInstance( 'resourceloader' ),
2108 new DependencyStore( $services->getMainObjectStash() ),
2109 [
2110 'loadScript' => $config->get( MainConfigNames::LoadScript ),
2111 'maxageVersioned' => $maxage['versioned'] ?? null,
2112 'maxageUnversioned' => $maxage['unversioned'] ?? null,
2113 ]
2114 );
2115
2116 $extRegistry = ExtensionRegistry::getInstance();
2117 // Attribute has precedence over config
2118 $modules = $extRegistry->getAttribute( 'ResourceModules' )
2119 + $config->get( MainConfigNames::ResourceModules );
2120 $moduleSkinStyles = $extRegistry->getAttribute( 'ResourceModuleSkinStyles' )
2121 + $config->get( MainConfigNames::ResourceModuleSkinStyles );
2122
2123 $rl->setModuleSkinStyles( $moduleSkinStyles );
2124 $rl->addSource( $config->get( MainConfigNames::ResourceLoaderSources ) );
2125
2126 // Core modules, then extension/skin modules
2127 $rl->register( include MW_INSTALL_PATH . '/resources/Resources.php' );
2128 $rl->register( $modules );
2129 $hookRunner = new \MediaWiki\ResourceLoader\HookRunner( $services->getHookContainer() );
2130 $hookRunner->onResourceLoaderRegisterModules( $rl );
2131
2132 $msgPosterAttrib = $extRegistry->getAttribute( 'MessagePosterModule' );
2133 $rl->register( 'mediawiki.messagePoster', [
2134 'localBasePath' => MW_INSTALL_PATH,
2135 'debugRaw' => false,
2136 'scripts' => [
2137 'resources/src/mediawiki.messagePoster/factory.js',
2138 'resources/src/mediawiki.messagePoster/MessagePoster.js',
2139 'resources/src/mediawiki.messagePoster/WikitextMessagePoster.js',
2140 ...$msgPosterAttrib['scripts'] ?? [],
2141 ],
2142 'dependencies' => [
2143 'oojs',
2144 'mediawiki.api',
2145 'mediawiki.ForeignApi',
2146 ...$msgPosterAttrib['dependencies'] ?? [],
2147 ],
2148 ] );
2149
2150 if ( $config->get( MainConfigNames::EnableJavaScriptTest ) === true ) {
2151 $rl->registerTestModules();
2152 }
2153
2154 return $rl;
2155 },
2156
2157 'RestrictedUserGroupChecker' => static function ( MediaWikiServices $services ): RestrictedUserGroupChecker {
2159 new ServiceOptions(
2160 RestrictedUserGroupChecker::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2161 ),
2162 $services->getUserRequirementsConditionChecker(),
2163 );
2164 },
2165
2166 'RestrictionStore' => static function ( MediaWikiServices $services ): RestrictionStore {
2168 new ServiceOptions(
2169 RestrictionStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2170 ),
2171 $services->getMainWANObjectCache(),
2172 $services->getDBLoadBalancerFactory(),
2173 $services->getLinkCache(),
2174 $services->getLinksMigration(),
2175 $services->getCommentStore(),
2176 $services->getHookContainer(),
2177 $services->getPageStore()
2178 );
2179 },
2180
2181 'RevertedTagUpdateManager' => static function ( MediaWikiServices $services ): RevertedTagUpdateManager {
2182 $editResultCache = new EditResultCache(
2183 $services->getMainObjectStash(),
2184 $services->getConnectionProvider(),
2185 new ServiceOptions(
2186 EditResultCache::CONSTRUCTOR_OPTIONS,
2187 $services->getMainConfig()
2188 )
2189 );
2190
2191 return new RevertedTagUpdateManager(
2192 $editResultCache,
2193 $services->getJobQueueGroup()
2194 );
2195 },
2196
2197 'RevisionFactory' => static function ( MediaWikiServices $services ): RevisionFactory {
2198 return $services->getRevisionStore();
2199 },
2200
2201 'RevisionLookup' => static function ( MediaWikiServices $services ): RevisionLookup {
2202 return $services->getRevisionStore();
2203 },
2204
2205 'RevisionRenderer' => static function ( MediaWikiServices $services ): RevisionRenderer {
2206 $renderer = new RevisionRenderer(
2207 $services->getDBLoadBalancer(),
2208 $services->getSlotRoleRegistry(),
2209 $services->getContentRenderer()
2210 );
2211
2212 $renderer->setLogger( LoggerFactory::getInstance( 'SaveParse' ) );
2213 return $renderer;
2214 },
2215
2216 'RevisionStore' => static function ( MediaWikiServices $services ): RevisionStore {
2217 return $services->getRevisionStoreFactory()->getRevisionStore();
2218 },
2219
2220 'RevisionStoreFactory' => static function ( MediaWikiServices $services ): RevisionStoreFactory {
2222 $services->getDBLoadBalancerFactory(),
2223 $services->getBlobStoreFactory(),
2224 $services->getNameTableStoreFactory(),
2225 $services->getSlotRoleRegistry(),
2226 $services->getMainWANObjectCache(),
2227 $services->getLocalServerObjectCache(),
2228 $services->getCommentStore(),
2229 $services->getActorStoreFactory(),
2230 LoggerFactory::getInstance( 'RevisionStore' ),
2231 $services->getContentHandlerFactory(),
2232 $services->getPageStoreFactory(),
2233 $services->getTitleFactory(),
2234 $services->getHookContainer(),
2235 $services->getRecentChangeLookup()
2236 );
2237 },
2238
2239 'RollbackPageFactory' => static function ( MediaWikiServices $services ): RollbackPageFactory {
2240 return $services->get( '_PageCommandFactory' );
2241 },
2242
2243 'RowCommentFormatter' => static function ( MediaWikiServices $services ): RowCommentFormatter {
2245 $services->getCommentParserFactory(),
2246 $services->getCommentStore()
2247 );
2248 },
2249
2250 'SearchEngineConfig' => static function ( MediaWikiServices $services ): SearchEngineConfig {
2252 new ServiceOptions(
2253 SearchEngineConfig::CONSTRUCTOR_OPTIONS,
2254 $services->getMainConfig()
2255 ),
2256 $services->getContentLanguage(),
2257 $services->getHookContainer(),
2258 ExtensionRegistry::getInstance()->getAttribute( 'SearchMappings' ),
2259 $services->getUserOptionsLookup()
2260 );
2261 },
2262
2263 'SearchEngineFactory' => static function ( MediaWikiServices $services ): SearchEngineFactory {
2264 return new SearchEngineFactory(
2265 $services->getSearchEngineConfig(),
2266 $services->getHookContainer(),
2267 $services->getConnectionProvider()
2268 );
2269 },
2270
2271 'SearchResultThumbnailProvider' => static function ( MediaWikiServices $services ): SearchResultThumbnailProvider {
2273 $services->getRepoGroup(),
2274 $services->getHookContainer()
2275 );
2276 },
2277
2278 'SessionManager' => static function ( MediaWikiServices $services ): SessionManagerInterface {
2280 $services->getMainConfig(),
2281 LoggerFactory::getInstance( 'session' ),
2282 $services->getCentralIdLookup(),
2283 $services->getHookContainer(),
2284 $services->getObjectFactory(),
2285 $services->getProxyLookup(),
2286 $services->getUrlUtils(),
2287 $services->getUserNameUtils(),
2288 $services->getSessionStore()
2289 );
2290 },
2291
2292 'SessionStore' => static function ( MediaWikiServices $services ): SessionStore {
2293 $objectCacheFactory = $services->getObjectCacheFactory();
2294 $mainConfig = $services->getMainConfig();
2295 $logger = LoggerFactory::getInstance( 'session' );
2296
2297 $anonCacheType = $mainConfig->get( MainConfigNames::AnonSessionCacheType );
2298 $authCacheType = $mainConfig->get( MainConfigNames::SessionCacheType );
2299
2300 if ( $anonCacheType !== false ) {
2301 return new MultiBackendSessionStore(
2302 $objectCacheFactory->getInstance( $anonCacheType ),
2303 $objectCacheFactory->getInstance( $authCacheType ),
2304 $logger,
2305 $services->getStatsFactory()
2306 );
2307 }
2308
2309 return new SingleBackendSessionStore(
2310 $objectCacheFactory->getInstance( $authCacheType ),
2311 $logger,
2312 $services->getStatsFactory()
2313 );
2314 },
2315
2316 'ShellboxClientFactory' => static function ( MediaWikiServices $services ): ShellboxClientFactory {
2317 $urls = $services->getMainConfig()->get( MainConfigNames::ShellboxUrls );
2318
2319 return new ShellboxClientFactory(
2320 $services->getHttpRequestFactory(),
2321 $urls,
2322 $services->getMainConfig()->get( MainConfigNames::ShellboxSecretKey )
2323 );
2324 },
2325
2326 'ShellCommandFactory' => static function ( MediaWikiServices $services ): CommandFactory {
2327 $config = $services->getMainConfig();
2328
2329 $limits = [
2330 'time' => $config->get( MainConfigNames::MaxShellTime ),
2331 'walltime' => $config->get( MainConfigNames::MaxShellWallClockTime ),
2332 'memory' => $config->get( MainConfigNames::MaxShellMemory ),
2333 'filesize' => $config->get( MainConfigNames::MaxShellFileSize ),
2334 ];
2335 $cgroup = $config->get( MainConfigNames::ShellCgroup );
2336 $restrictionMethod = $config->get( MainConfigNames::ShellRestrictionMethod );
2337
2338 $factory = new CommandFactory( $services->getShellboxClientFactory(),
2339 $limits, $cgroup, $restrictionMethod );
2340 $factory->setLogger( LoggerFactory::getInstance( 'exec' ) );
2341 $factory->logStderr();
2342
2343 return $factory;
2344 },
2345
2346 'SignatureValidatorFactory' => static function ( MediaWikiServices $services ): SignatureValidatorFactory {
2348 new ServiceOptions(
2349 SignatureValidator::CONSTRUCTOR_OPTIONS,
2350 $services->getMainConfig()
2351 ),
2352 // Use closures for these to avoid a circular dependency on Parser
2353 static function () use ( $services ) {
2354 return $services->getParserFactory();
2355 },
2356 static function () use ( $services ) {
2357 return $services->getLintErrorChecker();
2358 },
2359 $services->getSpecialPageFactory(),
2360 $services->getTitleFactory(),
2361 );
2362 },
2363
2364 'SiteLookup' => static function ( MediaWikiServices $services ): SiteLookup {
2365 // Use SiteStore as the SiteLookup as well. This was originally separated
2366 // to allow for a cacheable read-only interface, but this was never used.
2367 // SiteStore has caching (see below).
2368 return $services->getSiteStore();
2369 },
2370
2371 'SiteStore' => static function ( MediaWikiServices $services ): SiteStore {
2372 $rawSiteStore = new DBSiteStore( $services->getConnectionProvider() );
2373
2374 // If php-apcu is not installed, then CachingSiteStore still avoids
2375 // repeat DB queries in the same request through an in-process cache.
2376 $cache = $services->getLocalServerObjectCache();
2377
2378 return new CachingSiteStore( $rawSiteStore, $cache );
2379 },
2380
2381 'SkinFactory' => static function ( MediaWikiServices $services ): SkinFactory {
2382 $factory = new SkinFactory(
2383 $services->getObjectFactory(),
2384 (array)$services->getMainConfig()->get( MainConfigNames::SkipSkins )
2385 );
2386
2387 $names = $services->getMainConfig()->get( MainConfigNames::ValidSkinNames );
2388
2389 foreach ( $names as $name => $skin ) {
2390 if ( is_array( $skin ) ) {
2391 $spec = $skin;
2392 $displayName = $skin['displayname'] ?? $name;
2393 $skippable = $skin['skippable'] ?? null;
2394 } else {
2395 $displayName = $skin;
2396 $skippable = null;
2397 $spec = [
2398 'name' => $name,
2399 'class' => "Skin$skin"
2400 ];
2401 }
2402 $factory->register( $name, $displayName, $spec, $skippable );
2403 }
2404
2405 // Register a hidden "fallback" skin
2406 $factory->register( 'fallback', 'Fallback', [
2407 'class' => SkinFallback::class,
2408 'args' => [
2409 [
2410 'name' => 'fallback',
2411 'styles' => [ 'mediawiki.skinning.interface', 'mediawiki.codex.messagebox.styles' ],
2412 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/fallback',
2413 ]
2414 ]
2415 ], true );
2416 // Register a hidden skin for api output
2417 $factory->register( 'apioutput', 'ApiOutput', [
2418 'class' => SkinApi::class,
2419 'args' => [
2420 [
2421 'name' => 'apioutput',
2422 'styles' => [ 'mediawiki.skinning.interface' ],
2423 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/apioutput',
2424 ]
2425 ]
2426 ], true );
2427 // Register a hidden skin for Special:UserLogin and Special:CreateAccount
2428 $factory->register( 'authentication-popup', 'Authentication popup', [
2429 'class' => SkinAuthenticationPopup::class,
2430 'args' => [
2431 [
2432 'name' => 'authentication-popup',
2433 'styles' => [
2434 'mediawiki.skinning.interface',
2435 'mediawiki.special.userlogin.authentication-popup',
2436 ],
2437 'bodyClasses' => [ 'mw-authentication-popup' ],
2438 'responsive' => true,
2439 'messages' => [
2440 'sitesubtitle',
2441 'sitetitle',
2442 ],
2443 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/authentication-popup',
2444 ]
2445 ]
2446 ], true );
2447 // Register a hidden skin for outputting skin json
2448 $factory->register( 'json', 'SkinJSON', [
2449 'class' => SkinApi::class,
2450 'args' => [
2451 [
2452 'name' => 'json',
2453 'styles' => [],
2454 'format' => 'json',
2455 'templateDirectory' => dirname( __DIR__ ) . '/resources/templates/skins/apioutput',
2456 ]
2457 ]
2458 ], true );
2459
2460 return $factory;
2461 },
2462
2463 'SlotRoleRegistry' => static function ( MediaWikiServices $services ): SlotRoleRegistry {
2464 $registry = new SlotRoleRegistry(
2465 $services->getSlotRoleStore()
2466 );
2467
2468 $config = $services->getMainConfig();
2469 $contentHandlerFactory = $services->getContentHandlerFactory();
2470 $hookContainer = $services->getHookContainer();
2471 $titleFactory = $services->getTitleFactory();
2472 $registry->defineRole(
2473 SlotRecord::MAIN,
2474 static function () use ( $config, $contentHandlerFactory, $hookContainer, $titleFactory ) {
2475 return new MainSlotRoleHandler(
2476 $config->get( MainConfigNames::NamespaceContentModels ),
2477 $contentHandlerFactory,
2478 $hookContainer,
2479 $titleFactory
2480 );
2481 }
2482 );
2483
2484 return $registry;
2485 },
2486
2487 'SlotRoleStore' => static function ( MediaWikiServices $services ): NameTableStore {
2488 return $services->getNameTableStoreFactory()->getSlotRoles();
2489 },
2490
2491 'SpamChecker' => static function ( MediaWikiServices $services ): SpamChecker {
2492 return new SpamChecker(
2493 (array)$services->getMainConfig()->get( MainConfigNames::SpamRegex ),
2494 (array)$services->getMainConfig()->get( MainConfigNames::SummarySpamRegex )
2495 );
2496 },
2497
2498 'SpecialPageFactory' => static function ( MediaWikiServices $services ): SpecialPageFactory {
2500 new ServiceOptions(
2501 SpecialPageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2502 $services->getContentLanguage(),
2503 $services->getObjectFactory(),
2504 $services->getTitleFactory(),
2505 $services->getHookContainer(),
2506 $services->getStatsFactory(),
2507 );
2508 },
2509
2510 'StatsdDataFactory' => static function ( MediaWikiServices $services ): IBufferingStatsdDataFactory {
2511 return new NullStatsdDataFactory();
2512 },
2513
2514 'StatsFactory' => static function ( MediaWikiServices $services ): StatsFactory {
2515 $config = $services->getMainConfig();
2516 $format = OutputFormats::getFormatFromString(
2517 $config->get( MainConfigNames::StatsFormat ) ?? 'null'
2518 );
2519 $cache = new StatsCache;
2520 $emitter = OutputFormats::getNewEmitter(
2521 $config->get( MainConfigNames::StatsPrefix ),
2522 $cache,
2523 OutputFormats::getNewFormatter( $format ),
2524 $config->get( MainConfigNames::StatsTarget )
2525 );
2526 return new StatsFactory( $cache, $emitter, LoggerFactory::getInstance( 'Stats' ) );
2527 },
2528
2529 'TalkPageNotificationManager' => static function (
2530 MediaWikiServices $services
2533 new ServiceOptions(
2534 TalkPageNotificationManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2535 ),
2536 $services->getConnectionProvider(),
2537 $services->getReadOnlyMode(),
2538 $services->getRevisionLookup(),
2539 $services->getHookContainer(),
2540 $services->getUserFactory()
2541 );
2542 },
2543
2544 'TempFSFileFactory' => static function ( MediaWikiServices $services ): TempFSFileFactory {
2545 return new TempFSFileFactory( $services->getMainConfig()->get( MainConfigNames::TmpDirectory ) );
2546 },
2547
2548 'TempUserConfig' => static function ( MediaWikiServices $services ): RealTempUserConfig {
2550 $services->getMainConfig()->get( MainConfigNames::AutoCreateTempUser )
2551 );
2552 },
2553
2554 'TempUserCreator' => static function ( MediaWikiServices $services ): TempUserCreator {
2556 $services->getTempUserConfig(),
2557 $services->getObjectFactory(),
2558 $services->getUserFactory(),
2559 $services->getAuthManager(),
2560 $services->getCentralIdLookup(),
2561 // This should match ThrottlePreAuthenticationProvider's daily limit
2562 // and also implements its own short-term throttling limit (See T405565).
2563 new Throttler(
2564 $services->getMainConfig()->get( MainConfigNames::TempAccountCreationThrottle ),
2565 [
2566 'type' => 'tempacctcreate',
2567 'cache' => $services->getObjectCacheFactory()->getLocalClusterInstance(),
2568 ]
2569 ),
2570 new Throttler(
2571 $services->getMainConfig()->get( MainConfigNames::TempAccountNameAcquisitionThrottle ),
2572 [
2573 'type' => 'tempacctnameacquisition',
2574 'cache' => $services->getObjectCacheFactory()->getLocalClusterInstance(),
2575 ]
2576 )
2577 );
2578 },
2579
2580 'TempUserDetailsLookup' => static function ( MediaWikiServices $services ): TempUserDetailsLookup {
2582 $services->getTempUserConfig(),
2583 $services->getUserRegistrationLookup()
2584 );
2585 },
2586
2587 'Tidy' => static function ( MediaWikiServices $services ): TidyDriverBase {
2588 return new RemexDriver(
2589 new ServiceOptions(
2590 RemexDriver::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2591 )
2592 );
2593 },
2594
2595 'TitleFactory' => static function ( MediaWikiServices $services ): TitleFactory {
2596 return new TitleFactory();
2597 },
2598
2599 'TitleFormatter' => static function ( MediaWikiServices $services ): TitleFormatter {
2601 $services->getContentLanguage(),
2602 $services->getGenderCache(),
2603 $services->getNamespaceInfo()
2604 );
2605 },
2606
2607 'TitleMatcher' => static function ( MediaWikiServices $services ): TitleMatcher {
2608 return new TitleMatcher(
2609 $services->getContentLanguage(),
2610 $services->getLanguageConverterFactory(),
2611 $services->getHookContainer(),
2612 $services->getWikiPageFactory(),
2613 $services->getRepoGroup(),
2614 $services->getTitleFactory()
2615 );
2616 },
2617
2618 'TitleParser' => static function ( MediaWikiServices $services ): TitleParser {
2619 return new TitleParser(
2620 $services->getContentLanguage(),
2621 $services->getInterwikiLookup(),
2622 $services->getNamespaceInfo(),
2623 $services->getMainConfig()->get( MainConfigNames::LocalInterwikis )
2624 );
2625 },
2626
2627 'Tracer' => static function ( MediaWikiServices $services ): TracerInterface {
2628 $xReqIdPropagator = new MediaWikiPropagator( Telemetry::getInstance() );
2629 $otelConfig = $services->getMainConfig()->get( MainConfigNames::OpenTelemetryConfig );
2630 if ( $otelConfig === null || ( wfIsCLI() && !defined( 'MW_PHPUNIT_TEST' ) ) ) {
2631 return new NoopTracer( $xReqIdPropagator );
2632 }
2633
2634 $tracerState = TracerState::getInstance();
2635 $exporter = new OtlpHttpExporter(
2636 $services->getService( '_TracerHTTPClient' ),
2637 new HttpFactory(),
2638 LoggerFactory::getInstance( 'tracing' ),
2639 $otelConfig['endpoint'],
2640 $otelConfig['serviceName'],
2641 wfHostname()
2642 );
2643
2644 return new Tracer(
2645 new Clock(),
2646 new ProbabilisticSampler( $otelConfig['samplingProbability'] ),
2647 $exporter,
2648 $tracerState,
2649 new CompositePropagator( [ $xReqIdPropagator, new W3CTraceContextPropagator() ] )
2650 );
2651 },
2652
2653 'TrackingCategories' => static function ( MediaWikiServices $services ): TrackingCategories {
2655 new ServiceOptions(
2656 TrackingCategories::CONSTRUCTOR_OPTIONS,
2657 $services->getMainConfig()
2658 ),
2659 $services->getNamespaceInfo(),
2660 $services->getTitleParser(),
2661 LoggerFactory::getInstance( 'TrackingCategories' )
2662 );
2663 },
2664
2665 'UnblockUserFactory' => static function ( MediaWikiServices $services ): UnblockUserFactory {
2666 return $services->getService( '_UserBlockCommandFactory' );
2667 },
2668
2669 'UndeletePageFactory' => static function ( MediaWikiServices $services ): UndeletePageFactory {
2670 return $services->getService( '_PageCommandFactory' );
2671 },
2672
2673 'UploadRevisionImporter' => static function ( MediaWikiServices $services ): UploadRevisionImporter {
2674 return new ImportableUploadRevisionImporter(
2675 $services->getMainConfig()->get( MainConfigNames::EnableUploads ),
2676 LoggerFactory::getInstance( 'UploadRevisionImporter' )
2677 );
2678 },
2679
2680 'UploadVerification' => static function ( MediaWikiServices $services ): UploadVerification {
2682 new ServiceOptions(
2683 UploadVerification::CONSTRUCTOR_OPTIONS,
2684 $services->getMainConfig()
2685 ),
2686 $services->getMimeAnalyzer(),
2687 new SVGCSSChecker
2688 );
2689 },
2690
2691 'UrlUtils' => static function ( MediaWikiServices $services ): UrlUtils {
2692 $config = $services->getMainConfig();
2693 return new UrlUtils( [
2694 UrlUtils::SERVER => $config->get( MainConfigNames::Server ),
2695 UrlUtils::CANONICAL_SERVER => $config->get( MainConfigNames::CanonicalServer ),
2696 UrlUtils::INTERNAL_SERVER => $config->get( MainConfigNames::InternalServer ),
2697 UrlUtils::FALLBACK_PROTOCOL => RequestContext::getMain()->getRequest()->getProtocol(),
2698 UrlUtils::HTTPS_PORT => $config->get( MainConfigNames::HttpsPort ),
2699 UrlUtils::VALID_PROTOCOLS => $config->get( MainConfigNames::UrlProtocols ),
2700 ] );
2701 },
2702
2703 'UserCache' => static function ( MediaWikiServices $services ): UserCache {
2704 return new UserCache(
2705 LoggerFactory::getInstance( 'UserCache' ),
2706 $services->getConnectionProvider(),
2707 $services->getLinkBatchFactory()
2708 );
2709 },
2710
2711 'UserEditTracker' => static function ( MediaWikiServices $services ): UserEditTracker {
2713 $services->getActorNormalization(),
2714 $services->getConnectionProvider(),
2715 $services->getJobQueueGroup()
2716 );
2717 },
2718
2719 'UserFactory' => static function ( MediaWikiServices $services ): UserFactory {
2720 return new UserFactory(
2721 new ServiceOptions(
2722 UserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2723 ),
2724 $services->getDBLoadBalancerFactory(),
2725 $services->getUserNameUtils(),
2726 $services->getTempUserConfig()
2727 );
2728 },
2729
2730 'UserGroupAssignmentService' => static function ( MediaWikiServices $services ): UserGroupAssignmentService {
2732 $services->getUserGroupManagerFactory(),
2733 $services->getUserNameUtils(),
2734 $services->getUserFactory(),
2735 $services->getRestrictedUserGroupChecker(),
2736 new HookRunner( $services->getHookContainer() ),
2737 new ServiceOptions(
2738 UserGroupAssignmentService::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2739 ),
2740 $services->getTempUserConfig()
2741 );
2742 },
2743
2744 'UserGroupManager' => static function ( MediaWikiServices $services ): UserGroupManager {
2745 return $services->getUserGroupManagerFactory()->getUserGroupManager();
2746 },
2747
2748 'UserGroupManagerFactory' => static function ( MediaWikiServices $services ): UserGroupManagerFactory {
2750 new ServiceOptions(
2751 UserGroupManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2752 ),
2753 $services->getReadOnlyMode(),
2754 $services->getDBLoadBalancerFactory(),
2755 $services->getHookContainer(),
2756 $services->getJobQueueGroupFactory(),
2757 $services->getTempUserConfig(),
2758 $services->getUserRequirementsConditionCheckerFactory(),
2759 [ static function ( UserIdentity $user ) use ( $services ) {
2760 if ( $user->getWikiId() === UserIdentity::LOCAL ) {
2761 $services->getPermissionManager()->invalidateUsersRightsCache( $user );
2762 }
2763 $services->getUserFactory()->invalidateCache( $user );
2764 } ]
2765 );
2766 },
2767
2768 'UserIdentityLookup' => static function ( MediaWikiServices $services ): UserIdentityLookup {
2769 return $services->getActorStoreFactory()->getUserIdentityLookup();
2770 },
2771
2772 'UserIdentityUtils' => static function ( MediaWikiServices $services ): UserIdentityUtils {
2774 $services->getTempUserConfig()
2775 );
2776 },
2777
2778 'UserLinkRenderer' => static function ( MediaWikiServices $services ): UserLinkRenderer {
2780 $services->getHookContainer(),
2781 $services->getTempUserConfig(),
2782 $services->getSpecialPageFactory(),
2783 $services->getLinkRenderer(),
2784 $services->getTempUserDetailsLookup(),
2785 $services->getUserIdentityLookup(),
2786 $services->getUserNameUtils()
2787 );
2788 },
2789
2790 'UserNamePrefixSearch' => static function ( MediaWikiServices $services ): UserNamePrefixSearch {
2792 $services->getConnectionProvider(),
2793 $services->getUserNameUtils(),
2794 $services->getHideUserUtils()
2795 );
2796 },
2797
2798 'UserNameUtils' => static function ( MediaWikiServices $services ): UserNameUtils {
2799 $messageFormatterFactory = new MessageFormatterFactory( Message::FORMAT_PLAIN );
2800 return new UserNameUtils(
2801 new ServiceOptions(
2802 UserNameUtils::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2803 ),
2804 $services->getContentLanguage(),
2805 LoggerFactory::getInstance( 'UserNameUtils' ),
2806 $services->getTitleParser(),
2807 $messageFormatterFactory->getTextFormatter(
2808 $services->getContentLanguageCode()->toString()
2809 ),
2810 $services->getHookContainer(),
2811 $services->getTempUserConfig()
2812 );
2813 },
2814
2815 'UserOptionsLookup' => static function ( MediaWikiServices $services ): UserOptionsLookup {
2816 return $services->getUserOptionsManager();
2817 },
2818
2819 'UserOptionsManager' => static function ( MediaWikiServices $services ): UserOptionsManager {
2821 new ServiceOptions( UserOptionsManager::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2822 $services->get( '_DefaultOptionsLookup' ),
2823 $services->getLanguageConverterFactory(),
2824 $services->getConnectionProvider(),
2825 LoggerFactory::getInstance( 'UserOptionsManager' ),
2826 $services->getHookContainer(),
2827 $services->getUserFactory(),
2828 $services->getUserNameUtils(),
2829 $services->getObjectFactory(),
2830 ExtensionRegistry::getInstance()->getAttribute( 'UserOptionsStoreProviders' )
2831 );
2832 },
2833
2834 'UserRegistrationLookup' => static function ( MediaWikiServices $services ): UserRegistrationLookup {
2835 $lookup = new UserRegistrationLookup(
2836 new ServiceOptions( UserRegistrationLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
2837 $services->getObjectFactory()
2838 );
2839 if ( !$lookup->isRegistered( LocalUserRegistrationProvider::TYPE ) ) {
2840 throw new ConfigException( 'UserRegistrationLookup: Local provider is required' );
2841 }
2842 return $lookup;
2843 },
2844
2845 'UserRequirementsConditionChecker' => static function (
2846 MediaWikiServices $services
2848 {
2849 return $services->getUserRequirementsConditionCheckerFactory()
2850 ->getUserRequirementsConditionChecker( $services->getUserGroupManager() );
2851 },
2852
2853 'UserRequirementsConditionCheckerFactory' => static function (
2854 MediaWikiServices $services
2856 {
2858 new ServiceOptions(
2859 UserRequirementsConditionChecker::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2860 ),
2861 $services->getGroupPermissionsLookup(),
2862 $services->getHookContainer(),
2863 // TODO: Did anyone use this log group before? Should it be renamed? Or is there a better name we can use?
2864 LoggerFactory::getInstance( 'UserGroupManager' ),
2865 $services->getUserEditTracker(),
2866 $services->getUserRegistrationLookup(),
2867 $services->getUserFactory(),
2868 RequestContext::getMain(),
2869 );
2870 },
2871
2872 'WatchedItemQueryService' => static function ( MediaWikiServices $services ): WatchedItemQueryService {
2874 $services->getConnectionProvider(),
2875 $services->getWatchedItemStore(),
2876 $services->getMainConfig()->get( MainConfigNames::WatchlistExpiry ),
2877 $services->getMainConfig()->get( MainConfigNames::MaxExecutionTimeForExpensiveQueries )
2878 );
2879 },
2880
2881 'WatchedItemStore' => static function ( MediaWikiServices $services ): WatchedItemStore {
2882 $store = new WatchedItemStore(
2883 new ServiceOptions( WatchedItemStore::CONSTRUCTOR_OPTIONS,
2884 $services->getMainConfig() ),
2885 $services->getDBLoadBalancerFactory(),
2886 $services->getJobQueueGroup(),
2887 $services->getMainObjectStash(),
2888 new HashBagOStuff( [ 'maxKeys' => 100 ] ),
2889 $services->getReadOnlyMode(),
2890 $services->getNamespaceInfo(),
2891 $services->getRevisionLookup(),
2892 $services->getLinkBatchFactory(),
2893 $services->getWatchlistLabelStore()
2894 );
2895
2896 if ( $services->getMainConfig()->get( MainConfigNames::ReadOnlyWatchedItemStore ) ) {
2897 $store = new NoWriteWatchedItemStore( $store );
2898 }
2899
2900 return $store;
2901 },
2902
2903 'WatchlistLabelStore' => static function ( MediaWikiServices $services ): WatchlistLabelStore {
2905 $services->getConnectionProvider(),
2906 LoggerFactory::getInstance( 'WatchlistLabels' ),
2907 $services->getMainConfig()
2908 );
2909 },
2910
2911 'WatchlistManager' => static function ( MediaWikiServices $services ): WatchlistManager {
2913 [
2914 WatchlistManager::OPTION_ENOTIF => RecentChangeStore::isEnotifEnabled(
2915 new ServiceOptions( RecentChangeStore::CONSTRUCTOR_OPTIONS, $services->getMainConfig() )
2916 ),
2917 ],
2918 $services->getHookContainer(),
2919 $services->getReadOnlyMode(),
2920 $services->getRevisionLookup(),
2921 $services->getTalkPageNotificationManager(),
2922 $services->getWatchedItemStore(),
2923 $services->getUserFactory(),
2924 $services->getNamespaceInfo(),
2925 $services->getWikiPageFactory()
2926 );
2927 },
2928
2929 'WikiExporterFactory' => static function ( MediaWikiServices $services ): WikiExporterFactory {
2931 $services->getHookContainer(),
2932 $services->getRevisionStore(),
2933 $services->getTitleParser(),
2934 $services->getCommentStore()
2935 );
2936 },
2937
2938 'WikiImporterFactory' => static function ( MediaWikiServices $services ): WikiImporterFactory {
2939 return new WikiImporterFactory(
2940 $services->getMainConfig(),
2941 $services->getHookContainer(),
2942 $services->getContentLanguage(),
2943 $services->getNamespaceInfo(),
2944 $services->getTitleFactory(),
2945 $services->getWikiPageFactory(),
2946 $services->getWikiRevisionUploadImporter(),
2947 $services->getContentHandlerFactory(),
2948 $services->getSlotRoleRegistry()
2949 );
2950 },
2951
2952 'WikiPageFactory' => static function ( MediaWikiServices $services ): WikiPageFactory {
2954 $services->getTitleFactory(),
2955 new HookRunner( $services->getHookContainer() ),
2956 $services->getDBLoadBalancerFactory()
2957 );
2958 },
2959
2960 'WikiRevisionOldRevisionImporterNoUpdates' => static function (
2961 MediaWikiServices $services
2962 ): ImportableOldRevisionImporter {
2963 return new ImportableOldRevisionImporter(
2964 false,
2965 LoggerFactory::getInstance( 'OldRevisionImporter' ),
2966 $services->getConnectionProvider(),
2967 $services->getRevisionStoreFactory()->getRevisionStoreForImport(),
2968 $services->getSlotRoleRegistry(),
2969 $services->getWikiPageFactory(),
2970 $services->getPageUpdaterFactory(),
2971 $services->getUserFactory()
2972 );
2973 },
2974
2975 'WRStatsFactory' => static function ( MediaWikiServices $services ): WRStatsFactory {
2977 new BagOStuffStatsStore( $services->getMicroStash() )
2978 );
2979 },
2980
2981 '_ConditionalDefaultsLookup' => static function (
2982 MediaWikiServices $services
2985 new HookRunner( $services->getHookContainer() ),
2986 new ServiceOptions(
2987 ConditionalDefaultsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()
2988 ),
2989 $services->getUserRegistrationLookup(),
2990 $services->getUserIdentityUtils(),
2991 static function () use ( $services ) {
2992 return $services->getUserGroupManager();
2993 }
2994 );
2995 },
2996
2997 '_DefaultOptionsLookup' => static function ( MediaWikiServices $services ): DefaultOptionsLookup {
2999 new ServiceOptions( DefaultOptionsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3000 $services->getContentLanguageCode(),
3001 $services->getHookContainer(),
3002 $services->getNamespaceInfo(),
3003 $services->get( '_ConditionalDefaultsLookup' ),
3004 $services->getUserIdentityLookup(),
3005 $services->getUserNameUtils()
3006 );
3007 },
3008
3009 '_DomainEventDispatcher' => static function ( MediaWikiServices $services ): EventDispatchEngine {
3010 $dispatcher = new EventDispatchEngine(
3011 $services->getObjectFactory()
3012 );
3013
3014 // Core event wiring.
3015 // TODO: move this to a more prominent location? A separate file?
3016
3017 // Establish the propagation of events to various components
3018 $dispatcher->registerSubscriber( ChangeTrackingEventIngress::OBJECT_SPEC );
3019 $dispatcher->registerSubscriber( SearchEventIngress::OBJECT_SPEC );
3020 $dispatcher->registerSubscriber( LanguageEventIngress::OBJECT_SPEC );
3021
3022 $extensionRegistry = $services->getExtensionRegistry();
3023 $dispatcher->registerSubscriber( $extensionRegistry );
3024
3025 return $dispatcher;
3026 },
3027
3028 '_EditConstraintFactory' => static function ( MediaWikiServices $services ): EditConstraintFactory {
3029 // This service is internal and currently only exists because a significant number
3030 // of dependencies will be needed by different constraints. It is not part of
3031 // the public interface and has no corresponding method in MediaWikiServices
3033 // Multiple
3034 new ServiceOptions(
3035 EditConstraintFactory::CONSTRUCTOR_OPTIONS,
3036 $services->getMainConfig()
3037 ),
3038 LoggerFactory::getProvider(),
3039
3040 // EditFilterMergedContentHookConstraint
3041 $services->getHookContainer(),
3042
3043 // ReadOnlyConstraint
3044 $services->getReadOnlyMode(),
3045
3046 // SpamRegexConstraint
3047 $services->getSpamChecker(),
3048
3049 // LinkPurgeRateLimitConstraint
3050 $services->getRateLimiter(),
3051
3052 // RedirectConstraint
3053 $services->getRedirectLookup(),
3054
3055 // AccidentalRecreationConstraint
3056 $services->getConnectionProvider(),
3057 $services->getCommentStore(),
3058 );
3059 },
3060
3061 '_NotificationMiddlewareChain' => static function ( MediaWikiServices $services ): MiddlewareChain {
3063 $services->getObjectFactory(),
3064 ExtensionRegistry::getInstance()->getAttribute( 'NotificationMiddleware' )
3065 );
3066 },
3067
3068 '_PageCommandFactory' => static function ( MediaWikiServices $services ): PageCommandFactory {
3070 $services->getMainConfig(),
3071 $services->getDBLoadBalancerFactory(),
3072 $services->getNamespaceInfo(),
3073 $services->getWatchedItemStore(),
3074 $services->getRepoGroup(),
3075 $services->getReadOnlyMode(),
3076 $services->getContentHandlerFactory(),
3077 $services->getRevisionStoreFactory(),
3078 $services->getSpamChecker(),
3079 $services->getTitleFormatter(),
3080 $services->getHookContainer(),
3081 $services->getDomainEventDispatcher(),
3082 $services->getWikiPageFactory(),
3083 $services->getUserFactory(),
3084 $services->getActorMigration(),
3085 $services->getActorNormalization(),
3086 $services->getTitleFactory(),
3087 $services->getUserEditTracker(),
3088 $services->getCollationFactory(),
3089 $services->getJobQueueGroup(),
3090 $services->getCommentStore(),
3091 $services->getMainObjectStash(),
3092 WikiMap::getCurrentWikiDbDomain()->getId(),
3093 WebRequest::getRequestId(),
3094 $services->getBacklinkCacheFactory(),
3095 LoggerFactory::getInstance( 'UndeletePage' ),
3096 $services->getPageUpdaterFactory(),
3097 $services->getMessageFormatterFactory()->getTextFormatter(
3098 $services->getContentLanguageCode()->toString()
3099 ),
3100 $services->getArchivedRevisionLookup(),
3101 $services->getRestrictionStore(),
3102 $services->getLinkTargetLookup(),
3103 $services->getRedirectStore(),
3104 $services->getLogFormatterFactory()
3105 );
3106 },
3107
3108 '_ParserObserver' => static function ( MediaWikiServices $services ): ParserObserver {
3109 return new ParserObserver( LoggerFactory::getInstance( 'DuplicateParse' ) );
3110 },
3111
3112 '_Parsoid' => static function ( MediaWikiServices $services ): Parsoid {
3113 return new Parsoid(
3114 $services->getParsoidSiteConfig(),
3115 $services->getParsoidDataAccess()
3116 );
3117 },
3118
3119 '_SettingsBuilder' => static function ( MediaWikiServices $services ): SettingsBuilder {
3120 return SettingsBuilder::getInstance();
3121 },
3122
3123 '_SqlBlobStore' => static function ( MediaWikiServices $services ): SqlBlobStore {
3124 return $services->getBlobStoreFactory()->newSqlBlobStore();
3125 },
3126
3127 '_TracerHTTPClient' => static function (): ClientInterface {
3128 return new Client( [ 'http_errors' => false ] );
3129 },
3130
3131 '_UserBlockCommandFactory' => static function ( MediaWikiServices $services ): UserBlockCommandFactory {
3133 new ServiceOptions( UserBlockCommandFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig() ),
3134 $services->getHookContainer(),
3135 $services->getBlockPermissionCheckerFactory(),
3136 $services->getBlockTargetFactory(),
3137 $services->getDatabaseBlockStore(),
3138 $services->getBlockRestrictionStore(),
3139 $services->getUserFactory(),
3140 $services->getUserEditTracker(),
3141 LoggerFactory::getInstance( 'BlockManager' ),
3142 $services->getTitleFactory(),
3143 $services->getBlockActionInfo()
3144 );
3145 }
3146
3148 // NOTE: When adding a service here, don't forget to add a getter function
3149 // in the MediaWikiServices class. The convenience getter should just call
3150 // $this->getService( 'FooBarService' ).
3152
3153];
3154
3155// @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();}, '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()));}, '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;}, '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(new ServiceOptions(ConfirmEmailBuilderFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $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());}, '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 { $mainConfig=$services->getMainConfig();$lbFactoryConfigBuilder=$services->getDBLoadBalancerFactoryConfigBuilder();$lbConf=$lbFactoryConfigBuilder->applyDefaultConfig($mainConfig->get(MainConfigNames::LBFactoryConf));$class=$lbFactoryConfigBuilder->getLBFactoryClass( $lbConf);$instance=new $class( $lbConf);$lbFactoryConfigBuilder->setDomainAliases( $instance);return $instance;}, 'DBLoadBalancerFactoryConfigBuilder'=> static function(MediaWikiServices $services):MWLBFactory { $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]);} return new MWLBFactory(new ServiceOptions(MWLBFactory::APPLY_DEFAULT_CONFIG_OPTIONS, $services->getMainConfig()), new ConfiguredReadOnlyMode($mainConfig->get(MainConfigNames::ReadOnly), $mainConfig->get(MainConfigNames::ReadOnlyFile)), $services->getChronologyProtector(), $srvCache, $wanCache, $services->getCriticalSectionProvider(), $services->getStatsFactory(), ExtensionRegistry::getInstance() ->getAttribute( 'DatabaseVirtualDomains'), $services->getTracer(), RequestContext::getMain() ->getRequest() ->getIP());}, 'DefaultOutputPipeline'=> static function(MediaWikiServices $services):OutputTransformPipeline { return(new DefaultOutputPipelineFactory(new ServiceOptions(DefaultOutputPipelineFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getMainConfig(), LoggerFactory::getInstance( 'Parser'), $services->getObjectFactory())) ->buildPipeline();}, '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');}, '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->getObjectFactory());}, '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->getLanguageConverterFactory(), $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());}, '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->getMainWANObjectCache(), $services->getGlobalIdGenerator());}, 'JobRunner'=> static function(MediaWikiServices $services):JobRunner { return new JobRunner(new ServiceOptions(JobRunner::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getJobQueueGroup(), $services->getReadOnlyMode(), $services->getLinkCache(), $services->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();});}, 'LanguageFactory'=> static function(MediaWikiServices $services):LanguageFactory { return new LanguageFactory(new ServiceOptions(LanguageFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getNamespaceInfo(), $services->getLocalisationCache(), $services->getLanguageNameUtils(), $services->getLanguageFallback(), $services->getLanguageConverterFactory(), $services->getHookContainer(), $services->getMainConfig());}, 'LanguageFallback'=> static function(MediaWikiServices $services):LanguageFallback { return new LanguageFallback($services->getMainConfig() ->get(MainConfigNames::LanguageCode), $services->getLocalisationCache(), $services->getLanguageNameUtils());}, '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());}, '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());}, '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);}, '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(...);} return new WANObjectCache( $wanParams);}, 'MediaHandlerFactory'=> static function(MediaWikiServices $services):MediaHandlerFactory { return new MediaHandlerFactory(LoggerFactory::getInstance( 'MediaHandlerFactory'), $services->getMainConfig() ->get(MainConfigNames::MediaHandlers));}, 'MergeHistoryFactory'=> static function(MediaWikiServices $services):MergeHistoryFactory { return $services->getService( '_PageCommandFactory');}, 'MessageCache'=> static function(MediaWikiServices $services):MessageCache { $mainConfig=$services->getMainConfig();$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'));}, '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->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());}, '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());}, 'ParserFactory'=> static function(MediaWikiServices $services):ParserFactory { $options=new ServiceOptions(Parser::CONSTRUCTOR_OPTIONS, $services->getMainConfig());return new ParserFactory($options, $services->getMagicWordFactory(), $services->getContentLanguage(), $services->getUrlUtils(), $services->getSpecialPageFactory(), $services->getLinkRendererFactory(), $services->getNamespaceInfo(), LoggerFactory::getInstance( 'Parser'), $services->getBadFileLookup(), $services->getLanguageConverterFactory(), $services->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->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->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(),);}, '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'));}, 'RenameUserFactory'=> static function(MediaWikiServices $services):RenameUserFactory { return new RenameUserFactory(new ServiceOptions(RenameUserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getCentralIdLookupFactory(), $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;}, 'RestrictedUserGroupChecker'=> static function(MediaWikiServices $services):RestrictedUserGroupChecker { return new RestrictedUserGroupChecker(new ServiceOptions(RestrictedUserGroupChecker::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getUserRequirementsConditionChecker(),);}, '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());}, '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());}, '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'] ?? null;} else { $displayName=$skin;$skippable=null;$spec=['name'=> $name, 'class'=> "Skin$skin"];} $factory->register( $name, $displayName, $spec, $skippable);} $factory->register( 'fallback', 'Fallback', ['class'=> SkinFallback::class, 'args'=>[['name'=> 'fallback', 'styles'=>[ 'mediawiki.skinning.interface', 'mediawiki.codex.messagebox.styles'], 'templateDirectory'=> dirname(__DIR__) . '/resources/templates/skins/fallback',]]], true);$factory->register( 'apioutput', 'ApiOutput', ['class'=> SkinApi::class, 'args'=>[['name'=> 'apioutput', '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', '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', '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());}, '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'))) { 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->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->getActorNormalization(), $services->getConnectionProvider(), $services->getJobQueueGroup());}, 'UserFactory'=> static function(MediaWikiServices $services):UserFactory { return new UserFactory(new ServiceOptions(UserFactory::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getDBLoadBalancerFactory(), $services->getUserNameUtils(), $services->getTempUserConfig());}, 'UserGroupAssignmentService'=> static function(MediaWikiServices $services):UserGroupAssignmentService { return new UserGroupAssignmentService($services->getUserGroupManagerFactory(), $services->getUserNameUtils(), $services->getUserFactory(), $services->getRestrictedUserGroupChecker(), new HookRunner( $services->getHookContainer()), new ServiceOptions(UserGroupAssignmentService::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getTempUserConfig());}, '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->getUserRequirementsConditionCheckerFactory(), [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(UserRequirementsConditionChecker::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getGroupPermissionsLookup(), $services->getHookContainer(), LoggerFactory::getInstance( 'UserGroupManager'), $services->getUserEditTracker(), $services->getUserRegistrationLookup(), $services->getUserFactory(), RequestContext::getMain(),);}, '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->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 HookRunner( $services->getHookContainer()), new ServiceOptions(ConditionalDefaultsLookup::CONSTRUCTOR_OPTIONS, $services->getMainConfig()), $services->getUserRegistrationLookup(), $services->getUserIdentityUtils(), 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()), LoggerFactory::getProvider(), $services->getHookContainer(), $services->getReadOnlyMode(), $services->getSpamChecker(), $services->getRateLimiter(), $services->getRedirectLookup(), $services->getConnectionProvider(), $services->getCommentStore(),);}, '_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());}, '_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());}]
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...
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.
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 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 the initial content of the edit box displayed in an edit form when creating a new page or a ...
Service to check if text (either content or a summary) qualifies as spam.
Factory service for WikiExporter instances.
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
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.
Cross-Language Language name search.
Base class for language-specific code.
Definition Language.php:68
Wrapper for injecting a LocalizationContext with lazy initialization.
Create and cache Manager and Provider instances.
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.
Factory for EmailUser objects.
Send email between two wiki users.
Definition EmailUser.php:37
Send arbitrary emails.
Definition Emailer.php:26
A class containing constants representing the names of configuration variables.
Service locator for MediaWiki core services.
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.
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.
PHP Parser - Processes wiki markup (which uses a more user-friendly syntax, such as "[[link]]" for ma...
Definition Parser.php:135
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.
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,...
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.
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.
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 to check whether a user can be added or removed to/from restricted user groups.
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 for cache objects as configured in the ObjectCaches setting.
Track per-module dependency file paths that are expensive to mass compute.
Factory class for spawning EventRelayer objects using configuration.
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
LoggerInterface $logger
The logger instance.