eca-1.0.x-dev/src/ErrorHandlerTrait.php
src/ErrorHandlerTrait.php
<?php namespace Drupal\eca; /** * Provides helper functions to enable and reset extended error handling. */ trait ErrorHandlerTrait { /** * The error level before enabling extended mode. * * @var int */ protected int $originalErrorHandling = 0; /** * Determines if the shutdown function is enabled or disabled. * * @var bool */ protected bool $shutdownFunctionEnabled = FALSE; /** * Helper function to enable extended error handling. */ protected function enableExtendedErrorHandling(string $context): void { $buildMessage = static function (string $message, string $file, int $line) use ($context): string { return 'ECA ran into error from third party in the context of "' . $context . '": ' . PHP_EOL . $message . PHP_EOL . 'Line ' . $line . ' of ' . $file; }; // Set the error handler. set_error_handler(function (int $level, string $message, string $file, int $line) use ($buildMessage): bool { if ($level === E_USER_DEPRECATED || $level === E_DEPRECATED) { return FALSE; } $this->logger->error($buildMessage($message, $file, $line)); return FALSE; }); // Handle fatal errors. $this->shutdownFunctionEnabled = TRUE; $shutdownFunctionEnabled = &$this->shutdownFunctionEnabled; register_shutdown_function(function () use ($buildMessage, &$shutdownFunctionEnabled) { // @phpstan-ignore-next-line if (!$shutdownFunctionEnabled) { return; } $error = error_get_last(); if ($error === NULL) { return; } echo $buildMessage($error['message'], $error['file'], $error['line']); }); // Turn off reporting. $this->originalErrorHandling = error_reporting(0); } /** * Helper function to reset extended error handling. */ protected function resetExtendedErrorHandling(): void { $this->shutdownFunctionEnabled = FALSE; error_reporting($this->originalErrorHandling); restore_error_handler(); } }