Příručka:RequestContext.php
| Soubor MediaWiki: RequestContext.php | |
|---|---|
| Lokalita: | includes/context/ (includes/Context/ in 1.46 or later) |
| Zdrojový kód: | master • 1.44.2 • 1.43.5 • 1.39.15 |
| Třídy: | MediaWiki\Context\RequestContext |
Třída RequestContext se používá k zapouzdření všech částí, které jsou relevantní pro kontext požadavku. Implementuje rozhraní IContextSource a MutableContext .
Rozšíření by měla volat getContext() a poté get2ドル(), spíše než se spoléhat na globální stavové proměnné.
Přístup k RequestContext
Většina míst, kde potřebujete něco udělat s daty typu RequestContext, by měla poskytovat přístup ke zdroji typu IContextData (?) a měli byste použít ten, ne hlavní instanci typu RequestContext nebo globální proměnné typu $wg.
K hlavnímu kontextu požadavku můžete přistupovat také pomocí RequestContext::getMain();, ale toto by mělo být až poslední možnost.
Při psaní speciální stránky
Při psaní SpecialPage máte přístup ke kontextu prostřednictvím $this->getContext();.
SpecialPage also implements a number of helper methods that are the equivalent of methods provided by RequestContext, for which see below.
SpecialPages mají být spustitelné v alternativních kontextech, rozšíření by se měla začít vzdalovat od používání $wg.
Kolem verze MW 1.20 můžeme" ukončit podporu pro zahrnutí speciálních stránek pomocí proměnných souvisejících s $wg RequestContext.
Při psaní kódu vzhledu
Přístup ke kontextu máte přes $this->getContext();.
Vzhled podobně poskytuje několik pomocných metod, které viz níže.
Při použití háčků
- Pokud váš háček poskytuje jako argument hodnotu OutputPage , využijte kontext, který poskytuje.
- Pokud je váš háček spuštěn v kontextu výstupu stránky
Skin::outputPage( $out );a je mu poskytnuta instance Skin, použijte kontext, který poskytuje. - Pokud váš háček poskytuje instanci Title , použijte ji jako preferenci před jiným kontextem.
- Totéž platí pro jakékoli instance typu WebRequest poskytnuté jako argumenty pro háčky.
- Ujistěte se, že používáte správný háček. Pokud není poskytnut správný kontext, můžete ho používat k nesprávnému účelu a narazit na nesouvisející chyby.
- Některé háčky však mohou být zastaralé a je třeba jim v argumentech poskytnout správný kontext.
Při psaní parserových funkcí a háčků
- Funkce a háčky parseru by neměly přistupovat k datům kontextu požadavku. K dalším kontextovým informacím lze přistupovat z objektu lokálního parseru.
Například:$parser->getOutput()->addModules( 'ext.my.module' ); - Pro cokoli, co potřebujete, jako například uživatelský jazyk, použijte ParserOptions.
- Použijte třídu Linker:: staticky namísto přístupu k třídě Skin.
- Pokud potřebujete do výstupu stránky přidat něco mimo oblast obsahu, ParserOutput by měl mít metody, které vám umožní dělat to, co chcete.
- Pokud metody v ParserOutput nejsou dostatečně flexibilní pro to, co potřebujete udělat, je možné zaregistrovat zpětné volání s ParserOutput, které bude voláno později na místě, kde můžete volně využít
RequestContext.
- Pokud metody v ParserOutput nejsou dostatečně flexibilní pro to, co potřebujete udělat, je možné zaregistrovat zpětné volání s ParserOutput, které bude voláno později na místě, kde můžete volně využít
Vytvoření nového RequestContext
Stále existuje kód používající globální proměnné $wgOut , $wgTitle , $wgUser .
Dokud tyto nebudou odstraněny, nemůžeme očekávat, že vlastní kontexty budou fungovat perfektně a budeme muset zachovat stejná řešení. Pokud však opravíme kód tak, aby tyto globální proměnné přestal používat, mělo by být možné něco jako toto:
$context = new RequestContext(); $context->setRequest( new FauxRequest( [...] ) ); $context->setTitle( Title::newFromText( [...] ) ); $context->setUser( User::newFromName( 'Dantman' ) ); $context->setSkin( new OfflineDummySkin() ); // [...] $html = $context->getOutput()->capture();
Veřejné metody
Přístupové objekty
Proměnná RequestContext nebo IContextSource poskytuje následující metody přístupu:
$context->getRequest()– instance WebRequest , ze které se mají načíst proměnné požadavku.$context->getTitle()– instance třídy Title pro vypisovanou stránku.$context->getOutput()– instance OutputPage vázaná na RequestContext pro odesílání výstupu stránky.$context->getSkin()– instance třídy Skin používaná k vykreslení stránky.$context->getUser()– instance třídy User pro uživatele, pro kterého je stránka vykreslena.$context->getLanguage()– (přidáno ve verzi 1.19 jako náhrada nyní zastaralého$context->getLang()) instance Language uživatelského jazyka, ve kterém je stránka vykreslena.$context->getWikiPage()(zavedeno od 1.19) – instance WikiPage , která je vypsána (viz níže).$context->canUseWikiPage()(zavedeno od 1.19) – zkontroluje, zda lze volatgetWikiPage(), nebo vyvolá výjimku.$context->msg()– vrací objekt Message s kontextem nastaveným na volaný kontext. Má stejné parametry jako wfMessage() .$context->getConfig()(zavedeno od 1.23) – hlavní objekt Config
Výstup a jazyk jsou pouze pro čtení, zbytek RequestContext lze nastavit pomocí metod, jako je například $context->setTitle( Title::newMainPage() )).
Při psaní SpecialPage
SpecialPage také implementuje řadu pomocných prvků:
$this->getRequest()$this->getOutput()$this->getUser()$this->getAuthority()$this->getSkin()$this->getLanguage()$this->getConfig()$this->getFullTitle()– pro název speciální stránky můžete použít hodnotu$this->getPageTitle();a pro název speciální stránky$this->getFullTitle();a libovolná data $par.
Při psaní kódu vzhledu
Stejně jako SpecialPage, i Skin implementuje řadu pomocných funkcí:
$this->getUser()$this->getTitle()
Kontext vzhledu je zadán příkazem Skin::outputPage( $out );, který je volán příkazem OutputPage::output();. Externímu přístupu ke kontextově citlivým voláním metod je třeba se vyhnout.
Alternativní třídy ke zvážení
Základem rozhraní RequestContext je rozhraní IContextSource.
Definuje API něčeho, ze kterého můžete získat části kontextu požadavku.
Pokud píšete API, které používá v argumentech nápovědy k typům nebo provádí kontroly instanceof, měli byste použít IContextSource, ne RequestContext.
ContextSource je abstraktní pomocná třída, která stejně jako RequestContext implementuje IContextSource.
Tím, že vaši novou třídu rozšíří na ContextSource, bude mít vaše třída k dispozici různé pomocné metody (getOutput(), getSkin(), getLanguage() atd.) a bude implementovat IContextSource.
Stejně jako ContextSource lze i DerivativeContext použít k dědění kontextu z jiného zdroje, ale také umožňuje lokální změnu jednotlivých částí kontextu, například instance Title.