ObjectFactory
ObjectFactory vytváří objekty ze specifikací (prostřednictvím $objectFactory->createObject() nebo ObjectFactory::getObjectFromSpec()).
Tento formát používají určitá konfigurační nastavení (například $wgMWLoggerDefaultSpi nebo $wgSessionProviders) a také extension.json.
Typická specifikace vypadá takto:
$spec = [
'class' => 'Message',
'args' => [ 'unexpected', [ 'foo', 123 ] ],
];
což je specifikace pro new Message( 'unexpected', [ 'foo', 123 ] ).
Mezi další možnosti patří:
$spec = [
'factory' => 'Message::newFallbackSequence',
'args' => [ 'unexpected', 'unexpected2' ],
];
// Message::newFallbackSequence( 'unexpected', 'unexpected2' )
$spec = [
'class' => 'Message',
'args' => [ 'foo', 'bar' ],
'calls' => [ 'inLanguage' => [ 'en' ], 'useDatabase' => [ false ] ],
];
// zavolá $message->inLanguage( 'en' ), $message->useDatabase( false ) po vytvoření $message
| Verze MediaWiki: | ≥ 1.34 |
Počínaje verzí MediaWiki 1.34 nyní ObjectFactory podporuje vytváření tříd se službami specifikovanými ve specifikaci.
Chcete-li použít ObjectFactory k vytvoření tříd, které potřebují služby, budete muset použít službu ObjectFactory a zavolat metodu createObject.
Pro použití mimo MediaWiki lze vytvořit instanci ObjectFactory s rozhraním PSR-11 Container interface, které bude použito k načtení služeb.
$spec = [
'class' => 'MyClass',
'args' => [ 'foo', 'bar' ],
'services' => [ 'Service1', 'Service2' ],
];
// $services = \MediaWiki\MediaWikiServices::getInstance();
// new MyClass( $services->get( 'Service1' ), $services->get( 'Service2' ), 'foo', 'bar' )
Volitelné závislosti služeb
| Verze MediaWiki: | ≥ 1.36 |
Počínaje hodnotou MediaWiki 1.36 lze závislosti služeb nastavit jako volitelné pomocí klíče optional_services.
To je užitečné, když chce rozšíření nabídnout volitelnou integraci s jiným rozšířením.
V takové situaci by rozšíření A mohlo deklarovat volitelnou službu ve specifikaci objektu ve svém extension.json, která odkazuje na službu definovanou rozšířením B.
Pokud by tato služba nebyla definována, protože rozšíření B není načteno, záznam v services by vyvolal chybu (NoSuchServiceException), zatímco záznam v optional_services by se vyhodnotil jako null.
In extension A, define the service in extension.json with the service from B under optional_services:
{
"class": "ExtensionA\\MyClass",
"services": [ "CoreService" ],
"optional_services": [ "ExtensionBService" ]
}
Pak byste nejprve zkontrolovali existenci služby (has()) a poté službu získali:
$services = \MediaWiki\MediaWikiServices::getInstance();
new MyClass(
$services->get( 'CoreService' ),
$services->has( 'ExtensionBService' )
? $services->get( 'ExtensionBService' ) : null
);