Skip to content

Commit

Permalink
MDL-63131 Web services: Callback to allow web service overrides
Browse files Browse the repository at this point in the history
  • Loading branch information
sammarshallou committed Aug 20, 2018
1 parent 6e44567 commit b5311ce
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
25 changes: 21 additions & 4 deletions lib/externallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,11 +221,28 @@ public static function call_external_function($function, $args, $ajaxonly=false)
$params = call_user_func($callable,
$externalfunctioninfo->parameters_desc,
$args);
$params = array_values($params);

// Allow any Moodle plugin a chance to override this call. This is a convenient spot to
// make arbitrary behaviour customisations. The overriding plugin could call the 'real'
// function first and then modify the results, or it could do a completely separate
// thing.
$callbacks = get_plugins_with_function('override_webservice_execution');
$result = false;
foreach ($callbacks as $plugintype => $plugins) {
foreach ($plugins as $plugin => $callback) {
$result = $callback($externalfunctioninfo, $params);
if ($result !== false) {
break;
}
}
}

// Execute - gulp!
$callable = array($externalfunctioninfo->classname, $externalfunctioninfo->methodname);
$result = call_user_func_array($callable,
array_values($params));
// If the function was not overridden, call the real one.
if ($result === false) {
$callable = array($externalfunctioninfo->classname, $externalfunctioninfo->methodname);
$result = call_user_func_array($callable, $params);
}

// Validate the return parameters.
if ($externalfunctioninfo->returns_desc !== null) {
Expand Down
20 changes: 19 additions & 1 deletion webservice/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -1392,9 +1392,27 @@ protected function load_function_info() {
protected function execute() {
// validate params, this also sorts the params properly, we need the correct order in the next part
$params = call_user_func(array($this->function->classname, 'validate_parameters'), $this->function->parameters_desc, $this->parameters);
$params = array_values($params);

// Allow any Moodle plugin a chance to override this call. This is a convenient spot to
// make arbitrary behaviour customisations, for example to affect the mobile app behaviour.
// The overriding plugin could call the 'real' function first and then modify the results,
// or it could do a completely separate thing.
$callbacks = get_plugins_with_function('override_webservice_execution');
foreach ($callbacks as $plugintype => $plugins) {
foreach ($plugins as $plugin => $callback) {
$result = $callback($this->function, $params);
if ($result !== false) {
// If the callback returns anything other than false, we assume it replaces the
// real function.
$this->returns = $result;
return;
}
}
}

// execute - yay!
$this->returns = call_user_func_array(array($this->function->classname, $this->function->methodname), array_values($params));
$this->returns = call_user_func_array(array($this->function->classname, $this->function->methodname), $params);
}

/**
Expand Down

0 comments on commit b5311ce

Please sign in to comment.