ObjectFactory
ObjectFactory crée des objets à partir de spécifications (via $objectFactory->createObject() ou ObjectFactory::getObjectFromSpec()).
Ce format est utilisé par certains paramètres de configuration (tels que $wgMWLoggerDefaultSpi ou $wgSessionProviders).
Une spécification typique ressemble à ceci :
$spec = [
'class' => 'Message',
'args' => [ 'unexpected', [ 'foo', 123 ] ],
];
qui est la spécification de new Message( 'unexpected', [ 'foo', 123 ] ).
Les autres options comprennent :
$spec = [
'factory' => 'Message::newFallbackSequence',
'args' => [ 'unexpected', 'unexpected2' ],
];
// Message::newFallbackSequence( 'unexpected', 'unexpected2' )
$spec = [
'class' => 'Message',
'args' => [ 'foo', 'bar' ],
'calls' => [ 'inLanguage' => [ 'en' ], 'useDatabase' => [ false ] ],
];
// va appeler $message->inLanguage( 'en' ), $message->useDatabase( false ) après avoir créé $message
Avec Dependency Injection
| Version de MediaWiki : | ≥ 1.34 |
A partir de MediaWiki 1.34, ObjectFactory prend en charge la création des classes avec les services référencés dans les spécifications.
Pour utiliser ObjectFactory afin de créer les classes qui ont besoin de services, vous devez utiliser le service ObjectFactory et appeler la méthode createObject.
Pour les besoins non MediaWiki, une instance ObjectFactory peut être créée avec une interface conteneur PSR-11 qui sera utilisée pour récupérer les services.
$spec = [
'class' => 'MyClass',
'args' => [ 'foo', 'bar' ],
'services' => [ 'Service1', 'Service2' ],
];
// $services = \MediaWiki\MediaWikiServices::getInstance();
// new MyClass( $services->get( 'Service1' ), $services->get( 'Service2' ), 'foo', 'bar' )
Optional service dependencies
| Version de MediaWiki : | ≥ 1.36 |
Starting with MediaWiki 1.36, service dependencies can be made optional by using the optional_services key.
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
);