Logger::log()   C
last analyzed

Complexity

Conditions 8
Paths 11

Size

Total Lines 29
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 19
nc 11
nop 2
dl 0
loc 29
rs 5.3846
c 0
b 0
f 0
1
<?php
2
/**
3
 * Webino™ (http://webino.sk)
4
 *
5
 * @link        https://github.com/webino for the canonical source repository
6
 * @copyright   Copyright (c) 2015-2017 Webino, s.r.o. (http://webino.sk)
7
 * @author      Peter Bačinský <[email protected]>
8
 * @license     BSD-3-Clause
9
 */
10
11
namespace WebinoLogLib;
12
13
use WebinoLogLib\Exception;
14
use WebinoLogLib\Message\MessageInterface;
15
use Zend\Stdlib\Parameters;
16
17
/**
18
 * Class Logger
19
 */
20
class Logger implements LoggerInterface
21
{
22
    /**
23
     * @var PsrLogger
24
     */
25
    private $engine;
26
27
    /**
28
     * @var MessageInterface[]
29
     */
30
    private $messages = [];
31
32
    /**
33
     * @param PsrLogger $engine
34
     */
35
    public function __construct(PsrLogger $engine)
36
    {
37
        $this->engine = $engine;
38
    }
39
40
    /**
41
     * {@inheritdoc}
42
     */
43
    public function log($level = null, ...$args)
44
    {
45
        if (null === $level) {
46
            return $this->engine;
47
        }
48
49
        $fromClass = ($level instanceof MessageInterface) ? $level : $this->messageFromClass($level);
50
        if ($fromClass) {
51
            $_level  = $fromClass->getLevel();
52
            $_args   = new Parameters(isset($args[0]) ? $args[0] : []);
53
            $message = $fromClass->getMessage($_args);
54
55
        } else {
56
            $_level = $level;
57
            if (empty($args[0])) {
58
                throw new Exception\InvalidArgumentException('Expected a log message but empty');
59
            }
60
            $message = $args[0];
61
            $_args   = new Parameters(isset($args[1]) ? $args[1] : []);
62
        }
63
64
        try {
65
            $this->engine->log($_level, (string) $message, $_args->toArray());
66
        } catch (\Exception $exc) {
67
            throw new Exception\DomainException('Unable to write log', null, $exc);
68
        }
69
70
        return $this->engine;
71
    }
72
73
    /**
74
     * @param string $className Concrete MessageInterface class class name.
75
     * @return null|MessageInterface
76
     */
77
    private function messageFromClass($className)
78
    {
79
        if (isset($this->messages[$className])) {
80
            // return cached
81
            return $this->messages[$className];
82
        }
83
84
        if (class_exists($className)) {
85
            // create a log message
86
            $message = new $className;
87
            if ($message instanceof MessageInterface) {
88
                $this->messages[$className] = $message;
89
                return $message;
90
            }
91
92
            throw (new Exception\InvalidArgumentException('Expected class to be type of %s but got %s'))
93
                ->format(MessageInterface::class, $message);
94
        }
95
96
        return null;
97
    }
98
}
99