MediaWiki REL1_30
ApiModuleManager.php
Go to the documentation of this file.
1<?php
35
39 private $mParent;
43 private $mInstances = [];
47 private $mGroups = [];
51 private $mModules = [];
52
57 public function __construct( ApiBase $parentModule ) {
58 $this->mParent = $parentModule;
59 }
60
99 public function addModules( array $modules, $group ) {
100 foreach ( $modules as $name => $moduleSpec ) {
101 if ( is_array( $moduleSpec ) ) {
102 $class = $moduleSpec['class'];
103 $factory = ( isset( $moduleSpec['factory'] ) ? $moduleSpec['factory'] : null );
104 } else {
105 $class = $moduleSpec;
106 $factory = null;
107 }
108
109 $this->addModule( $name, $group, $class, $factory );
110 }
111 }
112
125 public function addModule( $name, $group, $class, $factory = null ) {
126 if ( !is_string( $name ) ) {
127 throw new InvalidArgumentException( '$name must be a string' );
128 }
129
130 if ( !is_string( $group ) ) {
131 throw new InvalidArgumentException( '$group must be a string' );
132 }
133
134 if ( !is_string( $class ) ) {
135 throw new InvalidArgumentException( '$class must be a string' );
136 }
137
138 if ( $factory !== null && !is_callable( $factory ) ) {
139 throw new InvalidArgumentException( '$factory must be a callable (or null)' );
140 }
141
142 $this->mGroups[$group] = null;
143 $this->mModules[$name] = [ $group, $class, $factory ];
144 }
145
155 public function getModule( $moduleName, $group = null, $ignoreCache = false ) {
156 if ( !isset( $this->mModules[$moduleName] ) ) {
157 return null;
158 }
159
160 list( $moduleGroup, $moduleClass, $moduleFactory ) = $this->mModules[$moduleName];
161
162 if ( $group !== null && $moduleGroup !== $group ) {
163 return null;
164 }
165
166 if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) {
167 // already exists
168 return $this->mInstances[$moduleName];
169 } else {
170 // new instance
171 $instance = $this->instantiateModule( $moduleName, $moduleClass, $moduleFactory );
172
173 if ( !$ignoreCache ) {
174 // cache this instance in case it is needed later
175 $this->mInstances[$moduleName] = $instance;
176 }
177
178 return $instance;
179 }
180 }
181
192 private function instantiateModule( $name, $class, $factory = null ) {
193 if ( $factory !== null ) {
194 // create instance from factory
195 $instance = call_user_func( $factory, $this->mParent, $name );
196
197 if ( !$instance instanceof $class ) {
198 throw new MWException(
199 "The factory function for module $name did not return an instance of $class!"
200 );
201 }
202 } else {
203 // create instance from class name
204 $instance = new $class( $this->mParent, $name );
205 }
206
207 return $instance;
208 }
209
215 public function getNames( $group = null ) {
216 if ( $group === null ) {
217 return array_keys( $this->mModules );
218 }
219 $result = [];
220 foreach ( $this->mModules as $name => $grpCls ) {
221 if ( $grpCls[0] === $group ) {
222 $result[] = $name;
223 }
224 }
225
226 return $result;
227 }
228
234 public function getNamesWithClasses( $group = null ) {
235 $result = [];
236 foreach ( $this->mModules as $name => $grpCls ) {
237 if ( $group === null || $grpCls[0] === $group ) {
238 $result[$name] = $grpCls[1];
239 }
240 }
241
242 return $result;
243 }
244
252 public function getClassName( $module ) {
253 if ( isset( $this->mModules[$module] ) ) {
254 return $this->mModules[$module][1];
255 }
256
257 return false;
258 }
259
266 public function isDefined( $moduleName, $group = null ) {
267 if ( isset( $this->mModules[$moduleName] ) ) {
268 return $group === null || $this->mModules[$moduleName][0] === $group;
269 }
270
271 return false;
272 }
273
279 public function getModuleGroup( $moduleName ) {
280 if ( isset( $this->mModules[$moduleName] ) ) {
281 return $this->mModules[$moduleName][0];
282 }
283
284 return null;
285 }
286
291 public function getGroups() {
292 return array_keys( $this->mGroups );
293 }
294}
This abstract class implements many basic API functions, and is the base of all API classes.
Definition ApiBase.php:41
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:2293
Allows to change the fields on the form that will be generated $name
Definition hooks.txt:302