Passed
Push — master ( d21aeb...6f7326 )
by Alexander
27:36 queued 12:36
created

AbstractController   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 7
eloc 24
c 1
b 0
f 0
dl 0
loc 64
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A findLayoutFile() 0 7 2
A renderContent() 0 19 2
A __construct() 0 9 1
A getViewPath() 0 3 1
A render() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Controller;
6
7
use Psr\Http\Message\ResponseInterface;
8
use Yiisoft\Aliases\Aliases;
9
use Yiisoft\View\ViewContextInterface;
10
use Yiisoft\View\WebView;
11
use Yiisoft\Yii\Web\Data\DataResponseFactoryInterface;
12
13
use function is_file;
14
use function pathinfo;
15
16
abstract class AbstractController implements ViewContextInterface
17
{
18
    private string $layout;
19
    private WebView $view;
20
    protected Aliases $aliases;
21
    protected DataResponseFactoryInterface $responseFactory;
22
23
    public function __construct(
24
        DataResponseFactoryInterface $responseFactory,
25
        Aliases $aliases,
26
        WebView $view
27
    ) {
28
        $this->responseFactory = $responseFactory;
29
        $this->aliases = $aliases;
30
        $this->view = $view;
31
        $this->layout = $aliases->get('@resources/layout') . '/main';
32
    }
33
34
    protected function render(string $view, array $parameters = []): ResponseInterface
35
    {
36
        $contentRenderer = fn () => $this->renderContent($view, $parameters);
37
38
        return $this->responseFactory->createResponse($contentRenderer);
39
    }
40
41
    private function renderContent(string $view, array $parameters = []): string
42
    {
43
        $content = $this->view->render($view, $parameters, $this);
44
        $layout = $this->findLayoutFile($this->layout);
45
46
        if (is_file($layout)) {
47
            return $this->view->renderFile(
48
                $layout,
49
                array_merge(
50
                    [
51
                        'content' => $content
52
                    ],
53
                    $parameters
54
                ),
55
                $this
56
            );
57
        }
58
59
        return $content;
60
    }
61
62
    public function getViewPath(): string
63
    {
64
        return $this->aliases->get('@views') . '/' . $this->name();
65
    }
66
67
    private function findLayoutFile(string $file): string
68
    {
69
        if (pathinfo($file, PATHINFO_EXTENSION) !== '') {
70
            return $file;
71
        }
72
73
        return $file . '.' . $this->view->getDefaultExtension();
74
    }
75
76
    /**
77
     * Returns the name of the controller.
78
     */
79
    abstract protected function name(): string;
80
}
81