MediaWiki REL1_31
ApiModuleManager.php
Go to the documentation of this file.
1<?php
31
35 private $mParent;
39 private $mInstances = [];
43 private $mGroups = [];
47 private $mModules = [];
48
53 public function __construct( ApiBase $parentModule ) {
54 $this->mParent = $parentModule;
55 }
56
95 public function addModules( array $modules, $group ) {
96 foreach ( $modules as $name => $moduleSpec ) {
97 if ( is_array( $moduleSpec ) ) {
98 $class = $moduleSpec['class'];
99 $factory = ( isset( $moduleSpec['factory'] ) ? $moduleSpec['factory'] : null );
100 } else {
101 $class = $moduleSpec;
102 $factory = null;
103 }
104
105 $this->addModule( $name, $group, $class, $factory );
106 }
107 }
108
121 public function addModule( $name, $group, $class, $factory = null ) {
122 if ( !is_string( $name ) ) {
123 throw new InvalidArgumentException( '$name must be a string' );
124 }
125
126 if ( !is_string( $group ) ) {
127 throw new InvalidArgumentException( '$group must be a string' );
128 }
129
130 if ( !is_string( $class ) ) {
131 throw new InvalidArgumentException( '$class must be a string' );
132 }
133
134 if ( $factory !== null && !is_callable( $factory ) ) {
135 throw new InvalidArgumentException( '$factory must be a callable (or null)' );
136 }
137
138 $this->mGroups[$group] = null;
139 $this->mModules[$name] = [ $group, $class, $factory ];
140 }
141
151 public function getModule( $moduleName, $group = null, $ignoreCache = false ) {
152 if ( !isset( $this->mModules[$moduleName] ) ) {
153 return null;
154 }
155
156 list( $moduleGroup, $moduleClass, $moduleFactory ) = $this->mModules[$moduleName];
157
158 if ( $group !== null && $moduleGroup !== $group ) {
159 return null;
160 }
161
162 if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) {
163 // already exists
164 return $this->mInstances[$moduleName];
165 } else {
166 // new instance
167 $instance = $this->instantiateModule( $moduleName, $moduleClass, $moduleFactory );
168
169 if ( !$ignoreCache ) {
170 // cache this instance in case it is needed later
171 $this->mInstances[$moduleName] = $instance;
172 }
173
174 return $instance;
175 }
176 }
177
188 private function instantiateModule( $name, $class, $factory = null ) {
189 if ( $factory !== null ) {
190 // create instance from factory
191 $instance = call_user_func( $factory, $this->mParent, $name );
192
193 if ( !$instance instanceof $class ) {
194 throw new MWException(
195 "The factory function for module $name did not return an instance of $class!"
196 );
197 }
198 } else {
199 // create instance from class name
200 $instance = new $class( $this->mParent, $name );
201 }
202
203 return $instance;
204 }
205
211 public function getNames( $group = null ) {
212 if ( $group === null ) {
213 return array_keys( $this->mModules );
214 }
215 $result = [];
216 foreach ( $this->mModules as $name => $grpCls ) {
217 if ( $grpCls[0] === $group ) {
218 $result[] = $name;
219 }
220 }
221
222 return $result;
223 }
224
230 public function getNamesWithClasses( $group = null ) {
231 $result = [];
232 foreach ( $this->mModules as $name => $grpCls ) {
233 if ( $group === null || $grpCls[0] === $group ) {
234 $result[$name] = $grpCls[1];
235 }
236 }
237
238 return $result;
239 }
240
248 public function getClassName( $module ) {
249 if ( isset( $this->mModules[$module] ) ) {
250 return $this->mModules[$module][1];
251 }
252
253 return false;
254 }
255
262 public function isDefined( $moduleName, $group = null ) {
263 if ( isset( $this->mModules[$moduleName] ) ) {
264 return $group === null || $this->mModules[$moduleName][0] === $group;
265 }
266
267 return false;
268 }
269
275 public function getModuleGroup( $moduleName ) {
276 if ( isset( $this->mModules[$moduleName] ) ) {
277 return $this->mModules[$moduleName][0];
278 }
279
280 return null;
281 }
282
287 public function getGroups() {
288 return array_keys( $this->mGroups );
289 }
290}
This abstract class implements many basic API functions, and is the base of all API classes.
Definition ApiBase.php:37
This class holds a list of modules and handles instantiation.
getModule( $moduleName, $group=null, $ignoreCache=false)
Get module instance by name, or instantiate it if it does not exist.
getGroups()
Get a list of groups this manager contains.
__construct(ApiBase $parentModule)
Construct new module manager.
getNamesWithClasses( $group=null)
Create an array of (moduleName => moduleClass) for a specific group or for all.
getClassName( $module)
Returns the class name of the given module.
getModuleGroup( $moduleName)
Returns the group name for the given module.
instantiateModule( $name, $class, $factory=null)
Instantiate the module using the given class or factory function.
addModule( $name, $group, $class, $factory=null)
Add or overwrite a module in this ApiMain instance.
addModules(array $modules, $group)
Add a list of modules to the manager.
getNames( $group=null)
Get an array of modules in a specific group or all if no group is set.
isDefined( $moduleName, $group=null)
Returns true if the specific module is defined at all or in a specific group.
The simplest way of implementing IContextSource is to hold a RequestContext as a member variable and ...
MediaWiki exception.
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
Definition deferred.txt:11
namespace being checked & $result
Definition hooks.txt:2323
Allows to change the fields on the form that will be generated $name
Definition hooks.txt:302