Completed
Push — master ( 5bc705...727a39 )
by Alexander
12:18
created

Chain::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 3
rs 10
eloc 1
nc 1
nop 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
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
    private function wrap(MiddlewareInterface $middleware, RequestHandlerInterface $handler): RequestHandlerInterface
36
    {
37
        return new class($middleware, $handler) implements RequestHandlerInterface
38
        {
39
            private $middleware;
40
            private $handler;
41
42
            public function __construct(MiddlewareInterface $middleware, RequestHandlerInterface $handler)
43
            {
44
                $this->middleware = $middleware;
45
                $this->handler = $handler;
46
            }
47
48
            public function handle(ServerRequestInterface $request): ResponseInterface
49
            {
50
                return $this->middleware->process($request, $this->handler);
51
            }
52
        };
53
    }
54
}
55