Passed
Branch cake4 (a134a5)
by n
02:31
created

ControllerFactory   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 24
c 1
b 0
f 0
dl 0
loc 65
ccs 26
cts 26
cp 1
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A create() 0 19 3
A __construct() 0 3 1
A invoke() 0 20 3
1
<?php
2
declare(strict_types=1);
3
4
namespace N1215\CakeCandle\Controller;
5
6
use Cake\Controller\Controller;
7
use Cake\Http\ServerRequest;
8
use N1215\CakeCandle\ContainerBagInterface;
9
use N1215\CakeCandle\Invoker\Exceptions\InvocationException;
10
use Psr\Container\ContainerExceptionInterface;
11
use Psr\Http\Message\ResponseInterface;
12
use Psr\Http\Message\ServerRequestInterface;
13
use ReflectionClass;
14
use ReflectionException;
15
16
/**
17
 * Factory method for building controllers for request.
18
 */
19
class ControllerFactory extends \Cake\Controller\ControllerFactory
20
{
21
    /**
22
     * @var ContainerBagInterface
23
     */
24
    private $containerBag;
25
26
    /**
27
     * @param ContainerBagInterface $containerBag
28
     */
29 8
    public function __construct(ContainerBagInterface $containerBag)
30
    {
31 8
        $this->containerBag = $containerBag;
32 8
    }
33
34
    /**
35
     * @inheritdoc
36
     * @throws ReflectionException
37
     * @throws ContainerExceptionInterface
38
     */
39 4
    public function create(ServerRequestInterface $request): Controller
40
    {
41 4
        assert($request instanceof ServerRequest);
42 4
        $className = $this->getControllerClass($request);
43 4
        if (!$className) {
44 1
            $this->missingController($request);
45
        }
46
47 3
        $reflection = new ReflectionClass($className);
48 3
        if ($reflection->isAbstract()) {
49 1
            $this->missingController($request);
50
        }
51
52
        /** @var Controller $controller */
53 2
        $controller = $this->containerBag->get($className);
54
55 1
        $controller->setRequest($request);
56
57 1
        return $controller;
58
    }
59
60
    /**
61
     * @inheritDoc
62
     * @throws InvocationException
63
     */
64 4
    public function invoke($controller): ResponseInterface
65
    {
66 4
        $result = $controller->startupProcess();
67 4
        if ($result instanceof ResponseInterface) {
68 1
            return $result;
69
        }
70
71 3
        $action = $controller->getAction();
72 2
        $args = array_values($controller->getRequest()->getParam('pass'));
73
74 2
        $args = $this->containerBag->complement($action, $args);
75
76 2
        $controller->invokeAction($action, $args);
77
78 2
        $result = $controller->shutdownProcess();
79 2
        if ($result instanceof ResponseInterface) {
80 1
            return $result;
81
        }
82
83 1
        return $controller->getResponse();
84
    }
85
}
86