X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2Fapi%2FApiQueryQueryPage.php;h=ea2066490e76d274db6ceff06fee62e40663b342;hb=701b642fdc55de095e050cc56d65c61225473a06;hp=8758d9c232ad9cc1550904c7f8a504400cce7441;hpb=1360a2884ac2ce44b1a81df9fef96b72853c845e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php index 8758d9c232..ea2066490e 100644 --- a/includes/api/ApiQueryQueryPage.php +++ b/includes/api/ApiQueryQueryPage.php @@ -20,24 +20,33 @@ * @file */ +use MediaWiki\MediaWikiServices; +use MediaWiki\Special\SpecialPageFactory; + /** * Query module to get the results of a QueryPage-based special page * * @ingroup API */ class ApiQueryQueryPage extends ApiQueryGeneratorBase { - private $qpMap; + + /** + * @var string[] list of special page names + */ + private $queryPages; + + /** + * @var SpecialPageFactory + */ + private $specialPageFactory; public function __construct( ApiQuery $query, $moduleName ) { parent::__construct( $query, $moduleName, 'qp' ); - // Build mapping from special page names to QueryPage classes - $uselessQueryPages = $this->getConfig()->get( 'APIUselessQueryPages' ); - $this->qpMap = []; - foreach ( QueryPage::getPages() as $page ) { - if ( !in_array( $page[1], $uselessQueryPages ) ) { - $this->qpMap[$page[1]] = $page[0]; - } - } + $this->queryPages = array_values( array_diff( + array_column( QueryPage::getPages(), 1 ), // [ class, name ] + $this->getConfig()->get( 'APIUselessQueryPages' ) + ) ); + $this->specialPageFactory = MediaWikiServices::getInstance()->getSpecialPageFactory(); } public function execute() { @@ -48,6 +57,27 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { $this->run( $resultPageSet ); } + /** + * @param string $name + * @return QueryPage + */ + private function getSpecialPage( $name ) { + $qp = $this->specialPageFactory->getPage( $name ); + if ( !$qp ) { + self::dieDebug( + __METHOD__, + 'SpecialPageFactory failed to create special page ' . $name + ); + } + if ( !( $qp instanceof QueryPage ) ) { + self::dieDebug( + __METHOD__, + 'Special page ' . $name . ' is not a QueryPage' + ); + } + return $qp; + } + /** * @param ApiPageSet|null $resultPageSet */ @@ -55,8 +85,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { $params = $this->extractRequestParams(); $result = $this->getResult(); - /** @var QueryPage $qp */ - $qp = new $this->qpMap[$params['page']](); + $qp = $this->getSpecialPage( $params['page'] ); if ( !$qp->userCanExecute( $this->getUser() ) ) { $this->dieWithError( 'apierror-specialpage-cantexecute' ); } @@ -125,8 +154,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { } public function getCacheMode( $params ) { - /** @var QueryPage $qp */ - $qp = new $this->qpMap[$params['page']](); + $qp = $this->getSpecialPage( $params['page'] ); if ( $qp->getRestriction() != '' ) { return 'private'; } @@ -137,7 +165,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { public function getAllowedParams() { return [ 'page' => [ - ApiBase::PARAM_TYPE => array_keys( $this->qpMap ), + ApiBase::PARAM_TYPE => $this->queryPages, ApiBase::PARAM_REQUIRED => true ], 'offset' => [