Completed
Push — master ( 1cedc6...be7e90 )
by Anton
03:25
created

LoggerTrait   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 67
rs 10
c 0
b 0
f 0
wmc 7
lcom 1
cbo 2

5 Methods

Rating   Name   Duplication   Size   Complexity  
A setLogger() 0 4 1
A getLogger() 0 4 1
A logger() 0 9 2
iocContainer() 0 1 ?
A createLogger() 0 10 3
1
<?php
2
/**
3
 * Spiral Framework.
4
 *
5
 * @license   MIT
6
 * @author    Anton Titov (Wolfy-J)
7
 */
8
9
namespace Spiral\Debug\Traits;
10
11
use Interop\Container\ContainerInterface;
12
use Psr\Log\LoggerInterface;
13
use Psr\Log\NullLogger;
14
use Spiral\Debug\LogsInterface;
15
16
/**
17
 * On demand logger creation. Allows class to share same logger between instances. Logger trait work
18
 * thought IoC scope!
19
 */
20
trait LoggerTrait
21
{
22
    /**
23
     * Private and null.
24
     *
25
     * @internal
26
     *
27
     * @var LoggerInterface|null
28
     */
29
    private $logger = null;
30
31
    /**
32
     * Sets a logger.
33
     *
34
     * @param LoggerInterface $logger
35
     */
36
    public function setLogger(LoggerInterface $logger)
37
    {
38
        $this->logger = $logger;
39
    }
40
41
    /**
42
     * Alias for "logger" function.
43
     *
44
     * @return LoggerInterface
45
     */
46
    protected function getLogger(): LoggerInterface
47
    {
48
        return $this->logger();
49
    }
50
51
    /**
52
     * Get associated or create new instance of LoggerInterface.
53
     *
54
     * @return LoggerInterface
55
     */
56
    protected function logger(): LoggerInterface
57
    {
58
        if (!empty($this->logger)) {
59
            return $this->logger;
60
        }
61
62
        //We are using class name as log channel (name) by default
63
        return $this->logger = $this->createLogger();
64
    }
65
66
    /**
67
     * @return ContainerInterface
68
     */
69
    abstract protected function iocContainer();
70
71
    /**
72
     * Create new instance of associated logger (on demand creation).
73
     *
74
     * @return LoggerInterface
75
     */
76
    private function createLogger(): LoggerInterface
77
    {
78
        $container = $this->iocContainer();
79
        if (empty($container) || !$container->has(LogsInterface::class)) {
80
            return new NullLogger();
81
        }
82
83
        //We are using class name as log channel (name) by default
84
        return $container->get(LogsInterface::class)->getLogger(static::class);
85
    }
86
}
87