Page MenuHomePhabricator

Autoloader regression causes errors of "undefined function" after upgrading to 1.17
Closed, InvalidPublic

Description

In my LocalSettings.php, I have the following line to modify $wgMWSuggestTemplate to increase the number of dropdown items:

$wgMWSuggestTemplate = SearchEngine::getMWSuggestTemplate() . '&limit=20';

This works perfectly in MediaWiki 1.16.4 and earlier. In 1.17.0, however, when I run maintenance/update.php, the above line causes this error to be thrown, aborting update.php:

PHP Fatal error: Call to undefined function wfScript()
in /.../includes/search/SearchEngine.php on line 457


Version: 1.17.x
Severity: normal

Details

Reference
bz29760

Event Timeline

bzimport raised the priority of this task from to Unbreak Now!.Nov 21 2014, 11:32 PM
bzimport added a project: MediaWiki-Search.
bzimport set Reference to bz29760.
bzimport added a subscriber: Unknown Object (MLST).

Line 457 in SearchEngine.php is:

return $wgServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace={namespaces}&suggest';

Looks like the same error is thrown by the web site, not only when running update.php.

Adding this line to LocalSettings.php fixes the problem, but should it be necessary?

require_once( "includes/GlobalFunctions.php" );

It's a change in the order of the AutoLoader running, with respect to the settings also.

I'm not sure if this was was "supposed" to work, or was incidental

I believe it was an accident that it worked. Moving it to $wgExtensionFunctions should do the trick.

Never try to call MediaWiki active code from LocalSettings.php main area -- *all* MW functions and classes should be assumed unsafe to use.

If you need to call into MediaWiki *after* basic platform initialization, use $wgExtensionFunctions to add a callback that runs at that time.

Brion: even static methods are considered unsafe? They are by nature designed to be called without initialization from their class.

The classes aren't in scope (ie haven't been loaded) so aren't accessible

Thanks. After trial and error, I rewrote our code to set $wgMWSuggestTemplate via the hook "SetupAfterCache". This seems to be the only hook early enough to change $wgMWSuggestTemplate in time.