From 10f0e8c661610ed071d9c0225c81f46be5f6d25c Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Thu, 25 Apr 2024 12:26:48 +0400 Subject: [PATCH] Fix failed Monolog test; add Reflection cache in LoggerInjector --- src/Bridge/Monolog/tests/LoggerTest.php | 8 ++++---- src/Logger/src/LoggerInjector.php | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Bridge/Monolog/tests/LoggerTest.php b/src/Bridge/Monolog/tests/LoggerTest.php index 5002f2dd7..6a5a44a7f 100644 --- a/src/Bridge/Monolog/tests/LoggerTest.php +++ b/src/Bridge/Monolog/tests/LoggerTest.php @@ -15,6 +15,7 @@ use Spiral\Config\ConfiguratorInterface; use Spiral\Config\LoaderInterface; use Spiral\Core\Container; +use Spiral\Logger\LogsInterface; use Spiral\Monolog\Bootloader\MonologBootloader; use Spiral\Monolog\LogFactory; @@ -39,15 +40,14 @@ public function load(string $section): array )); $this->container->bind(FinalizerInterface::class, $finalizer = new Finalizer()); - $this->container->bind(LogFactory::class, $factory = m::mock(Container\InjectorInterface::class)); $logger = m::mock(Logger::class); $logger->shouldReceive('reset')->once(); - $factory->shouldReceive('getLogger')->twice()->andReturn($logger); - $this->container->get(StrategyBasedBootloadManager::class)->bootload([MonologBootloader::class]); - $this->container->get(LoggerInterface::class); + + $this->container->bind(LogsInterface::class, $factory = m::mock(LogsInterface::class)); + $factory->shouldReceive('getLogger')->once()->andReturn($logger); $finalizer->finalize(); } diff --git a/src/Logger/src/LoggerInjector.php b/src/Logger/src/LoggerInjector.php index 0ed289209..6c68f9290 100644 --- a/src/Logger/src/LoggerInjector.php +++ b/src/Logger/src/LoggerInjector.php @@ -32,10 +32,19 @@ public function createInjection( ): LoggerInterface { $channel = \is_object($context) ? $this->extractChannelAttribute($context) : null; - // Check that null argument is available - $channel ??= (new \ReflectionMethod($this->factory, 'getLogger'))->getParameters()[0]->allowsNull() - ? null - : self::DEFAULT_CHANNEL; + if ($channel === null) { + /** + * Array of flags to check if the logger allows null argument + * + * @var array, bool> $cache + */ + static $cache = []; + + $cache[$this->factory::class] = (new \ReflectionMethod($this->factory, 'getLogger')) + ->getParameters()[0]->allowsNull(); + + $channel = $cache[$this->factory::class] ? null : self::DEFAULT_CHANNEL; + } return $this->factory->getLogger($channel); }