This repository was archived by the owner on Apr 13, 2021. It is now read-only.
forked from jicjjang/June
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathRouteExecutor.php
More file actions
51 lines (47 loc) · 1.86 KB
/
RouteExecutor.php
File metadata and controls
51 lines (47 loc) · 1.86 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
<?php
namespace Wandu\Router;
use Psr\Http\Message\ServerRequestInterface;
use Wandu\Router\Contracts\LoaderInterface;
use Wandu\Router\Contracts\ResponsifierInterface;
use Wandu\Router\Contracts\RouteInformation;
class RouteExecutor
{
/**
* @param \Wandu\Router\Contracts\LoaderInterface $loader
* @param \Wandu\Router\Contracts\ResponsifierInterface $responsifier
*/
public function __construct(LoaderInterface $loader, ResponsifierInterface $responsifier)
{
$this->loader = $loader;
$this->responsifier = $responsifier;
}
/**
* @param \Wandu\Router\Contracts\RouteInformation $route
* @param \Psr\Http\Message\ServerRequestInterface $request
* @return \Psr\Http\Message\ResponseInterface
*/
public function execute(RouteInformation $route, ServerRequestInterface $request)
{
return $this->next($request, $route->getClassName(), $route->getMethodName(), $route->getMiddlewares());
}
/**
* @param \Psr\Http\Message\ServerRequestInterface $request
* @param string $className
* @param string $methodName
* @param array $middlewares
* @return \Psr\Http\Message\ResponseInterface
*/
protected function next(ServerRequestInterface $request, $className, $methodName, array $middlewares = [])
{
if (count($middlewares)) {
$middleware = $this->loader->middleware(array_shift($middlewares), $request);
$response = $middleware->__invoke($request, function (ServerRequestInterface $request) use ($className, $methodName, $middlewares) {
return $this->next($request, $className, $methodName, $middlewares);
});
return $this->responsifier->responsify($response);
}
return $this->responsifier->responsify(
$this->loader->execute($className, $methodName, $request)
);
}
}