From 0ec69aed3beab80451c97ecae506bddeb3ac3ddb Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Mon, 6 Apr 2009 12:41:20 +0000 Subject: [PATCH] * (bug 18009) $wgHooks and $wgExtensionFunctions now support closures * Whitespaces fixes in includes/Hooks.php --- RELEASE-NOTES | 1 + includes/Hooks.php | 63 +++++++++++++++++++++++++++++----------------- includes/Setup.php | 7 +++++- 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index c132de23dc..1fabf9b790 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -326,6 +326,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN * (bug 18331) MediaWiki:Undelete-revision can now have wikitext * The "noautoblock" flag is no longer displayed in the block log when blocking an IP address +* (bug 18009) $wgHooks and $wgExtensionFunctions now support closures == API changes in 1.15 == * (bug 16858) Revamped list=deletedrevs to make listing deleted contributions diff --git a/includes/Hooks.php b/includes/Hooks.php index 046a149da8..a05f732b40 100644 --- a/includes/Hooks.php +++ b/includes/Hooks.php @@ -53,54 +53,69 @@ function wfRunHooks($event, $args = array()) { $func = NULL; $data = NULL; $have_data = false; + $closure = false; /* $hook can be: a function, an object, an array of $function and $data, * an array of just a function, an array of object and method, or an * array of object, method, and data. */ - if (is_array($hook)) { - if (count($hook) < 1) { + if ( is_array( $hook ) ) { + if ( count( $hook ) < 1 ) { throw new MWException("Empty array in hooks for " . $event . "\n"); - } else if (is_object($hook[0])) { + } else if ( is_object( $hook[0] ) ) { $object = $wgHooks[$event][$index][0]; - if (count($hook) < 2) { - $method = "on" . $event; - } else { - $method = $hook[1]; - if (count($hook) > 2) { - $data = $hook[2]; + if ( $object instanceof Closure ) { + $closure = true; + if ( count( $hook ) > 1 ) { + $data = $hook[1]; $have_data = true; } + } else { + if ( count( $hook ) < 2 ) { + $method = "on" . $event; + } else { + $method = $hook[1]; + if ( count( $hook ) > 2 ) { + $data = $hook[2]; + $have_data = true; + } + } } - } else if (is_string($hook[0])) { + } else if ( is_string( $hook[0] ) ) { $func = $hook[0]; - if (count($hook) > 1) { + if ( count( $hook ) > 1) { $data = $hook[1]; $have_data = true; } } else { - var_dump( $wgHooks ); - throw new MWException("Unknown datatype in hooks for " . $event . "\n"); + throw new MWException( "Unknown datatype in hooks for " . $event . "\n" ); } - } else if (is_string($hook)) { # functions look like strings, too + } else if ( is_string( $hook ) ) { # functions look like strings, too $func = $hook; - } else if (is_object($hook)) { + } else if ( is_object( $hook ) ) { $object = $wgHooks[$event][$index]; - $method = "on" . $event; + if ( $object instanceof Closure ) { + $closure = true; + } else { + $method = "on" . $event; + } } else { - throw new MWException("Unknown datatype in hooks for " . $event . "\n"); + throw new MWException( "Unknown datatype in hooks for " . $event . "\n" ); } /* We put the first data element on, if needed. */ - if ($have_data) { + if ( $have_data ) { $hook_args = array_merge(array($data), $args); } else { $hook_args = $args; } - if ( isset( $object ) ) { + if ( $closure ) { + $callback = $object; + $func = "hook-$event-closure"; + } elseif ( isset( $object ) ) { $func = get_class( $object ) . '::' . $method; $callback = array( $object, $method ); } elseif ( false !== ( $pos = strpos( $func, '::' ) ) ) { @@ -119,12 +134,14 @@ function wfRunHooks($event, $args = array()) { /* String return is an error; false return means stop processing. */ - if (is_string($retval)) { + if ( is_string( $retval ) ) { global $wgOut; - $wgOut->showFatalError($retval); + $wgOut->showFatalError( $retval ); return false; } elseif( $retval === null ) { - if( is_array( $callback ) ) { + if ( $closure ) { + $prettyFunc = "$event closure"; + } elseif( is_array( $callback ) ) { if( is_object( $callback[0] ) ) { $prettyClass = get_class( $callback[0] ); } else { @@ -137,7 +154,7 @@ function wfRunHooks($event, $args = array()) { throw new MWException( "Detected bug in an extension! " . "Hook $prettyFunc failed to return a value; " . "should return true to continue hook processing or false to abort." ); - } else if (!$retval) { + } else if ( !$retval ) { return false; } } diff --git a/includes/Setup.php b/includes/Setup.php index d450dfdb58..98b12c955f 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -305,7 +305,12 @@ wfProfileIn( $fname.'-extensions' ); # of the extension file. This allows the extension to perform # any necessary initialisation in the fully initialised environment foreach ( $wgExtensionFunctions as $func ) { - $profName = $fname.'-extensions-'.strval( $func ); + # Allow closures in PHP 5.3+ + if ( is_object( $func ) && $func instanceof Closure ) + $profName = $fname.'-extensions-closure'; + else + $profName = $fname.'-extensions-'.strval( $func ); + wfProfileIn( $profName ); call_user_func( $func ); wfProfileOut( $profName ); -- 2.20.1