app->singleton(HubInterface::class, function () { $dsn = getenv('GLITCHTIP_DSN'); // Pull the DSN from the environment variable if (!$dsn) { \Log::warning('SimpleSentry: GLITCHTIP_DSN environment variable is not set.'); return null; } $clientBuilder = ClientBuilder::create([ 'dsn' => $dsn, 'environment' => getenv('APP_ENV') ?: 'production', // Use APP_ENV or default to 'production' 'release' => getenv('APP_VERSION') ?: '1.0.0', // Use APP_VERSION or default to '1.0.0' ]); return $clientBuilder->getHub(); }); // Attach error handlers only if the HubInterface is properly initialized $hub = $this->app->make(HubInterface::class); if ($hub) { $this->attachErrorHandlers(); } else { \Log::warning('SimpleSentry: HubInterface is not initialized. Error reporting is disabled.'); } } private function attachErrorHandlers() { // Catch uncaught exceptions set_exception_handler(function (\Throwable $exception) { $hub = $this->app->make(HubInterface::class); if ($hub) { $eventId = $hub->captureException($exception); // Log the Sentry event ID in Concrete5 \Log::error('SimpleSentry: Sentry Event ID: ' . $eventId); } }); // Catch PHP errors set_error_handler(function ($severity, $message, $file, $line) { if (!(error_reporting() & $severity)) { // Error not included in error_reporting return false; } $hub = $this->app->make(HubInterface::class); if ($hub) { $exception = new \ErrorException($message, 0, $severity, $file, $line); $eventId = $hub->captureException($exception); // Log the Sentry event ID in Concrete5 \Log::error('SimpleSentry: Sentry Event ID: ' . $eventId); } return true; }); } }