README.md
# BitFrame\Whoops
[![CI](https://github.com/designcise/bitframe-whoops/actions/workflows/ci.yml/badge.svg)](https://github.com/designcise/bitframe-whoops/actions/workflows/ci.yml)
[![Maintainability](https://api.codeclimate.com/v1/badges/1a7ef1d3db6876f86eb5/maintainability)](https://codeclimate.com/github/designcise/bitframe-whoops/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/1a7ef1d3db6876f86eb5/test_coverage)](https://codeclimate.com/github/designcise/bitframe-whoops/test_coverage)
Whoops error handler middleware to handle application or middleware specific errors.
## Installation
```
$ composer require "designcise/bitframe-whoops"
```
Please note that this package requires PHP 8.2.0 or newer.
## Quickstart
### Instantiating
The constructor has the following signature:
```php
new ErrorHandler(
ResponseFactoryInterface,
HandlerProviderNegotiator::class,
[options],
);
```
1. The first argument to the constructor must be an instance of `Psr\Http\Message\ResponseFactoryInterface`;
1. The second argument to the constructor must be an implementation of `\BitFrame\Whoops\Provider\ProviderInterface`;
1. The third argument to the constructor is an optional array of options to specify the following:
1. `catchGlobalErrors`: When set to `true` errors will be handled outside of current batch of middleware set.
1. Other options are simply method names in `Whoops\Handler\*Handler.php` and `BitFrame\Whoops\Handler\*Handler.php`. For example, to set `Whoops\Handler\JsonResponseHandler::setJsonApi()` you would pass in: `['setJsonApi' => false]`, etc.
As a shortcut, you can also use the static method `ErrorHandler::fromNegotiator($factory, $options)`. This would use the `\BitFrame\Whoops\Provider\HandlerProviderNegotiator` by default.
### How to Run the Middleware
To run the middleware, simply pass in a `BitFrame\Whoops\ErrorHandler` instance to your middleware runner / dispatcher.
For example, to handle middleware-specific errors with `BitFrame\App` (or other PSR-15 dispatchers) it would look something like this:
```php
use BitFrame\App;
use BitFrame\Emitter\SapiEmitter;
use BitFrame\Whoops\ErrorHandler;
use BitFrame\Whoops\Provider\HandlerProviderNegotiator;
use BitFrame\Factory\HttpFactory;
$app = new App();
$middleware = function () {
throw new \Exception('hello world!');
};
$app->use([
SapiEmitter::class,
new ErrorHandler(HttpFactory::getFactory(), HandlerProviderNegotiator::class, [
'addTraceToOutput' => true,
'setJsonApi' => false,
]),
$middleware,
]);
$app->run();
```
To handle global errors with `BitFrame\App` (or other PSR-15 dispatchers) it would look something like this:
```php
use BitFrame\App;
use BitFrame\Whoops\ErrorHandler;
use BitFrame\Factory\HttpFactory;
$app = new App();
$app->run([
ErrorHandler::fromNegotiator(HttpFactory::getFactory(), [
'catchGlobalErrors' => true,
'addTraceToOutput' => true,
'setJsonApi' => false,
]),
]);
throw new \Exception('hello world!');
```
### How Does It Work?
The error handler middleware automatically determines the error handler to use based on the `Accept` header. The following error handler providers are included:
1. `BitFrame\Whoops\Provider\HtmlHandlerProvider` for `Whoops\Handler\PrettyPageHandler`;
1. `BitFrame\Whoops\Provider\JsonHandlerProvider` for `Whoops\Handler\JsonResponseHandler`;
1. `BitFrame\Whoops\Provider\JsonpHandlerProvider` for `BitFrame\Whoops\Handler\JsonpResponseHandler`;
1. `BitFrame\Whoops\Provider\TextHandlerProvider` for `Whoops\Handler\PlainTextHandler`;
1. `BitFrame\Whoops\Provider\XmlHandlerProvider` for `Whoops\Handler\XmlResponseHandler`;
## Tests
To run the tests you can use the following commands:
| Command | Type |
| ---------------- |:---------------:|
| `composer test` | PHPUnit tests |
| `composer style` | CodeSniffer |
| `composer md` | MessDetector |
| `composer check` | PHPStan |
## Contributing
* File issues at https://github.com/designcise/bitframe-whoops/issues
* Issue patches to https://github.com/designcise/bitframe-whoops/pulls
## Documentation
Complete documentation for v3 will be available soon.
## License
Please see [License File](LICENSE.md) for licensing information.