ObjectFactory/nl
ObjectFactory maakt objecten aan uit specificatie (via $objectFactory->createObject() of ObjectFactory::getObjectFromSpec()).
Dit formaat wordt gebruikt door bepaalde configuratie-instellingen (zoals $wgMWLoggerDefaultSpi en $wgSessionProviders) en ook door extension.json.
Een specificatie ziet er ongeveer zo uit:
$spec = [
'class' => 'Message',
'args' => [ 'unexpected', [ 'foo', 123 ] ],
];
wat de specificatie is voor new Message( 'unexpected', [ 'foo', 123 ] ).
Andere opties bevatten:
$spec = [
'factory' => 'Message::newFallbackSequence',
'args' => [ 'unexpected', 'unexpected2' ],
];
// Message::newFallbackSequence( 'unexpected', 'unexpected2' )
$spec = [
'class' => 'Message',
'args' => [ 'foo', 'bar' ],
'calls' => [ 'inLanguage' => [ 'en' ], 'useDatabase' => [ false ] ],
];
// roept $message->inLanguage( 'en' ), $message->useDatabase( false ) aan, na het aanmaken van $message
| MediaWiki-versie: | ≥ 1.34 |
Vanaf MediaWiki 1.34 ondersteunt ObjectFactory nu ook het aanmaken van classes met services die in de specificatie gespecificeerd zijn.
Om ObjectFactory te gebruiken om classes aan te maken die services nodig hebben, dient u de ObjectFactory service te gebruiken en dan de methode createObject aan te roepen.
Voor gebruik buiten MediaWiki kan er een instantie van ObjectFactory worden aangemaakt met een PSR-11 Container interface die gebruikt zal worden om de services op te halen.
$spec = [
'class' => 'MyClass',
'args' => [ 'foo', 'bar' ],
'services' => [ 'Service1', 'Service2' ],
];
// $services = \MediaWiki\MediaWikiServices::getInstance();
// new MyClass( $services->get( 'Service1' ), $services->get( 'Service2' ), 'foo', 'bar' )
Optionele service afhankelijkheden
| MediaWiki-versie: | ≥ 1.36 |
Vanaf MediaWiki 1.36, kunnen serviceafhankelijkheden optioneel worden gemaakt met de key optional_services.
Dit is handig wanneer een extensie optionele integratie met een andere extensie wil aanbieden.
In die situatie kan extensie A een optionele service in een object specificatie in zijn extension.json verklaren die verwijst naar een door extensie B gedefinieerde service.
Als die service niet werd gedefinieerd omdat extensie B niet geladen is, zou een invoer in services een fout (NoSuchServiceException) veroorzaken, terwijl een invoer in optional_services wordt geëvalueerd naar 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" ]
}
U zou dan eerst controleren of de service bestaat (has()) en dan de service aanroepen:
$services = \MediaWiki\MediaWikiServices::getInstance();
new MyClass(
$services->get( 'CoreService' ),
$services->has( 'ExtensionBService' )
? $services->get( 'ExtensionBService' ) : null
);