Jump to content

ObjectFactory

From mediawiki.org
This page is a translated version of the page ObjectFactory and the translation is 100% complete.

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
);

Externí odkazy