Repository navigation
Expand file tree
/
Copy pathApplication.php
More file actions
63 lines (52 loc) · 1.93 KB
/
Copy pathApplication.php
File metadata and controls
63 lines (52 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
declare(strict_types=1);
namespace Chubbyphp\Framework;
use Chubbyphp\Framework\Emitter\Emitter;
use Chubbyphp\Framework\Emitter\EmitterInterface;
use Chubbyphp\Framework\Middleware\MiddlewareDispatcher;
use Chubbyphp\Framework\Middleware\MiddlewareDispatcherInterface;
use Chubbyphp\Framework\RequestHandler\RouteRequestHandler;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
final class Application implements RequestHandlerInterface
{
/**
* @var array<MiddlewareInterface>
*/
private array $middlewares;
private MiddlewareDispatcherInterface $middlewareDispatcher;
private RequestHandlerInterface $requestHandler;
private EmitterInterface $emitter;
/**
* @param array<MiddlewareInterface> $middlewares
*/
public function __construct(
array $middlewares,
?MiddlewareDispatcherInterface $middlewareDispatcher = null,
?RequestHandlerInterface $requestHandler = null,
?EmitterInterface $emitter = null
) {
$this->middlewares = (new Collection($middlewares, [MiddlewareInterface::class]))->toArray();
$this->middlewareDispatcher = $middlewareDispatcher ?? new MiddlewareDispatcher();
$this->requestHandler = $requestHandler ?? new RouteRequestHandler($this->middlewareDispatcher);
$this->emitter = $emitter ?? new Emitter();
}
public function __invoke(ServerRequestInterface $request): ResponseInterface
{
return $this->handle($request);
}
public function handle(ServerRequestInterface $request): ResponseInterface
{
return $this->middlewareDispatcher->dispatch(
$this->middlewares,
$this->requestHandler,
$request
);
}
public function emit(ResponseInterface $response): void
{
$this->emitter->emit($response);
}
}