Skip to content

Commit 6c4f85b

Browse files
committed
Replaced AbstractProvider with ProviderInterface + Updated tests
1 parent 53487f2 commit 6c4f85b

17 files changed

+125
-110
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ new ErrorHandler(
2828
```
2929

3030
1. The first argument to the constructor must be an instance of `Psr\Http\Message\ResponseFactoryInterface`;
31-
1. The second argument to the constructor must be the name of the handler provider class (which extends `\BitFrame\Whoops\Provider\AbstractProvider`)
31+
1. The second argument to the constructor must be an implementation of `\BitFrame\Whoops\Provider\ProviderInterface`;
3232
1. The third argument to the constructor is an optional array of options to specify the following:
3333
1. `catchGlobalErrors`: When set to `true` errors will be handled outside of current batch of middleware set.
3434
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.

src/ErrorHandler.php

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Psr\Http\Message\{ResponseFactoryInterface, ServerRequestInterface, ResponseInterface};
1414
use Psr\Http\Server\{RequestHandlerInterface, MiddlewareInterface};
1515
use Whoops\{Run, RunInterface};
16-
use BitFrame\Whoops\Provider\{AbstractProvider, HandlerProviderNegotiator};
16+
use BitFrame\Whoops\Provider\{HandlerProviderNegotiator, ProviderInterface};
1717
use Throwable;
1818
use InvalidArgumentException;
1919

@@ -34,7 +34,8 @@ class ErrorHandler implements MiddlewareInterface
3434

3535
private ResponseFactoryInterface $responseFactory;
3636

37-
private string $handlerProvider;
37+
/** @var ProviderInterface|string */
38+
private $handlerProvider;
3839

3940
private array $options;
4041

@@ -51,17 +52,22 @@ public static function fromNegotiator(
5152
);
5253
}
5354

55+
/**
56+
* @param ResponseFactoryInterface $responseFactory
57+
* @param string|ProviderInterface $handlerProvider
58+
* @param array $options
59+
*/
5460
public function __construct(
5561
ResponseFactoryInterface $responseFactory,
56-
string $handlerProvider = HandlerProviderNegotiator::class,
62+
$handlerProvider = HandlerProviderNegotiator::class,
5763
array $options = []
5864
) {
5965
$this->responseFactory = $responseFactory;
6066
$this->handlerProvider = $handlerProvider;
6167

62-
if (! is_a($this->handlerProvider, AbstractProvider::class, true)) {
68+
if (! is_a($this->handlerProvider, ProviderInterface::class, true)) {
6369
throw new InvalidArgumentException(
64-
'Handler provider must be instance of ' . AbstractProvider::class
70+
'Handler provider must be instance of ' . ProviderInterface::class
6571
);
6672
}
6773

@@ -79,8 +85,10 @@ public function process(
7985
ServerRequestInterface $request,
8086
RequestHandlerInterface $handler
8187
): ResponseInterface {
82-
$handlerProvider = new $this->handlerProvider($request);
83-
$errorHandler = $handlerProvider->getHandler();
88+
$handlerProvider = ($this->handlerProvider instanceof ProviderInterface)
89+
? $this->handlerProvider
90+
: new $this->handlerProvider();
91+
$errorHandler = $handlerProvider->getHandler($request);
8492

8593
$this->applyOptions($errorHandler);
8694
$this->whoops->pushHandler($errorHandler);
@@ -98,7 +106,7 @@ public function process(
98106
$response = $handler->handle($request);
99107
} catch (Throwable $e) {
100108
$response = $this->handleException($e)
101-
->withHeader('Content-Type', $handlerProvider->getPreferredContentType());
109+
->withHeader('Content-Type', $handlerProvider->getPreferredContentType($request));
102110
}
103111

104112
if (! $this->catchGlobalErrors) {

src/Provider/AbstractProvider.php

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/Provider/HandlerProviderNegotiator.php

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
* Detect any of the supported preferred formats from an
2424
* HTTP request.
2525
*/
26-
class HandlerProviderNegotiator extends AbstractProvider
26+
class HandlerProviderNegotiator implements ProviderInterface
2727
{
2828
/** @var string */
2929
public const HTML = 'html';
@@ -48,36 +48,35 @@ class HandlerProviderNegotiator extends AbstractProvider
4848
self::XML => XmlHandlerProvider::class,
4949
];
5050

51-
private ?AbstractProvider $activeProvider = null;
51+
private ?ProviderInterface $activeProvider = null;
5252

5353
public function add(string $type, string $provider): void
5454
{
55-
if (! is_a($provider, AbstractProvider::class, true)) {
55+
if (! is_a($provider, ProviderInterface::class, true)) {
5656
throw new InvalidArgumentException(
57-
'Handler provider must be instance of ' . AbstractProvider::class
57+
'Handler provider must be instance of ' . ProviderInterface::class
5858
);
5959
}
6060

6161
$this->handlerProviders[$type] = $provider;
6262
}
6363

64-
public function getHandler(): HandlerInterface
64+
public function getHandler(ServerRequestInterface $request): HandlerInterface
6565
{
66-
return $this->getPreferredProvider()->getHandler();
66+
return $this->getPreferredProvider($request)->getHandler($request);
6767
}
6868

69-
public function getPreferredContentType(): string
69+
public function getPreferredContentType(ServerRequestInterface $request): string
7070
{
71-
return $this->getPreferredProvider()->getPreferredContentType();
71+
return $this->getPreferredProvider($request)->getPreferredContentType($request);
7272
}
7373

74-
public function getPreferredProvider(): AbstractProvider
74+
public function getPreferredProvider(ServerRequestInterface $request): ProviderInterface
7575
{
76-
if ($this->activeProvider instanceof AbstractProvider) {
76+
if ($this->activeProvider instanceof ProviderInterface) {
7777
return $this->activeProvider;
7878
}
7979

80-
$request = $this->getRequest();
8180
$acceptTypes = $request->getHeader('accept');
8281
$default = $this->handlerProviders[self::HTML];
8382

src/Provider/HtmlHandlerProvider.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@
1010

1111
namespace BitFrame\Whoops\Provider;
1212

13+
use Psr\Http\Message\ServerRequestInterface;
1314
use Whoops\Handler\{HandlerInterface, PrettyPageHandler};
1415

15-
class HtmlHandlerProvider extends AbstractProvider
16+
class HtmlHandlerProvider implements ProviderInterface
1617
{
1718
/** @var string */
1819
public const DATA_TABLE_NAME = 'Request Data';
1920

2021
/** @var string[] */
2122
public const MIMES = ['text/html', 'application/xhtml+xml'];
2223

23-
public function getHandler(): HandlerInterface
24+
public function getHandler(ServerRequestInterface $request): HandlerInterface
2425
{
25-
$request = $this->getRequest();
2626
$handler = new PrettyPageHandler();
2727

2828
$handler->addDataTable(self::DATA_TABLE_NAME, [
@@ -39,7 +39,7 @@ public function getHandler(): HandlerInterface
3939
return $handler;
4040
}
4141

42-
public function getPreferredContentType(): string
42+
public function getPreferredContentType(ServerRequestInterface $request): string
4343
{
4444
return self::MIMES[0];
4545
}

src/Provider/JsonHandlerProvider.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@
1010

1111
namespace BitFrame\Whoops\Provider;
1212

13+
use Psr\Http\Message\ServerRequestInterface;
1314
use Whoops\Handler\{HandlerInterface, JsonResponseHandler};
1415

15-
class JsonHandlerProvider extends AbstractProvider
16+
class JsonHandlerProvider implements ProviderInterface
1617
{
1718
/** @var string[] */
1819
public const MIMES = ['application/json', 'text/json', 'application/x-json'];
1920

20-
public function getHandler(): HandlerInterface
21+
public function getHandler(ServerRequestInterface $request): HandlerInterface
2122
{
2223
return new JsonResponseHandler();
2324
}
2425

25-
public function getPreferredContentType(): string
26+
public function getPreferredContentType(ServerRequestInterface $request): string
2627
{
2728
return self::MIMES[0];
2829
}

src/Provider/JsonpHandlerProvider.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@
1010

1111
namespace BitFrame\Whoops\Provider;
1212

13+
use Psr\Http\Message\ServerRequestInterface;
1314
use Whoops\Handler\HandlerInterface;
1415
use BitFrame\Whoops\Handler\JsonpResponseHandler;
1516
use RuntimeException;
1617

17-
class JsonpHandlerProvider extends AbstractProvider
18+
class JsonpHandlerProvider implements ProviderInterface
1819
{
1920
/** @var string[] */
2021
public const MIMES = ['application/javascript'];
2122

22-
public function getHandler(): HandlerInterface
23+
public function getHandler(ServerRequestInterface $request): HandlerInterface
2324
{
24-
$request = $this->getRequest();
2525
$queryParams = $request->getQueryParams();
2626
$method = $request->getMethod();
2727

@@ -34,7 +34,7 @@ public function getHandler(): HandlerInterface
3434
return new JsonpResponseHandler($queryParams['callback']);
3535
}
3636

37-
public function getPreferredContentType(): string
37+
public function getPreferredContentType(ServerRequestInterface $request): string
3838
{
3939
return self::MIMES[0];
4040
}

src/Provider/ProviderInterface.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
/**
4+
* BitFrame Framework (https://www.bitframephp.com)
5+
*
6+
* @author Daniyal Hamid
7+
* @copyright Copyright (c) 2017-2020 Daniyal Hamid (https://designcise.com)
8+
* @license https://bitframephp.com/about/license MIT License
9+
*/
10+
11+
namespace BitFrame\Whoops\Provider;
12+
13+
use Psr\Http\Message\ServerRequestInterface;
14+
use Whoops\Handler\HandlerInterface;
15+
16+
interface ProviderInterface
17+
{
18+
public function getHandler(
19+
ServerRequestInterface $request
20+
): HandlerInterface;
21+
22+
public function getPreferredContentType(
23+
ServerRequestInterface $request
24+
): string;
25+
}

src/Provider/TextHandlerProvider.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@
1010

1111
namespace BitFrame\Whoops\Provider;
1212

13+
use Psr\Http\Message\ServerRequestInterface;
1314
use Whoops\Handler\{HandlerInterface, PlainTextHandler};
1415

15-
class TextHandlerProvider extends AbstractProvider
16+
class TextHandlerProvider implements ProviderInterface
1617
{
1718
/** @var string[] */
1819
public const MIMES = ['text/plain'];
1920

20-
public function getHandler(): HandlerInterface
21+
public function getHandler(ServerRequestInterface $request): HandlerInterface
2122
{
2223
return new PlainTextHandler();
2324
}
2425

25-
public function getPreferredContentType(): string
26+
public function getPreferredContentType(ServerRequestInterface $request): string
2627
{
2728
return self::MIMES[0];
2829
}

src/Provider/XmlHandlerProvider.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@
1010

1111
namespace BitFrame\Whoops\Provider;
1212

13+
use Psr\Http\Message\ServerRequestInterface;
1314
use Whoops\Handler\{HandlerInterface, XmlResponseHandler};
1415

15-
class XmlHandlerProvider extends AbstractProvider
16+
class XmlHandlerProvider implements ProviderInterface
1617
{
1718
/** @var string[] */
1819
public const MIMES = ['text/xml', 'application/xml', 'application/x-xml'];
1920

20-
public function getHandler(): HandlerInterface
21+
public function getHandler(ServerRequestInterface $request): HandlerInterface
2122
{
2223
return new XmlResponseHandler();
2324
}
2425

25-
public function getPreferredContentType(): string
26+
public function getPreferredContentType(ServerRequestInterface $request): string
2627
{
2728
return self::MIMES[0];
2829
}

0 commit comments

Comments
 (0)