MonologFactory::createChromePHPHandler()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chinstrap\Core\Factories;
6
7
use Chinstrap\Core\Contracts\Factories\LoggerFactory;
8
use Chinstrap\Core\Exceptions\Configuration\RootDirNotDefined;
9
use Monolog\Handler\BrowserConsoleHandler;
10
use Monolog\Handler\ChromePHPHandler;
11
use Monolog\Handler\FirePHPHandler;
12
use Monolog\Handler\HandlerInterface;
13
use Monolog\Handler\NativeMailerHandler;
14
use Monolog\Handler\SlackHandler;
15
use Monolog\Handler\StreamHandler;
16
use Monolog\Logger;
17
use Psr\Log\LoggerInterface;
18
use PublishingKit\Config\Config;
19
use PublishingKit\Utilities\Str;
20
21
final class MonologFactory implements LoggerFactory
22
{
23
    /**
24
     * @psalm-param Config<{
25
     * level: string,
26
     * logger: string,
27
     * from?: string,
28
     * to?: string,
29
     * subject?: string,
30
     * token?: string,
31
     * channel?: string,
32
     * username?: string,
33
     * attachment?: string,
34
     * emoji?: string,
35
     * path?: string
36
     * }> $config
37
     */
38
    public function make(Config $config): LoggerInterface
39
    {
40
        $log = new Logger('app');
41
        /** @var Config $configItem **/
42
        foreach ($config as $configItem) {
43
            $log->pushHandler($this->createHandler($configItem));
44
        }
45
        if (!count($config)) {
46
            $configItem = new Config([
47
                'logger' => 'stream',
48
                'path' => 'logs/site.log',
49
                'level' => 'warning',
50
            ]);
51
            $log->pushHandler($this->createHandler($configItem));
52
        }
53
        return $log;
54
    }
55
56
    private function createHandler(Config $config): HandlerInterface
57
    {
58
        switch ($config->get('logger')) {
59
            case 'browser-console':
60
                return $this->createBrowserConsoleHandler($config);
61
            case 'firephp':
62
                return $this->createFirePHPHandler($config);
63
            case 'chrome':
64
                return $this->createChromePHPHandler($config);
65
            case 'mailer':
66
                return $this->createNativeMailerHandler($config);
67
            case 'slack':
68
                return $this->createSlackHandler($config);
69
            default:
70
                return $this->createStreamHandler($config);
71
        }
72
    }
73
74
    private function createStreamHandler(Config $config): StreamHandler
75
    {
76
        $path = Str::make($config->get('path') ? (string)$config->get('path') : 'log/site.logs');
77
        if (!defined('ROOT_DIR')) {
78
            throw new RootDirNotDefined();
79
        }
80
        return new StreamHandler(ROOT_DIR . $path->path()->__toString(), $this->getLevel($config->get('level')));
81
    }
82
83
    private function createFirePHPHandler(Config $config): FirePHPHandler
84
    {
85
        return new FirePHPHandler($this->getLevel($config->get('level')));
86
    }
87
88
    private function createBrowserConsoleHandler(Config $config): BrowserConsoleHandler
89
    {
90
        return new BrowserConsoleHandler($this->getLevel($config->get('level')));
91
    }
92
93
    private function createChromePHPHandler(Config $config): ChromePHPHandler
94
    {
95
        return new ChromePHPHandler($this->getLevel($config->get('level')));
96
    }
97
98
    private function createNativeMailerHandler(Config $config): NativeMailerHandler
99
    {
100
        return new NativeMailerHandler(
101
            $config->get('to'),
102
            $config->get('subject'),
103
            $config->get('from'),
104
            $this->getLevel($config->get('level'))
105
        );
106
    }
107
108
    private function createSlackHandler(Config $config): SlackHandler
109
    {
110
        return new SlackHandler(
111
            $config->get('token'),
112
            $config->get('channel'),
113
            $config->get('username'),
114
            $config->get('attachment'),
115
            $config->get('emoji'),
116
            $this->getLevel($config->get('level'))
117
        );
118
    }
119
120
    private function getLevel(string $level = null): int
121
    {
122
        switch ($level) {
123
            case 'debug':
124
                return Logger::DEBUG;
125
            case 'info':
126
                return Logger::INFO;
127
            case 'notice':
128
                return Logger::NOTICE;
129
            case 'warning':
130
                return Logger::WARNING;
131
            case 'error':
132
                return Logger::ERROR;
133
            case 'critical':
134
                return Logger::CRITICAL;
135
            case 'alert':
136
                return Logger::ALERT;
137
            case 'emergency':
138
                return Logger::EMERGENCY;
139
            default:
140
                return Logger::WARNING;
141
        }
142
    }
143
}
144