Passed
Push — main ( 3d6ec5...ba44ab )
by Dimitri
03:04
created

ClosureDecorator::__construct()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 1
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 3
ccs 1
cts 1
cp 1
crap 2
rs 10
1
<?php
2
3
/**
4
 * This file is part of Blitz PHP framework.
5
 *
6
 * (c) 2022 Dimitri Sitchet Tomkeu <[email protected]>
7
 *
8
 * For the full copyright and license information, please view
9
 * the LICENSE file that was distributed with this source code.
10
 */
11
12
namespace BlitzPHP\Middlewares;
13
14
use BlitzPHP\Container\Services;
15
use BlitzPHP\Http\Response;
16
use BlitzPHP\Utilities\Iterable\Arr;
17
use Closure;
18
use Psr\Http\Message\ResponseInterface;
19
use Psr\Http\Message\ServerRequestInterface;
20
use Psr\Http\Server\MiddlewareInterface;
21
use Psr\Http\Server\RequestHandlerInterface;
22
use ReflectionFunction;
23
use ReflectionParameter;
24
25
/**
26
 * Décorez les closure comme middleware PSR-15.
27
 *
28
 * Décorer les closure avec les signatures suivantes:
29
 *
30
 * ```
31
 * function (
32
 *     ServerRequestInterface $request,
33
 *     RequestHandlerInterface $handler
34
 * ): ResponseInterface
35
 *
36
 * function (
37
 *     ServerRequestInterface $request,
38
 *     ResponseInterface $response,
39
 * 	   Closure $next
40
 * ): ResponseInterface
41
 * ```
42
 *
43
 * tel qu'il fonctionnera comme PSR-15 middleware.
44
 */
45
class ClosureDecorator implements MiddlewareInterface
46
{
47
    /**
48
     * Constructor
49
     */
50
    public function __construct(protected Closure $callable, protected ?Response $response = null)
51
    {
52 12
        $this->response = $response ?: Services::response();
53
    }
54
55
    /**
56
     * Exécutez le callable lors d'une request de serveur entrante.
57
     */
58
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
59
    {
60 2
        $reflector = new ReflectionFunction($this->callable);
61
62 2
        $parameters = collect($reflector->getParameters())->map(static fn (ReflectionParameter $p) => $p->getName())->all();
63
64
        if (Arr::contains($parameters, ['request', 'response', 'next'])) {
65 2
            return ($this->callable)($request, $this->response, [$handler, 'handle']);
66
        }
67
        if (Arr::contains($parameters, ['request', 'handler'])) {
68 2
            return ($this->callable)($request, $handler);
69
        }
70
71
        return $handler->handle($request);
72
    }
73
74
    /**
75
     * @internal
76
     */
77
    public function getCallable(): Closure
78
    {
79 10
        return $this->callable;
80
    }
81
}
82