Passed
Pull Request — master (#137)
by Zhukov
03:58
created

WebActionsCaller::process()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 7
c 1
b 0
f 0
nc 3
nop 2
dl 0
loc 13
rs 10
ccs 8
cts 8
cp 1
crap 3
1
<?php
2
namespace Yiisoft\Yii\Web\Middleware;
3
4
use Psr\Container\ContainerInterface;
5
use Psr\Http\Message\ResponseInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Psr\Http\Server\MiddlewareInterface;
8
use Psr\Http\Server\RequestHandlerInterface;
9
use Yiisoft\Injector\Injector;
10
11
/**
12
 * WebActionsCaller maps a route like /post/{action} to methods of
13
 * a class instance specified named as "action" parameter.
14
 *
15
 * Dependencies are automatically injected into both method
16
 * and constructor based on types specified.
17
 *
18
 * ```php
19
 * Route::anyMethod('/test/{action:\w+}')->to(new WebActionsCaller(TestController::class, $container)),
20
 * ```
21
 */
22
final class WebActionsCaller implements MiddlewareInterface
23
{
24
    private $class;
25
    private $container;
26
27 3
    public function __construct(string $class, ContainerInterface $container)
28
    {
29 3
        $this->class = $class;
30 3
        $this->container = $container;
31
    }
32
33 3
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
34
    {
35 3
        $controller = $this->container->get($this->class);
36 3
        $action = $request->getAttribute('action');
37 3
        if ($action === null) {
38 1
            throw new \RuntimeException('WebActionsCaller route does not contain action attribute.');
39
        }
40
41 2
        if (!method_exists($controller, $action)) {
42 1
            return $handler->handle($request);
43
        }
44
45 1
        return (new Injector($this->container))->invoke([$controller, $action], [$request, $handler]);
46
    }
47
}
48