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

AbstractController::render()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
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 5
rs 10
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