Viewer::process()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 7
c 1
b 0
f 1
dl 0
loc 15
rs 10
cc 3
nc 3
nop 2
1
<?php
2
3
namespace HnrAzevedo\Viewer;
4
5
use Psr\Http\Message\ServerRequestInterface;
6
use Psr\Http\Message\ResponseInterface;
7
use Psr\Http\Server\RequestHandlerInterface;
8
use HnrAzevedo\Http\Uri;
9
10
use HnrAzevedo\Http\Factory;
11
12
final class Viewer implements ViewerInterface
13
{
14
    use Helper;
15
16
    private static Viewer $instance;
17
    private static string $path = '';
18
    private bool $middleware;
19
20
    public static function getInstance(): Viewer
21
    {
22
        self::$instance = (isset(self::$instance)) ? self::$instance : new self();
23
        return self::$instance;
24
    }
25
26
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
27
    {
28
        if(null === $request->getAttribute('viewer')){
29
            throw new \RuntimeException('The path and file parameters for viewing were not defined in the request');
30
        }
31
32
        self::$path = $request->getAttribute('viewer')['path'];
33
34
        $data = (isset($request->getAttribute('viewer')['data'])) ? $request->getAttribute('viewer')['data'] : [];
35
36
        $buffer = $this->getInstance()->render($request->getAttribute('viewer')['file'], $data, true);
37
38
        $request = $request->withBody((new Factory())->createStream($buffer));
39
40
        return $handler->handle($request);
41
    }
42
43
    public static function render(string $file, ?array $data = [], ?bool $return = false): string
44
    {
45
        self::getInstance()->data = $data;
46
47
        if(!isset(self::$middleware) && $return === false){
48
            self::getInstance()->handle($file);
49
            return '';
50
        }
51
52
        return self::getInstance()->getBody($file.'.view.php');
53
    }
54
55
    private function handle(string $file): void
56
    {
57
        self::getInstance()->middleware  = false;
58
        
59
        $serverRequest = (new Factory())->createServerRequest(
60
            $_SERVER['REQUEST_METHOD'], 
61
            new Uri($_SERVER['REQUEST_URI'])
62
        );
63
    
64
        $serverRequest = $serverRequest->withAttribute('viewer',[
65
            'path' => self::$path,
66
            'file' => $file,
67
            'data' => self::getInstance()->data
68
        ]);
69
70
        self::getInstance()->process($serverRequest, new class implements RequestHandlerInterface{
71
            public function handle(ServerRequestInterface $request): ResponseInterface
72
            {
73
                echo $request->getBody()->getContents();
74
                return (new Factory())->createResponse(200);
75
            }
76
        });
77
78
    }
79
80
    public static function path(string $path): Viewer
81
    {
82
        self::$path = $path;
83
        unset(self::getInstance()->middleware);
84
        return self::getInstance();
85
    }
86
87
    public static function import(string $file): void
88
    {
89
        try{
90
            echo self::getInstance()->getBody($file.'.inc.php');
91
        }catch(\Exception $er){
92
            echo "<div class='view error'>Component error: {$er->getMessage()}</div>";
93
        }
94
    }
95
96
    private function getBody(string $file)
97
    {
98
        $buffer = $this->getInstance()->getOB(self::$path . DIRECTORY_SEPARATOR . $file);
99
        $buffer = $this->getInstance()->getVars($buffer);
100
        $buffer = $this->getInstance()->getVars($buffer, false);
101
        $buffer = $this->getInstance()->removeComments($buffer);
102
        return $buffer;
103
    }
104
105
}
106