Passed
Pull Request — master (#56)
by Evgeniy
02:00
created

Message   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 20
dl 0
loc 106
ccs 23
cts 23
cp 1
rs 10
c 1
b 0
f 0
wmc 9

5 Methods

Rating   Name   Duplication   Size   Complexity  
A message() 0 3 1
A parse() 0 16 4
A context() 0 7 2
A level() 0 3 1
A __construct() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Log;
6
7
use Psr\Log\InvalidArgumentException;
8
use Psr\Log\LoggerTrait;
9
use Psr\Log\LogLevel;
10
use Yiisoft\VarDumper\VarDumper;
11
12
use function is_scalar;
13
use function method_exists;
14
use function preg_replace_callback;
15
16
/**
17
 * Message is a data object that stores log message data.
18
 */
19
final class Message
20
{
21
    /**
22
     * @var string Log message level.
23
     *
24
     * @see LogLevel See constants for valid level names.
25
     */
26
    private string $level;
27
28
    /**
29
     * @var string Log message.
30
     */
31
    private string $message;
32
33
    /**
34
     * @var array Log message context.
35
     *
36
     * Message context has a following keys:
37
     *
38
     * - category: string, message category.
39
     * - memory: int, memory usage in bytes, obtained by `memory_get_usage()`.
40
     * - time: float, message timestamp obtained by microtime(true).
41
     * - trace: array, debug backtrace, contains the application code call stacks.
42
     */
43
    private array $context;
44
45
    /**
46
     * @param mixed $level Log message level.
47
     * @param mixed $message Log message.
48
     * @param array $context Log message context.
49
     *
50
     * @throws InvalidArgumentException for invalid log message level.
51
     *
52
     * @see LoggerTrait::log()
53
     * @see LogLevel
54
     */
55 139
    public function __construct($level, $message, array $context = [])
56
    {
57 139
        $this->level = Logger::level($level);
58 138
        $this->message = $this->parse($message, $context);
59 138
        $this->context = $context;
60 138
    }
61
62
    /**
63
     * Gets a log message level.
64
     *
65
     * @return string Log message level.
66
     */
67 92
    public function level(): string
68
    {
69 92
        return $this->level;
70
    }
71
72
    /**
73
     * Gets a log message.
74
     *
75
     * @return string Log message.
76
     */
77 101
    public function message(): string
78
    {
79 101
        return $this->message;
80
    }
81
82
    /**
83
     * Returns a value of the context parameter for the specified name.
84
     *
85
     * If no name is specified, the entire context is returned.
86
     *
87
     * @param string|null $name The context parameter name.
88
     * @param mixed $default If the context parameter does not exist, the `$default` will be returned.
89
     * @return mixed The context parameter value.
90
     */
91 116
    public function context(string $name = null, $default = null)
92
    {
93 116
        if ($name === null) {
94 49
            return $this->context;
95
        }
96
97 115
        return $this->context[$name] ?? $default;
98
    }
99
100
    /**
101
     * Parses log message resolving placeholders in the form: "{foo}",
102
     * where foo will be replaced by the context data in key "foo".
103
     *
104
     * @param mixed $message Raw log message.
105
     * @param array $context Message context.
106
     *
107
     * @return string Parsed message.
108
     */
109 138
    private function parse($message, array $context): string
110
    {
111 138
        $message = (is_scalar($message) || method_exists($message, '__toString'))
112 136
            ? (string) $message
113 138
            : VarDumper::create($message)->export()
114
        ;
115
116 138
        return preg_replace_callback('/{([\w.]+)}/', static function (array $matches) use ($context) {
117 5
            $placeholderName = $matches[1];
118
119 5
            if (isset($context[$placeholderName])) {
120 2
                return (string) $context[$placeholderName];
121
            }
122
123 3
            return $matches[0];
124 138
        }, $message);
125
    }
126
}
127