48 $this->source = get_class( $module );
56 $continue = $request->getVal(
'continue',
'' );
57 if ( $continue !==
'' ) {
58 $continue = explode(
'||', $continue );
59 if ( count( $continue ) !== 2 ) {
62 $this->generatorDone = ( $continue[0] ===
'-' );
63 $skip = explode(
'|', $continue[1] );
64 if ( !$this->generatorDone ) {
65 $params = explode(
'|', $continue[0] );
67 $this->generatorParams = array_intersect_key(
68 $request->getValues(),
81 if ( in_array( $name, $skip,
true ) ) {
82 $this->allModules[$name] =
false;
86 $this->allModules[$name] = $module;
112 return array_values( array_filter( $this->allModules ) );
124 if ( !isset( $this->allModules[$name] ) ) {
125 throw new UnexpectedValueException(
126 "Module '$name' called " . __METHOD__ .
127 ' but was not passed to ' . __CLASS__ .
'::__construct'
130 if ( !$this->allModules[$name] ) {
131 throw new UnexpectedValueException(
132 "Module '$name' was not supposed to have been executed, but " .
133 'it was executed anyway'
137 if ( is_array( $paramValue ) ) {
138 $paramValue = implode(
'|', $paramValue );
140 $this->continuationData[$name][$paramName] = $paramValue;
157 if ( is_array( $paramValue ) ) {
158 $paramValue = implode(
'|', $paramValue );
160 $this->generatorNonContinuationData[$name][$paramName] = $paramValue;
172 if ( is_array( $paramValue ) ) {
173 $paramValue = implode(
'|', $paramValue );
175 $this->generatorContinuationData[$name][$paramName] = $paramValue;
183 return array_merge_recursive( $this->continuationData, $this->generatorContinuationData );
201 $batchcomplete =
false;
203 $finishedModules = array_diff(
204 array_keys( $this->allModules ),
205 array_keys( $this->continuationData )
209 $continuationData = array_diff_key( $this->continuationData, $this->generatedModules );
215 $continuationData = array_intersect_key( $this->continuationData, $this->generatedModules );
225 foreach ( $this->generatorNonContinuationData as $kvp ) {
231 } elseif ( $this->generatorContinuationData ) {
236 foreach ( $this->generatorContinuationData as $kvp ) {
240 $finishedModules = array_diff( $finishedModules, $this->generatedModules );
242 $batchcomplete =
true;
245 $generatorKeys =
'-';
246 $batchcomplete =
true;
251 if ( $data || $generatorKeys !==
'-' ) {
252 $data[
'continue'] = $generatorKeys .
'||' . implode(
'|', $finishedModules );
255 return [ $data, $batchcomplete ];
265 $result->
addValue(
null,
'continue', $data,
268 if ( $batchcomplete ) {
269 $result->
addValue(
null,
'batchcomplete',
true,
This abstract class implements many basic API functions, and is the base of all API classes.
encodeParamName( $paramName)
This method mangles parameter name based on the prefix supplied to the constructor.
getMain()
Get the main module.
extractRequestParams( $options=[])
Using getAllowedParams(), this function makes an array of the values provided by the user,...
getModuleName()
Get the name of the module being executed by this instance.
This manages continuation state.
addGeneratorNonContinueParam(ApiBase $module, $paramName, $paramValue)
Set the non-continuation parameter for the generator module.
isGeneratorDone()
Is the generator done?
addGeneratorContinueParam(ApiBase $module, $paramName, $paramValue)
Set the continuation parameter for the generator module.
$generatorContinuationData
setContinuationIntoResult(ApiResult $result)
Store the continuation data into the result.
getRunModules()
Get the list of modules that should actually be run.
addContinueParam(ApiBase $module, $paramName, $paramValue)
Set the continuation parameter for a module.
getSource()
Get the class that created this manager.
getRawNonContinuation()
Fetch raw non-continuation data.
__construct(ApiBase $module, array $allModules=[], array $generatedModules=[])
$generatorNonContinuationData
getContinuation()
Fetch continuation result data.
getRawContinuation()
Fetch raw continuation data.
This class represents the result of the API operations.
addValue( $path, $name, $value, $flags=0)
Add value to the output data at the given path.
const NO_SIZE_CHECK
For addValue() and similar functions, do not check size while adding a value Don't use this unless yo...
const ADD_ON_TOP
For addValue(), setValue() and similar functions, if the value does not exist, add it as the first el...
static newWithMessage(ApiBase $module=null, $msg, $code=null, $data=null, $httpCode=0)