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.
This is useful when an extension wants to offer optional integration with another extension.
In that situation, extension A could declare an optional service in an object specification in its extension.json that references a service defined by extension B.
If that service was not defined because extension B is not loaded, an entry in services would raise an error (NoSuchServiceException) while an entry in optional_services will evaluate to 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" ]
}
You would then first check for the service existence (has()) and then get the service:
$services = \MediaWiki\MediaWikiServices::getInstance();
new MyClass(
$services->get( 'CoreService' ),
$services->has( 'ExtensionBService' )
? $services->get( 'ExtensionBService' ) : null
);