memran / marwa-error-handler
PHP Errorhandler with optional PSR-3 logger, optional Debugbar, and a professional fallback UI.
v1.0.0
2025-08-21 13:51 UTC
Requires
- php: >=8.1
- psr/log: ^3.0
Requires (Dev)
- phpunit/phpunit: ^10.0
README
A tiny, framework-agnostic PHP Error Handler with:
- Optional PSR-3 Logger injection (logs if provided; no-op if not)
- Optional Debugbar injection (adds exception to bar in dev)
- Professional fallback UI when neither logger nor debugbar exists
- Clean dev vs prod behavior
Install
composer require memran/marwa-error-handler
Example
use Marwa\ErrorHandler\ErrorHandler; use Marwa\ErrorHandler\Support\FallbackRenderer; // (optional) Inject a PSR-3 logger and/or a Debugbar: $logger = null; // e.g., Monolog or your own PSR-3 logger $debugbar = null; // object with addThrowable/addException/addMessage OR a callable(Throwable): void ErrorHandler::bootstrap( appName: 'MyApp', env: 'production', // 'development' or 'production' logger: $logger, debugbar: $debugbar, renderer: new FallbackRenderer() // optional; default will be created );
Behavior
-
Development
- If a Debugbar is present: exception is added to the bar and rethrown so your dev page (Whoops/Symfony) renders.
- If no logger & no debugbar: a polished dev exception page is rendered with trimmed trace.
- If a logger is present: php_error, uncaught_exception, and fatal_shutdown entries are written.
-
Production
- If a logger is present: errors/exceptions/fatals are logged; the response returns HTTP 500 without details.
- If no logger & no debugbar: a clean generic error page is rendered with only Request ID & timestamp.
Optional DI
$handler = new ErrorHandler(appName: 'MyApp', env: 'development'); $handler->setLogger($logger); // PSR-3 $handler->setDebugbar($debugbar); // object or callable $handler->setRenderer(new FallbackRenderer()); $handler->register();
Testing
composer install
composer test