diff --git a/Civi/Core/CiviEventDispatcher.php b/Civi/Core/CiviEventDispatcher.php index f2ddb6431ef6..d4564e5b4c25 100644 --- a/Civi/Core/CiviEventDispatcher.php +++ b/Civi/Core/CiviEventDispatcher.php @@ -187,7 +187,18 @@ public function dispatch($eventName, Event $event = NULL) { throw new \RuntimeException("The dispatch policy prohibits event \"$eventName\"."); case 'not-ready': - throw new \RuntimeException("CiviCRM has not bootstrapped sufficiently to fire event \"$eventName\"."); + // The system is not ready to run hooks -- eg it has not finished loading the extension main-files. + // If you fire a hook at this point, it will not be received by the intended listeners. + // In practice, many hooks involve cached data-structures, so a premature hook is liable to have spooky side-effects. + // This condition indicates a structural problem and merits a consistent failure-mode. + // If you believe some special case merits an exemption, then you could add it to `$bootDispatchPolicy`. + + // An `Exception` would be ideal for preventing new bugs, but it can be too noisy for systems with pre-existing bugs. + // throw new \RuntimeException("The event \"$eventName\" attempted to fire before CiviCRM was fully loaded. Skipping."); + // Complain to web-user and sysadmin. Log a backtrace. We're pre-boot, so don't use high-level services. + error_log("The event \"$eventName\" attempted to fire before CiviCRM was fully loaded. Skipping.\n" . \CRM_Core_Error::formatBacktrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), FALSE)); + trigger_error("The event \"$eventName\" attempted to fire before CiviCRM was fully loaded. Skipping.", E_USER_WARNING); + return $event; default: throw new \RuntimeException("The dispatch policy for \"$eventName\" is unrecognized ($mode).");