-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathDispatchHandler.php
More file actions
99 lines (85 loc) · 2.35 KB
/
DispatchHandler.php
File metadata and controls
99 lines (85 loc) · 2.35 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
namespace Equip\Handler;
use Equip\Directory;
use Equip\Exception\HttpException;
use Equip\Handler\ActionHandler;
use FastRoute;
use FastRoute\Dispatcher;
use FastRoute\RouteCollector;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class DispatchHandler
{
/**
* @var Directory
*/
private $directory;
/**
* @param Directory $directory
*/
public function __construct(Directory $directory)
{
$this->directory = $directory;
}
/**
* @inheritDoc
*/
public function __invoke(
ServerRequestInterface $request,
ResponseInterface $response,
callable $next
) {
/**
* @var $action Equip\Action
*/
list($action, $args) = $this->dispatch(
$this->dispatcher(),
$request->getMethod(),
$request->getUri()->getPath()
);
$request = $request->withAttribute(ActionHandler::ACTION_ATTRIBUTE, $action);
foreach ($args as $key => $value) {
$request = $request->withAttribute($key, $value);
}
return $next($request, $response);
}
/**
* @return Dispatcher
*/
protected function dispatcher()
{
return FastRoute\simpleDispatcher(function (RouteCollector $collector) {
foreach ($this->directory as $request => $action) {
list($method, $path) = explode(' ', $request, 2);
$collector->addRoute(
$method,
$this->directory->prefix($path),
$action
);
}
});
}
/**
* @throws HttpNotFound
* @throws HttpMethodNotAllowed
*
* @param Dispatcher $dispatcher
* @param string $method
* @param string $path
*
* @return array [Action, $arguments]
*/
private function dispatch(Dispatcher $dispatcher, $method, $path)
{
$route = $dispatcher->dispatch($method, $path);
$status = array_shift($route);
if (Dispatcher::FOUND === $status) {
return $route;
}
if (Dispatcher::METHOD_NOT_ALLOWED === $status) {
$allowed = array_shift($route);
throw HttpException::methodNotAllowed($path, $method, $allowed);
}
throw HttpException::notFound($path);
}
}