Completed
Pull Request — master (#138)
by Zhukov
02:33
created

Chain.php$0 ➔ wrap()   A

Complexity

Conditions 1

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1.064

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 15
ccs 3
cts 5
cp 0.6
crap 1.064
rs 9.7666

2 Methods

Rating   Name   Duplication   Size   Complexity  
A Chain.php$0 ➔ __construct() 0 4 1
A Chain.php$0 ➔ handle() 0 3 1
1
<?php
2
namespace Yiisoft\Yii\Web\Middleware;
3
4
use Psr\Http\Server\MiddlewareInterface;
5
use Psr\Http\Server\RequestHandlerInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Psr\Http\Message\ResponseInterface;
8
9
/**
10
 * Chain executes middlewares in the order they are added to constructor.
11
 *
12
 * Use if you need to execute middlewares before or after the middleware
13
 * you already have.
14
 */
15
final class Chain implements MiddlewareInterface
16
{
17
    private $middlewares;
18
19
    public function __construct(MiddlewareInterface ...$middlewares)
20
    {
21
        $this->middlewares = $middlewares;
22
    }
23
24
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
25
    {
26
        for ($i = count($this->middlewares) - 1; $i > 0; $i--) {
27
            $handler = $this->wrap($this->middlewares[$i], $handler);
28
        }
29
        return $this->middlewares[0]->process($request, $handler);
30
    }
31
32
    /**
33
     * Wraps handler by middlewares
34
     */
35 1
    private function wrap(MiddlewareInterface $middleware, RequestHandlerInterface $handler): RequestHandlerInterface
36
    {
37
        return new class($middleware, $handler) implements RequestHandlerInterface {
38
            private $middleware;
39
            private $handler;
40
41
            public function __construct(MiddlewareInterface $middleware, RequestHandlerInterface $handler)
42
            {
43 1
                $this->middleware = $middleware;
44 1
                $this->handler = $handler;
45
            }
46
47
            public function handle(ServerRequestInterface $request): ResponseInterface
48
            {
49
                return $this->middleware->process($request, $this->handler);
50
            }
51
        };
52
    }
53
}
54