LayoutMiddleware   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 15
eloc 37
c 3
b 0
f 0
dl 0
loc 89
ccs 0
cts 47
cp 0
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
C process() 0 44 13
A getResponseWithBodyAndStatus() 0 7 1
A __construct() 0 5 1
1
<?php
2
3
namespace Bone\View\Middleware;
4
5
use Bone\Http\Response;
6
use Bone\Http\Response\LayoutResponse;
7
use Bone\Server\SiteConfig;
8
use Bone\View\ViewEngineInterface;
9
use Bone\Http\Response\HtmlResponse;
10
use Laminas\Diactoros\Stream;
11
use Psr\Http\Message\ResponseInterface;
12
use Psr\Http\Message\ServerRequestInterface;
13
use Psr\Http\Server\MiddlewareInterface;
14
use Psr\Http\Server\RequestHandlerInterface;
15
16
class LayoutMiddleware implements MiddlewareInterface
17
{
18
    /** @var ViewEngineInterface $viewEngine */
19
    private $viewEngine;
20
21
    /** @var string $defaultLayout \ */
22
    private $defaultLayout;
23
24
    /** @var SiteConfig $config \ */
25
    private $config;
26
27
    /**
28
     * LayoutMiddleware constructor.
29
     * @param ViewEngineInterface $viewEngine
30
     * @param string $defaultLayout
31
     * @param SiteConfig $config
32
     */
33
    public function __construct(ViewEngineInterface $viewEngine, string $defaultLayout, SiteConfig $config)
34
    {
35
        $this->viewEngine = $viewEngine;
36
        $this->defaultLayout = $defaultLayout;
37
        $this->config = $config;
38
    }
39
40
    /**
41
     * @param ServerRequestInterface $request
42
     * @param RequestHandlerInterface $handler
43
     * @return ResponseInterface
44
     */
45
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
46
    {
47
        $response = $handler->handle($request);
48
        $layout = $this->defaultLayout;
49
50
        if ($response instanceof LayoutResponse) {
51
            $layout = $response->getLayout();
52
            $layout = $layout === 'none' ? false : $layout;
53
        } elseif ($response->hasHeader('layout')) {
54
            $layout = $response->getHeader('layout')[0];
55
            $layout = $layout === 'none' ? false : $layout;
56
            $response = $response->withoutHeader('header');
57
        }
58
59
        $contentType = $response->getHeader('Content-Type');
60
        $isHtmlResponse = $response instanceof HtmlResponse || get_class($response) === 'Laminas\Diactoros\Response\HtmlResponse';
61
        $hasHtmlContent = count($contentType) ? strstr($contentType[0], 'text/html') : true;
62
63
        if ((!$isHtmlResponse || !$hasHtmlContent || !$layout)) {
64
            return $response;
65
        }
66
67
        $body = [
68
            'content' => $response->getBody()->getContents(),
69
            'config' => $this->config,
70
            'user' => null,
71
            'vars' => [],
72
        ];
73
74
        if ($response instanceof Response) {
75
76
            if ($response->hasAttribute('user')) {
77
                $body['user'] = $response->getAttribute('user');
78
            }
79
80
            if ($response->hasAttribute('vars')) {
81
                $body['vars'] = $response->getAttribute('vars');
82
            }
83
84
        }
85
86
        $body = $this->viewEngine->render($layout, $body);
87
88
        return $this->getResponseWithBodyAndStatus($response, $body, $response->getStatusCode());
89
    }
90
91
92
    /**
93
     * @param ResponseInterface $response
94
     * @param string $body
95
     * @param int $status
96
     * @return ResponseInterface
97
     */
98
    private function getResponseWithBodyAndStatus(ResponseInterface $response, string $body, int $status = 200): ResponseInterface
99
    {
100
        $stream = new Stream('php://memory', 'r+');
101
        $stream->write($body);
102
        $response = $response->withStatus($status)->withBody($stream);
103
104
        return $response;
105
    }
106
}