Conditional   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 17
dl 0
loc 64
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
createMiddlewareFromClosure() 0 13 ?
A hp$0 ➔ __construct() 0 3 1
A hp$0 ➔ process() 0 3 1
A process() 0 15 3
A hp$0 ➔ createMiddlewareFromClosure() 0 13 1
A __construct() 0 6 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace Zakirullin\Middlewares;
5
6
use Closure;
7
use Psr\Http\Server\MiddlewareInterface;
8
use Psr\Http\Server\RequestHandlerInterface;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
class Conditional implements MiddlewareInterface
13
{
14
    /**
15
     * @var callable
16
     */
17
    protected $shouldUseCallback;
18
19
    /**
20
     * @var callable
21
     */
22
    protected $getMiddlewareCallback;
23
24
    /**
25
     * @param callable $shouldUseCallback
26
     * @param callable $getMiddlewareCallback
27
     */
28
    public function __construct(
29
        callable $shouldUseCallback,
30
        callable $getMiddlewareCallback
31
    ) {
32
        $this->shouldUseCallback = $shouldUseCallback;
33
        $this->getMiddlewareCallback = $getMiddlewareCallback;
34
    }
35
36
    /**
37
     * @param ServerRequestInterface $request
38
     * @param RequestHandlerInterface $handler
39
     * @return ResponseInterface
40
     */
41
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
42
    {
43
        $shouldUse = call_user_func($this->shouldUseCallback, $request);
44
        if ($shouldUse) {
45
            /**
46
             * @var MiddlewareInterface $middleware
47
             */
48
            $middleware = call_user_func($this->getMiddlewareCallback);
49
            if ($middleware instanceof Closure) {
50
                $middleware = $this->createMiddlewareFromClosure($middleware);
51
            }
52
53
            return $middleware->process($request, $handler);
54
        } else {
55
            return $handler->handle($request);
56
        }
57
    }
58
59
    /**
60
     * @param Closure $handler
61
     * @return MiddlewareInterface
62
     */
63
    protected function createMiddlewareFromClosure(Closure $handler): MiddlewareInterface
64
    {
65
        return new class($handler) implements MiddlewareInterface {
66
            private $handler;
67
68
            public function __construct(Closure $handler)
69
            {
70
                $this->handler = $handler;
71
            }
72
73
            public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
74
            {
75
                return call_user_func($this->handler, $request, $next);
76
            }
77
        };
78
    }
79
}