Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
ContainerLogger
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
2 / 2
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 log
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
4
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray;
6
7use Celema\Container\Container;
8use Override;
9use Psr\Log\AbstractLogger;
10use Psr\Log\LoggerInterface as Logger;
11use Stringable;
12
13/**
14 * Hands records to the logger registered in the container when they are
15 * written, so the error handler, created before the application registers
16 * its logger, still uses it.
17 *
18 * @internal
19 */
20final class ContainerLogger extends AbstractLogger
21{
22    private ?ErrorLog $fallback = null;
23
24    public function __construct(
25        private Container $container,
26    ) {}
27
28    /** @param array<string, mixed> $context */
29    #[Override]
30    public function log(mixed $level, string|Stringable $message, array $context = []): void
31    {
32        $logger = $this->container->has(Logger::class) ? $this->container->get(Logger::class) : null;
33
34        if (!$logger instanceof Logger || $logger === $this) {
35            $this->fallback ??= new ErrorLog();
36            $logger = $this->fallback;
37        }
38
39        $logger->log($level, $message, $context);
40    }
41}