Completed
Push — master ( 9376ab...762599 )
by Alexander
14:12 queued 01:17
created

WebActionsCaller::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
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 class instance specified named as "action" parameter
13
 */
14
class WebActionsCaller implements MiddlewareInterface
15
{
16
    private $class;
17
    private $container;
18
19
    public function __construct(string $class, ContainerInterface $container)
20
    {
21
        $this->class = $class;
22
        $this->container = $container;
23
    }
24
25
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
26
    {
27
        $controller = $this->container->get($this->class);
28
        $action = $request->getAttribute('action');
29
        if ($action === null) {
30
            throw new \RuntimeException('WebActionsCaller route does not contain action attribute.');
31
        }
32
33
        if (!method_exists($controller, $action)) {
34
            return $handler->handle($request);
35
        }
36
37
        return (new Injector($this->container))->invoke([$controller, $action], [$request, $handler]);
38
    }
39
}
40